CatCoding

在 Github Action 使用 Git

2021-11-30

最近我把自己的一些自动化脚本移到了 Github Action。因为考虑到 Github Action 有下面几个优势:

  1. 自动化脚本是代码的一部分 (Infrastructure as Code),而不是限定在某个服务器上。这样长久来说更为通用,如果我迁移到其他服务器根本不用做什么修改,因为我们在写 Github Action 的脚本的时候就不假定在哪台服务器上运行。

  2. 配置更为方便,想要修改一下只需要提交配置文件就可以了,不用登录到服务器上。

基于以上几点考虑,我花了一些时间来把之前的一些 Ruby、Shell 脚本变成 Github Action 配置。有的脚本做的事情是定时拉去某个 repo,如果有改动则会根据规则生成新的内容,然后自动提交到远程仓库。所以我需要在 Github Action 中使用 Git 提交数据。要达到这个目的得在 Github 中配置 Git 的权限和账户信息。有以下两种方式:

使用 Github Access token

首先需要在 Settings 页面生成一个 Access Token. 然后添加到要配置 Github Action 的仓库的 Settings 页面中,假设我的 token 取名为PAT,在 Action 中我们可以通过 secrets.PAT 获取和使用该 Token。

jobs:
  sync-to-sites:
    runs-on: ubuntu-latest
    steps:
      - name: Git Clone and Global Config
        run: |
          # Git setup
          export GITHUB_USER=yukang
          echo "GITHUB_USER=$GITHUB_USER" >> $GITHUB_ENV
          echo "GITHUB_TOKEN=${{ secrets.PAT }}" >> $GITHUB_ENV
          git config --global user.email "moorekang@gmail.com"
          git config --global user.name $GITHUB_USER

然后通过如下方式 clone 要修改的 repo 到跑 action 的服务器目录上。

- name: checkout blog
  uses: actions/checkout@master
  with:
    repository: chenyukang/blog-source
    token: ${{ secrets.PAT }}
    path: blog-source

这种通过 Access Token 的方式 clone repo,用的是 HTTPS 的方式。通过 git remote -v 查看可以看到 remote 的地址。

使用 SSH

另外一种方式是通过 ssh key。我们首先在任何一个服务器生成一个 ssh key,把这个 ssh 的 public key 加入到 Github settings 里。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

然后把私钥拷贝到要配置 Action 的 repo 的 secrets 里。

通过如下方式在 action 中配置 ssh:

- name: Install SSH Key
  uses: shimataro/ssh-key-action@v2
  with:
    key: ${{ secrets.SSH_KEY }}
    known_hosts: 'just-a-placeholder'

这样之后就可以在 Action 的后续步骤中像在本地一样使用 SSH 的方式来 clone repo 和提交代码了。
通过 ssh key 的方式我们也可以在 Github Action 中通过远程的方式来在其他服务器上执行命令,这对于要部署到服务器上的脚本来说是非常有用。

具体可以参考这篇文章: Deploying to a server via SSH and Rsync in a Github Action | Zell Liew (zellwk.com)

公号同步更新,欢迎关注👻