您当前的位置: 首页 >  git

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

通过GitHub Actions构建和部署Jekyll网站

寒冰屋 发布时间:2020-05-18 11:00:12 ,浏览量:0

目录

我已经有什么

使用Github动作创建相同的内容

a)构建Jekyll站点

b)通过SSH连接到我的服务器并部署

奖励:在页脚中显示提交ID/内部版本号

在本文中,您将学习如何构建Jekyll站点并通过SSH连接到我的服务器并进行部署。您将看到完整的解决方案,作为奖励,您将学习如何在页脚中显示“提交ID/内部版本号”。

直到现在,我博客的源代码都在Bitbucket上,并且在每次提交时,该站点是使用Jekyll构建的,然后通过SSH上的rsync部署到我的webspace,所有这些都使用了Bitbucket管道。

最近,我将存储库移至GitHub…,因为它位于Mercurial存储库中,而Bitbucket将在几周内放弃对Mercurial的支持。我决定将存储库移至GitHub,并了解如何使用GitHub Actions设置相同的构建/部署。

我已经有什么

构建和部署该站点的大多数“逻辑”已经在两个shell脚本中。它是这样的:

  • ci-build.sh(源代码):
    • 在CI服务器上运行
    • 执行Jekyll来构建站点(并期望在具有预先可用的Jekyll安装的环境中运行!)
    • 将结果保存到.tar.gz存档
  • CI服务器通过SSH 通过rsync将存档复制到我的Webspace上的temp文件夹中
  • ci-deploy.sh(源代码):
    • 由CI服务器通过SSH直接在我的Web空间(不是在CI服务器上!)执行
    • 将档案解压缩到另一个临时文件夹中,并将其rsync到我的域指向的文件夹中

有关更详尽的解释(以及解释各行功能的脚本的带注释版本),请阅读此篇文章。

存在shell脚本,以便我在切换CI提供程序时可以重新使用它们...因此,为了迁移到GitHub Actions,我根本不需要更改它们,我只需要替换特定于提供程序的设置文件,该文件“调用”脚本。

Bitbucket的现有YAML文件非常简单:

步骤1:使用jekyll/builder Docker镜像运行ci-build.sh并将构建目录另存为工件。

步骤2:将工件从步骤1 同步到Web服务器,然后在服务器上执行ci-deploy.sh。

这两部分都很短,因为Bitbucket Pipelines在后台做了很多工作:

  • 对于Docker,我只需要提供镜像名称
  • 对于SSH,我根本不需要设置任何东西,只需将我的密钥保存在Bitbucket的UI中——其他所有内容都会在后台自动处理。
使用Github动作创建相同的内容

最后,我开始使用它了——但是与Bitbucket Pipelines相比,在GitHub Actions中执行相同的步骤感觉“不完善”(稍后会详细介绍)。

a)构建Jekyll站点

这是相当简单的,除了GH Actions不只是让你指定任何Docker镜像的名字,然后执行构建…只有“默认”Windows/Linux/Mac虚拟机可用。

我不想在该计算机上手动编写Jekyll的安装脚本,因此我搜索了jekyll/builder Docker镜像的示例,并在GH Actions的启动程序工作流程存储库中找到了解决方案:

steps:
- uses: actions/checkout@v2
- name: Build the site in the jekyll/builder container
  run: |
    docker run \
    -v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \
    jekyll/builder:latest /bin/bash -c "chmod 777 /srv/jekyll && jekyll build --future"

我只需要将调用添加到ci-build.sh并选择正确的Jekyll版本,所以就这样更改了docker运行行:

run: |
  docker run \
  -v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \
  jekyll/builder:3.2.1 /bin/bash -c "chmod +x ci-build.sh && ./ci-build.sh"

(注意:3.2.1 对我来说是正确的Jekyll版本,因为它与我在Windows计算机上本地使用的可移植Jekyll版本匹配。)

这看起来比它的Bitbucket复杂得多……但是,另一方面,我不必自己调用,我在Bitbucket和GitHub的两种情况下都复制并粘贴了结果。

b)通过SSH连接到我的服务器并部署

这花了我很长时间,也拉了很多头发。我不是SSH专家,如上所述,Bitbucket Pipelines保护了我免受大多数攻击,尤其是在构建计算机上正确设置了密钥。

对于GH操作,也有很多的由社区制作的actions是关于SSH的 。

我尝试了所有这些,但什么都没做,我总是收到“主机密钥验证失败 ”错误。

最后,我找到了这个解决方案:

- name: "Prepare SSH key and known hosts"
  run: |
    mkdir -p ~/.ssh
    echo "$" > ~/.ssh/id_rsa
    chmod 600 ~/.ssh/id_rsa
    ssh-keyscan github.com >> ~/.ssh/known_hosts
    ssh-keyscan git.eu.s5y.io >> ~/.ssh/known_hosts

我尝试了其他类似的“手动”解决方案,将密钥保存在文件中并执行ssh-keyscan …,但是语法和/或命令始终略有不同,因此这个最终对我有用。这是我根据此修改的步骤:

- name: "Prepare SSH key and known hosts"
  run: |
    mkdir -p ~/.ssh
    echo "$" > ~/.ssh/id_rsa
    chmod 600 ~/.ssh/id_rsa
    ssh-keyscan $ >> ~/.ssh/known_hosts
- name: Run deploy script
  run: |
    rsync -rSlh --stats build/ $@$:$/tar
    ssh -o StrictHostKeyChecking=yes $@$ 'bash -s' -- < build/ci-deploy.sh $

当然,必须将某些变量保存在存储库的secrets中(https://github.com/USER/REPO/settings/secrets):

  • KEY:我的私人SSH密钥
  • HOST:christianspecht.de (实际上,这不是秘密……)
  • USERNAME:我的网站空间上的SSH用户名
  • WEBPATH:网站空间的完整路径,例如/www/htdocs/MY_ACCOUNT_NAME/blog

完整的解决方案

就这样_完整的工作ci.yml:

name: Jekyll site CI

on:
  push:
    branches:    
      - master   

jobs:
  build_job:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build site
      run: |
        docker run \
        -v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \
        jekyll/builder:3.2.1 /bin/bash -c "chmod +x ci-build.sh && ./ci-build.sh"
    - name: Upload artifact
      uses: actions/upload-artifact@v1
      with:
        name: build
        path: build
        
  deploy:
    runs-on: ubuntu-latest
    needs: build_job
    steps:
    - uses: actions/download-artifact@v1
      with:
        name: build
    - name: "Prepare SSH key and known hosts"
      # https://github.com/symfony/cli/issues/227#issuecomment-601680974
      run: |
        mkdir -p ~/.ssh
        echo "$" > ~/.ssh/id_rsa
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan $ >> ~/.ssh/known_hosts
    - name: Run deploy script
      run: |
        rsync -rSlh --stats build/ $@$:$/tar
        ssh -o StrictHostKeyChecking=yes $@$ 'bash -s' -- < build/ci-deploy.sh $
奖励:在页脚中显示提交ID/内部版本号

一切正常后,我决定在网站的页脚中添加“从具有构建号123的提交xyz构建”行。

从Jekyll的角度来看,这很容易。只是:

  • 在主_config.yml中为提交ID(带有虚拟值)添加新的网站变量,并在网站上的某处显示其内容
  • 在构建时,动态创建具有实际提交ID 的附加_config-github.yml,并将其传递到原始配置文件之后的Jekyll调用(因此,提交ID会覆盖主配置文件中的ID)
  • 实际的提交ID来自构建运行器设置的环境变量,对于GitHub Actions,它是$ GITHUB_SHA,其中包含提交ID。

这是这些更改的提交 ——但它不能按原样工作。构建成功,但是完成站点中的提交ID为空。

原来,罪魁祸首是我在Docker容器中运行构建的事实。实际的GitHub Actions“运行程序 ” (运行整个操作的虚拟Ubuntu计算机)知道环境变量,但是它不会自动将它们传递给我正在使用的Docker容器(实际上是在构建Jekyll站点)。

解决方案是将变量直接传递到我执行Docker的那一行中的ci-build.sh中。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0599s