- 作者:
- 分类:知识&开发->工具->版本管理&自动构建
- 阅读:3953
- 点赞:9
- 版权:CC BY-SA 4.0
- 创建:2021-11-11
- 更新:2021-11-11
github action 当提交代码后,自动构建生成 pages 文件, 然后提交到本仓库的另一个分支, 重点是怎么提交到另外一个分支,权限怎么获取,这里介绍了使用 GITHUB_TOKEN 的用法
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接(持续更新):https://neucrack.com/p/385
原文链接(持续更新):https://neucrack.com/p/385
目的
使用 github 的 action 可以非常好地实现一些自动化操作。
这里有一个场景, 当提交代码后,自动构建生成 pages 文件, 然后提交到本仓库的另一个分支
重点是怎么提交到另外一个分支,权限怎么获取
方法
如果只是提交了代码,推送到当前分支,直接push
就好了
git add -A
git commit -m ""
git push
如果是新git init
的仓库,则:
- 方法一:
ssh-keygen
生成一对秘钥,公钥添加到仓库的deploy keys
,私钥添加到Secrets
,然后在 action 脚本中使用这个私钥来访问服务器即可。比如在secrets
中存了变量ACCESS_KEY
,值为生成的私钥SSHPATH="$HOME/.ssh"
rm -rf "$SSHPATH"
mkdir -p "$SSHPATH"
echo "${{ secrets.ACCESS_KEY }}" > "$SSHPATH/id_rsa"
chmod 600 "$SSHPATH/id_rsa"
sudo sh -c "echo StrictHostKeyChecking no >>/etc/ssh/ssh_config"
remote_addr=`git remote get-url --push origin`
domain=`echo $remote_addr| awk -F'/' '{print $3}'`
user_org=`echo $remote_addr| awk -F'/' '{print $4}'`
repo=`echo $remote_addr| awk -F'/' '{print $5}'`
remote_addr=git@${domain}:${user_org}/${repo}.git
git remote add origin ${remote_addr}
git push origin HEAD:gh-pages --force
- 方法二:直接使用 github action 内置的 token 变量
GITHUB_TOKEN
remote_addr=`git remote get-url --push origin`
remote_addr=`echo $remote_addr| awk -F'://' '{print $2}'`
remote_addr=https://${user_name}:${{ secrets.GITHUB_TOKEN }}@${remote_addr}
git remote add origin ${remote_addr}
git push origin HEAD:gh-pages --force
这两种方法,看起来第二种方法更简单, 如果需求只是推送代码到当前仓库, 使用GITHUB_TOKEN
是非常好的选择, 不用再配置任何配置。
但是有一种情况,不能使用第二种:
使用GITHUB_TOKEN
推送的代码不会再次触发任何action
,可以看官方源文档的描述 , 是为了防止递归构建发生。
所以,如果你希望构建完成后再自动触发其它构建,就只能用自己设置 key 的方法了。
比如:
- 推送代码到
main
分支,触发构建生成文件,提交到gh-pages
分支 - 当检测到
gh-pages
分支有改动时,触发构建将gh-pages
分支的内容同步到其它服务器
这个例子里,如果使用GITHUB_TOKEN
,就会出现第二个构建脚本无法触发,虽然监测的不是同一个分支,只能使用第一种设置key
的方式
下面是这个例子的action
脚本,自动根据设置了secrets.ACCESS_KEY
与否来决定使用哪种方式
# This is a basic workflow to help you get started with Actions
name: publish pages
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [ main ]
pull_request:
branches: [ main ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.8]
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# Runs a set of commands using the runners shell
- name: build doc
id: build_doc
run: |
pip3 install setuptools
pip3 install teedoc
ls -al ~/.local/bin/
export PATH=~/.local/bin/:$PATH
commit_info=`git describe --all --always --long`
out_dir=out`python3 -c 'import json; f=open("site_config.json");config=json.load(f);print(config["site_root_url"])'`
teedoc install
teedoc build
echo "out dir: ${out_dir}"
cp -rf .github $out_dir
echo ::set-output name=out_dir::$out_dir
remote_addr=`git remote get-url --push origin`
echo "remote addr: ${remote_addr}"
cd $out_dir
user_name=`git log -1 --pretty=format:'%an'`
user_email=`git log -1 --pretty=format:'%ae'`
git config --global init.defaultBranch gh-pages
git init
git config user.name ${user_name}
git config user.email ${user_email}
git add -A
git commit -m "rebuild website ad $commit_info"
if [[ "${{ secrets.ACCESS_KEY }}x" == "x" ]]; then
remote_addr=`echo $remote_addr| awk -F'://' '{print $2}'`
remote_addr=https://${user_name}:${{ secrets.GITHUB_TOKEN }}@${remote_addr}
else
SSHPATH="$HOME/.ssh"
rm -rf "$SSHPATH"
mkdir -p "$SSHPATH"
echo "${{ secrets.ACCESS_KEY }}" > "$SSHPATH/id_rsa"
chmod 600 "$SSHPATH/id_rsa"
sudo sh -c "echo StrictHostKeyChecking no >>/etc/ssh/ssh_config"
domain=`echo $remote_addr| awk -F'/' '{print $3}'`
user_org=`echo $remote_addr| awk -F'/' '{print $4}'`
repo=`echo $remote_addr| awk -F'/' '{print $5}'`
remote_addr=git@${domain}:${user_org}/${repo}.git
fi
git remote add origin ${remote_addr}
git push origin HEAD:gh-pages --force