给岁月以文明,而不是给文明以岁月

文章分类

关于博主

头像不见了

使用 Github Actions 自动部署项目


/ 阅读 220

一、Github Actions

Github Actions 是 github 提供的持续集成服务,通过持续集成我们可以执行一些操作,比如抓取代码,运行测试,编译,发布到服务器等,这些操作可以通过一些事件触发,比如仓库 push 事件。

通过 Github Actions 我们可以做到当 push 代码时,自动触发拉取代码,编译,测试,发布等操作,要完成这些需要我们按照Actions的规则写一些脚本,放在仓库下的 .github 目录下。GitHub 免费提供了运行持续集成的环境,整个过程只需编写脚本即可。

比如我在 github 有一个仓库 dayang/leetcode-rs,里面是 leetcode 的题解,这个项目是 rust 项目,因为 rust 的注释支持 markdown,可以将题目信息、解题思路等直接写到项目注释中,然后使用rust 管理工具 cargo 生成项目文档,并放到我的 网站 上。接下来看看怎么通过 Github Actions 做到推送代码后自动部署文档。

二、Github Actions的一些基本概念

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow,用.github/workflows/下的一个yaml文件声明。
  • job (任务):一个workflow可以包含多个job,可以指定job之间依赖关系,先执行所依赖的job,再执行该job。
  • step(步骤):每个 job 由多个 step 构成,step 依次执行。
  • action (动作):每个 step 可以包含多个 action, action依次执行。

三、具体操作

1、第一步

点击项目的 Actions 按钮可以设置 Actions, github 会检测项目类型,给一个新手模板,点击Set up this workflow 按钮,进入下一步。

2、第二步

接下来直接编辑workflow文件,workflow的文件会放在.github/workflows/文件夹下,编辑完后,提交即可。

wrokflow文档

图片

这里我们先写入以下内容,体验一下:

# workflow 的名称是"Deploy Doc"
name: Deploy Doc

# wrokflow 的触发事件是 push
on: [push]

# workflow 的jobs
jobs:
  # job 的名称是 "deploy"
  deploy:
    # 运行环境,github会自动创建一个该环境,这里是ubuntu
    runs-on: ubuntu-latest

    # job 的steps
    steps:
    # 第一步 执行一个action, 这个action是检出我们的代码到运行环境
    # 使用action 的语法是 userName/repoName, 是一个github上的仓库地址
    - uses: actions/checkout@v1
    # 也可以使用run 执行命令,这里第二步执行命令行命令 cargo -v 查看cargo的版本号
    - name: Version
      run: cargo -V
    # 第三步执行cargo doc,生成文档,在target/doc文件夹下
    - name: GenDoc
      run: cargo doc
    # 第四步,我们看一下生成的文档
    - name: Look Result
      run: |
        ls target/doc

3、第三步

上一步提交后,我们可以看到配置的workflow,以及workflow的运行历史记录。

图片

点击历史记录,可以查看运行的详细信息,可以看到每一个job,以及每一个step的信息。我们可以看到文档生成成功。

图片

到这里,workflow 运行成功了。但是目的还没有达到,文档生成了,我们要把它传到我们的服务器上。

4、第四步

我们增加一个传文件的step:

- name: Transfer File
  # 设置运行环境的环境变量
  env:
    ACTIONS_DEPLOY_KEY: ${{ secrets.DOC_DEPLOY_KEY }}
    HOST: 100.100.100.100
    USER: appuser
    HOME_PATH: /home/appuser
    DEPLOY_SH_PATH: /home/appuser/deploy_github_action_doc.sh
    PACKAGE_NAME: leetcode.tar.gz
  run: |
    SSH_PATH="$HOME/.ssh"
    mkdir -p $SSH_PATH
    touch "$SSH_PATH/known_hosts"
    echo "$DOC_DEPLOY_KEY" > "$SSH_PATH/id_rsa"
    chmod 700 "$SSH_PATH"
    chmod 600 "$SSH_PATH/known_hosts"
    chmod 600 "$SSH_PATH/id_rsa"
    eval $(ssh-agent)
    ssh-add "$SSH_PATH/id_rsa"
    ssh-keyscan -t rsa $HOST >> "$SSH_PATH/known_hosts"
    cd target/doc
    tar -cf $PACKAGE_NAME *
    scp $PACKAGE_NAME $USER@$HOST:$HOME_PATH
    ssh -o StrictHostKeyChecking=no -i $SSH_PATH/id_rsa -A -tt $USER@$HOST sh $DEPLOY_SH_PATH
    exit

这一步脚本的工作是将 target/doc 压缩,然后通过 scp 命令传到服务器上,并执行服务器上的一个脚本。服务器上的脚本是执行后续操作,比如将压缩包解压放到指定位置等。

这一步需要自己先生成 ssh 的秘钥 (使用ssh-keygen命令),并将公钥配置到服务器上 (使用ssh-copy-id命令),然后 Actions 脚本用私钥连接服务器。我们将ssh的私钥添加到项目的 Secrets 里面,命名为DOC_DEPLOY_KEY,然后脚本就可以通过${{ secrets.DOC_DEPLOY_KEY }}获取配置秘钥了。添加后的Secrets是无法查看和修改的,只能删除重新添加,保证安全性。添加方法如图。

图片

我们触发一次push操作,等待一会就可以看到workflow执行成功。

图片

5、完成

每次向仓库推送后,就能自动更新文档了。

文档地址

更详细Github Actions功能查看 官方文档