最近我把自己的一些自动化脚本移到了 Github Action。因为考虑到 Github Action 有下面几个优势:
自动化脚本是代码的一部分 (Infrastructure as Code),而不是限定在某个服务器上。这样长久来说更为通用,如果我迁移到其他服务器根本不用做什么修改,因为我们在写 Github Action 的脚本的时候就不假定在哪台服务器上运行。
配置更为方便,想要修改一下只需要提交配置文件就可以了,不用登录到服务器上。
基于以上几点考虑,我花了一些时间来把之前的一些 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)