steps
steps 的通用格式类似于:
steps: - name: <step_name> uses: <action> with: <parameter_name>: <parameter_value> id: <step_id> continue-on-error: true - name: <step_name> timeout-minutes: run: <commands>
每个 step 步骤可以有:
id
: 每个步骤的唯一标识符name
: 步骤的名称uses
: 使用哪个 actionrun
: 执行哪些指令with
: 指定某个 action 可能需要输入的参数continue-on-error
: 设置为 true 允许此步骤失败 job 仍然通过timeout-minutes
: step 的超时时间
action
action 动作通常是可以通用的,这意味着你可以直接使用别人定义好的 action 。
checkout action
checkout action 是一个标准动作,当以下情况时必须且需要率先使用:
- workflow 需要项目库的代码副本,比如构建、测试、或持续集成这些操作。
- workflow 中至少有一个 action 是在同一个项目库下定义的。
使用示例:
- uses: actions/checkout@v1
如果你只想浅克隆你的库,或者只复制最新的版本,你可以在 with
中使用 fetch-depth
声明,例如:
- uses: actions/checkout@v1 with: fetch-depth: 1
引用 action
- 官方 action 标准库: github.com/actions
- 社区库: marketplace
1、引用公有库中的 action
引用 action 的格式是 {owner}/{repo}@{ref}
或 {owner}/{repo}/{path}@{ref}
,例如上例的中 actions/checkout@v1
,你还可以使用标准库中的其它 action ,如设置 node 版本:
jobs: my_first_job: name: My Job Name steps: - uses: actions/setup-node@v1 with: node-version: 10.x
2、引用同一个库中的 action
引用格式:{owner}/{repo}@{ref}
或 ./path/to/dir
。
例如项目文件结构为:
|-- hello-world (repository) | |__ .github | └── workflows | └── my-first-workflow.yml | └── actions | |__ hello-world-action | └── action.yml
当你想要在 workflow 中引用自己的 action 时可以:
jobs: build: runs-on: ubuntu-latest steps: # This step checks out a copy of your repository. - uses: actions/checkout@v1 # This step references the directory that contains the action. - uses: ./.github/actions/hello-world-action
3、引用 Docker Hub 上的 container
如果某个 action 定义在了一个 docker container image 中且推送到了 Docker Hub 上,你也可以引入它,格式是 docker://{image}:{tag}
,示例:
jobs: my_first_job: steps: - name: My first step uses: docker://alpine:3.8
更多信息参考: Docker-image.yml workflow 和 Creating a Docker container action 。
构建 actions
请参考:building-actions
env
环境变量可以配置在以下地方:
env
jobs.<job_id>.env
jobs.<job_id>.steps.env
示例:
env: NODE_ENV: dev jobs: job1: env: NODE_ENV: test steps: - name: env: NODE_ENV: prod
如果重复,优先使用最近的那个。
if & context
你可以在 job 和 step 中使用 if
条件语句,只有满足条件时才执行具体的 job 或 step :
jobs.<job_id>.if
jobs.<job_id>.steps.if
任务状态检查函数:
success()
: 当上一步执行成功时返回 truealways()
: 总是返回 truecancelled()
: 当 workflow 被取消时返回 truefailure()
: 当上一步执行失败时返回 true
例如:
steps: - name: step1 if: always() - name: step2 if: success() - name: step3 if: failure()
意思就是 step1 总是执行,step2 需要上一步执行成功才执行,step3 只有当上一步执行失败才执行。
${{<expression>}}
上下文和表达式: ${{<expression>}}
。
有时候我们需要与第三方平台进行交互,这时候通常需要配置一个 token ,但是显然这个 token 不可能明文使用,这种个情况下我们要做的就是:
- 在具体 repository 库
Settings
的Secrets
中添加一个密钥,如SOMEONE_TOKEN
- 然后在 workflow 中就可以通过
${{secrets.SOMEONE_TOKEN}}
将 token 安全地传递给环境变量。
steps: - name: My first action env: SOMEONE_TOKEN: ${{ secrets.SOMEONE_TOKEN }}
这里的 secrets
就是一个上下文,除此之外还有很多,比如:
github.event_name
: 触发 workflow 的事件名称job.status
: 当前 job 的状态,如 success, failure, or cancelledsteps.<step id>.outputs
: 某个 action 的输出runner.os
: runner 的操作系统如 Linux, Windows, or macOS
这里只列举了少数几个。
另外在 if
中使用时不需要 ${{}}
符号,比如:
steps: - name: My first step if: github.event_name == 'pull_request' && github.event.action == 'unassigned' run: echo This event is a pull request that had an assignee removed.
上下文和表达式详细信息请参考:contexts-and-expression
结语
最后给个自己写的示例,仅供参考:
name: GitHub Actions CI on: [push] jobs: build-test-deploy: runs-on: ubuntu-latest strategy: matrix: node-version: [8.x, 10.x, 12.x] steps: - uses: actions/checkout@v1 - name: install linux packages run: sudo apt-get install -y--no-install-recommends libevent-dev - name: install memcached if: success() run: | wget -O memcached.tar.gz http://memcached.org/files/memcached-1.5.20.tar.gz tar -zxvf memcached.tar.gz cd memcached-1.5.20 ./configure && make && sudo make install memcached -d - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 if: success() with: node-version: ${{ matrix.node-version }} - name: npm install, build, and test env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} if: success() run: | npm ci npm test npm run report-coverage