- 作者:
- 分类:知识&开发->工具->版本管理&自动构建
- 阅读:5626
- 点赞:10
- 版权: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 -Agit 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}.gitgit 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 Actionsname: publish pages# Controls when the action will run.on:# Triggers the workflow on push or pull request events but only for the main branchpush:branches: [ main ]pull_request:branches: [ main ]# Allows you to run this workflow manually from the Actions tabworkflow_dispatch:# A workflow run is made up of one or more jobs that can run sequentially or in paralleljobs:# This workflow contains a single job called "build"build:# The type of runner that the job will run onruns-on: ubuntu-lateststrategy:matrix:python-version: [3.8]# Steps represent a sequence of tasks that will be executed as part of the jobsteps:# 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 docid: build_docrun: |pip3 install setuptoolspip3 install teedocls -al ~/.local/bin/export PATH=~/.local/bin/:$PATHcommit_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 installteedoc buildecho "out dir: ${out_dir}"cp -rf .github $out_direcho ::set-output name=out_dir::$out_dirremote_addr=`git remote get-url --push origin`echo "remote addr: ${remote_addr}"cd $out_diruser_name=`git log -1 --pretty=format:'%an'`user_email=`git log -1 --pretty=format:'%ae'`git config --global init.defaultBranch gh-pagesgit initgit config user.name ${user_name}git config user.email ${user_email}git add -Agit commit -m "rebuild website ad $commit_info"if [[ "${{ secrets.ACCESS_KEY }}x" == "x" ]]; thenremote_addr=`echo $remote_addr| awk -F'://' '{print $2}'`remote_addr=https://${user_name}:${{ secrets.GITHUB_TOKEN }}@${remote_addr}elseSSHPATH="$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}.gitfigit remote add origin ${remote_addr}git push origin HEAD:gh-pages --force

