最初发布于gdelgado.ca

在这篇文章中,我描述了我如何更新我的Pelican博客设置。

不久前,对我网站的 HTTP 请求由于某种原因停止工作。这是我的 CDN (cloudflare) 的错误。对我来说,这是来自众神的信号,表明是时候做一些不必要的复杂事情来解决问题了。

说真的;有些事情我想解决很长一段时间,但我一直没有去做。当前的 CDN 问题 + 一个长周末似乎是这样做的合适时机。

tldr:

  • 创建了一个自定义 docker 映像与(sass + python 和所有鹈鹕依赖)

  • Dockerized 整个项目使用上述docker镜像

  • 设置自动部署(使用CircleCI)将博客部署到Netlify

依赖地狱

关于 Pelican 博客为本地开发而设置的方式,有些事情困扰着我。pelican docs建议您安装Virtualenv。在我决定想要更好的 CSS 开发人员体验之前,这一直很好。我为我的 CSS 切换到 SASS,但这意味着我必须安装 ruby,因为它是一个 ruby gem。

好的,现在我已经全局安装了 python、virtualenv 和 Ruby,以便我可以在本地运行博客。这也使自动化部署变得复杂,因为您必须安装这些依赖项以确保构建博客成功。

Docker 救援

我真的不喜欢全局安装依赖项。所以我认为这将是一个玩弄 Docker 的有趣机会。

我将为您省去我的 docker 设置的所有中间版本,并获取您当前在 repo 中看到的内容。

与 docker 相关的文件有 3 个:

  • Dockerfile-push

  • Dockerfile

  • docker-compose.yml

Dockerfile-push包含创建可重用图像的说明(我在 CI 过程中重用此图像。稍后会详细介绍)。该图像位于https://hub.docker.com/r/giorgio14/pelican/... 我知道,图像相当大。所以呢?告我。

现在我有了一个基础镜像来运行 pelican 及其所有依赖项,我可以从中创建一个运行开发服务器的新镜像。这就是Dockerfile的用武之地。在其中我:

  • 创建一个图像FROM我的自定义 giorgio14/pelican 图像

  • COPY将相关文件和目录放入镜像

  • 将我的操作系统的8080端口绑定到容器的8080端口

  • 运行make脚本,该脚本在端口 8080 上运行实时重新加载服务器

只有一个问题。如果我要从此图像创建一个容器,该容器会创建我的文件的副本,但它不会链接回它们。换句话说;该容器有自己的副本,这些副本与我的操作系统上的副本完全无关。这意味着尽管有一个实时重新加载服务器来监听文件更改,但容器内的文件实际上不会更改。

我们需要卷。这是一种允许容器访问主机操作系统文件和目录的机制。我使用卷,以便我可以编辑themecontent目录中的任何内容,并将这些更改传播到正在运行的 docker 容器。一旦容器内发生更改,则在容器内运行的 python 服务器可以重新生成博客并提供更新的文件。

为此,我使用docker-compose.yml文件。其中有一个volumes键,描述了我想将哪些本地目录挂载到正在运行的容器上。

现在这一切都完成了,我可以简单地运行:

docker-compose up

进入全屏模式 退出全屏模式

码头工人将:

  • 拉取并生成所需的图像

  • 在容器内运行make devserver PORT=8080(来自Dockerfile)

现在我有一个不需要 python、virtualenv、ruby 或任何东西的 schnazzy 开发设置 :) ... 只有 Docker!

自动部署

现在我在 hub.docker.com 上托管了一个可重用的 docker 映像,我可以利用它来使我的 CI 步骤变得超级简单。

我的目标是让我的网站在每次新推送到我的 repo 上的 master 分支时进行更新。我选择 CircleCI 是因为它的品牌、优秀的文档(我花了不到一天的时间来弄清楚如何使用它)和免费定价 🙃。

我基本上只是按照文档将我的 github 存储库连接到 circle 并在此后不久运行“hello world”管道。

这里是与圆相关的相关文件。我花了一些尝试和调整来让管道按我的意愿运行,所以我创建了一个 bash 脚本,它允许我运行管道而无需将提交推送到 github。这里是来自圈子的相关文档。

我将提到一些关于config.yml文件的高级要点。请注意,我使用上面制作的自定义图像。无需安装 ruby,执行 apt-get 或其他任何操作。一切都准备好安装pelicancli。

由于我想部署到 netlify,我必须安装他们的 cli。我选择了他们当前的稳定 cli(这里是 repo)而不是他们基于节点的cli,因为我已经熟悉它了。

然后我使用make publish生成博客的生产版本。

为了将来的调试,我想我会保存make publish命令的输出,以防发生奇怪的事情。如果需要,Circle 的 UI 允许我访问压缩目录。

最后我部署到netlify。

我通过创建指向随机生成的 netlify URL 的 CNAME 记录在 netlify 上设置了一个自定义域。有关netlify自定义域的更多信息。

还有待弄清楚

我真的很想在我的网站上发表评论,但我绝对不想使用 Disqus。当我有机会时,我会给Staticman一个机会。

静态人+鹈鹕教程

......就是这样!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐