[GitHub Action] 整合 GitHub Action 在 Self Host Runner - 不分平台篇

整合 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 使用到有两种方式

  1. 把变数书出道 GitHub env 中
  2. 做成 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 的套件方便开发测试

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章