简介
持续集成 (CI): 是一种需要频繁提交代码到共享仓库的软件实践。可以包括代码语法检查(检查样式格式)、安全性检查、代码覆盖率、功能测试及其他自定义操作。
GitHub Actions 是 GitHub 的持续集成服务,每一步操作是一个单独的action(可以认为是一个脚本),将action进行组合,构建自己的发布工作流。工作流程可在 GitHub 托管的虚拟机或您自行托管的机器上运行。
公共存储库中标准 GitHub 托管的运行器和自托管运行器可免费使用 GitHub Actions。 对于专用存储库,每个 GitHub 帐户可获得一定数量的免费时间和存储以用于 GitHub 托管的运行器,具体取决于帐户的计划。 超出包含数量的任何使用量都由支出限制控制。
基本概念
workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
step(步骤):每个 job 由多个 step 构成,一步步完成。每个step的环境是单独的,在一个step 对环境的操作不会影响到其他的step。
action (动作):每个 step 可以依次执行一个或多个命令(action)。
workflow(工作流配置):GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录,采用yml格式编写,一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。
Runner:运行的环境,https://github.com/actions/runner-images,可运行macOS 的镜像(价格10倍于Linux),预装了各版本Xcode,模拟器。公开账户免费,私有账户每月免费2000分钟(Linux标准),付费账户可使用更好配置的Runner。
配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| # 工作流名称
name: GitHub Pages
# 触发时机:定时,手动,HTTP触发。
# 指定操作等,可参考https://docs.github.com/zh/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows
# on字段也可以是事件的数组。 [push, pull_request]
on:
push:
branches:
- main # Set a branch to deploy
pull_request:
# 要执行的任务
jobs:
my-job: # 任务的`job_id`,具体名称自定义。
name: My Job # 自定义名称
runs-on: ubuntu-latest # 所需要的虚拟机环境。它是必填字段
steps: # 指定每个 Job 的运行步骤,可以包含一个或多个步骤
- name: Print a greeting # 步骤名称。
# 使用 `concurrency` 以确保只有使用相同并发组的单一作业或工作流才会同时运行。 并发组可以是任何字符串或表达式。
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
env: # 当前step,环境变量
MY_VAR: Hi there! My name is
FIRST_NAME: Mona
if: ${{ github.ref == 'refs/heads/main' }} # 除非满足条件,否则不运行。
#输入给action的参数。 每个输入参数都是一个键/值对。 输入参数被设置为环境变量。
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
run: |
echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
job2:
needs: my-job # 依赖关系
job3:
needs: [job1, job2]
|
常用action
- checkout:拉取代码到本地
- actions/upload-artifact:将一些运行的数据保存下来
- setup-*:固定好环境配置,如java,ruby,node等。
常见问题
- push 代码403,权限被拒,需要在settings里为action开放写权限。
- 大文件无法上传到GitHub,可利用长裤的release存储。
- 密钥等信息直接存放到 项目里的 Actions secrets and variables里。
- 免费账户,Ubuntu,跑安卓模拟器,推荐配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
jobs:
build-and-test-android:
name: Android - Build and run Detox tests
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
env:
NODE_ENV: development
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22.2.0
cache: 'npm'
cache-dependency-path: './${{ github.event.inputs.appName }}/package-lock.json'
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.4.5'
bundler-cache: false
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: zulu
java-version: 17
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libpulse0 // 启动模拟器需要
- name: Run android tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
target: default
arch: x86_64
ram-size: 2048M
heap-size: 512M
disk-size: 6144M
avd-name: Android_API29
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-skin -no-metrics
disable-animations: true
|
- 在一个step下的操作,如切换路径,设置环境(非GitHub ENV 环境)不回影响其他step。
- 一些缓存操作,需要流程执行成功才可缓存成功。