整合 GitHub Action 在 Self Host Runner - 不分平台篇
CICD 建置 - GitHub Action Workflow 不分平台的心得
这边描述的主要是跟平台无关的一些在 GitHub Action 开发的过程中的心得
触发条件
workflow_dispatch
: 能够被手动触发要加上这个事件push
:- branchs, tags 是 AND 符合,比对的方式就是 branch 成立 且 tag 成立
- 可以用
wildcards
的表示方式 - 不支援
regular expression
pull_request
: 要记得在 typts 条件补上synchronixe
,代表这个 PR 有新的 commit 推上去的时候也会触发
可以看 Examples of wildcard characters 知道 wildcard 的用法
多台 Runner 分配工作
- 可以在 YAML 里面的
runson
用同样的 label 会自动分配,此方式简单方便 - 可以用使用 runner group,此方式更好的控管、共用
使用 runner gropu 是比较进阶的使用场景,可以看 Managing access to self-hosted runners using groups 来了解
全域变数的 env 宣告
YAML 的最上层也可以宣告 env
并指定全域的变数,但是 job or step 要使用的时候要用 ${{env.变数名称}}
来使用,跟在 step
里面宣告的时候使用方式不一样,在 step 里面宣告的 env 变数直接用 $变数名称
使用即可
Step 间的传递变数
一个 step 中的 env 变数不会延续到下一个 step,要在之后的 step 使用到有两种方式
- 把变数书出道 GitHub env 中
- 做成 step 的 outputs
1. 把变数书出道 GitHub env 中
设定到 env 的方式
echo "{name}={value}" >> "$GITHUB_ENV"
要使用 env 的方式
${{ env.name }}
2. 做成 step 的 outputs
官方文件似乎没提到 step 使用 outputs 的方式
设定到 outputs 的方式
echo "{name}={value}" >> "$GITHUB_OUTPUT"
要使用 outputs 的方式
首先要在设定 outputs 的 step 或 job 给予 id
- name: Expose the artifact path
id: paths
run: echo "artifact='app-setup.exe'" >> "$GITHUB_OUTPUT"
使用时就可以
${{ steps.paths.outputs.artifact }}
Job 间传递变数
根据 Passing information between jobs 在 Job 之间也可以使用 output 的方式传递
Step 设定的环境变数是不会往下传递的
每一个 step 都可以使用 env:
这次在 run 的时候的环境变数,举例来说
job:
step1:
env:
VAR1='aaa'
run: |
VAR2='bbb'
step2:
在 step2 的时候是不能使用 $VAR1
及 $VAR2
,用了也只是一个空的东西,就是没有定义过,所以要能够,意思就是每个 step 都要设定一次 env 或者参考上面
Step 间的传递变数
来传递
平行执行 Job
可以参考这篇 Using
jobs in a workflow,可以在 Job 中用 need
, required
来控制 Job 的执行
Job 间传递 artificat
前面执行的 Job 出来的 artificat 需要透过 上传 再 下载 才可以给其他的 Job 使用,可以参考 Storing and sharing data from a workflow
GitHub 内建变数的使用
Accessing contextual information about workflow runs 有列出内建的一些变数要怎么使用
就这次使用到的来说说
ref_type
: 只会有tag
,branch
两种值ref_name
: 会依照触发的事件而有不同的值- push tag 时候是 tag name
- PR 的时候会是类似
merged/14
这种内容 - push branch 的时候是 branch name
取得现在的 branch name 及 tag name
因为我们设计的规则中会需要去判断现有的 branch name & tag name,所以要取得这 2 个的值,根据上面 GitHub 内建变数的使用
中有提到不同的情况下
ref_name
的值是不同的,在尝试过后决定用 2 个 step 去分别就不同的情境去取得对应的值并且设定到 GitHub env 变数中
在 ref_type 是 branch 的情况下
因为此时 tag name 一定是空的,所以就保留空值,但 branch name 要依照现在是不是因为 pull request 触发的而决定要抓 ref_name 还是 head_ref 来当作 branch name
在 ref_type 是 tag 的情况下
ref_name 就是 tag name 很单纯,但 branch name 就比较複杂要使用 git 加上 grep 指令去抓出来
$(git branch -r --contains ${{ github.ref }} | grep -v HEAD | head -n 1 | tr -d ' ' | sed 's/origin\///')
GitHub Hosted Runner 的环境
可以参考 这边 ,在 images
里面有不同作业系统,展开作业系统里可以看到不同名称的 reedme.md 档案,里面有说每个 images 里面已经预先装好的环境
参考资料
- act
- 有人开发出可以在 local 测试 GitHub Action 的套件方便开发测试