Github Actions配置

警告
本文最后更新于 2023-02-24,文中内容可能已过时,请谨慎使用。

GitHub Actions有一些自己的术语。

  1. workflow (工作流程):持续集成一次运行的过程,就是一个workflow。

  2. job (任务):一个workflow由一个或多个jobs构成,含义是一次持续集成的运行,可以完成多个任务。

  3. step (步骤):每个job由多个step构成,一步步完成。

  4. action (动作):每个step可以依次执行一个或多个命令(action)。

GitHub Actions的配置文件叫做workflow文件,存放在代码仓库的.github/workflows目录。

workflow文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml,比如foo.yml

一个库可以有多个workflow文件。GitHub只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。

github提供了一个simple workflow,配置如下:

# name: workflow名称

name: CI

# on: 控制什么事件下触发这个workflow
on:
  # 当main分支下发生push 或者 pull request事件时触发
  push:
    branches: [ "main" ]
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
      - README.md
      - LICENSE
      - 'docs/**' # 忽略docs下所有文件的变更
  pull_request:
    branches: [ "main" ]

  # 允许你手动触发该workflow
  workflow_dispatch:

# 一个workflow运行了一个或多个jobs,这些jobs可以线性或者并行运行
# 下面是一个简单的workflow,包括一个简单的job, job_id为'build', job_id需要保证唯一性
jobs:
  
  build:
    # 该job运行的虚拟机环境
    runs-on: ubuntu-latest
    
    # job_id里面的name字段是任务的说明
    # 不写该字段github上显示的就是job_id: 'build'
    name: a simple build task
	
    # 该job所要执行的一系列步骤
    steps:
      # 下载仓库源代码
      - uses: actions/checkout@v3

      # 执行一行命令
      # name是该步骤的说明性文字
      - name: Run a one-line script
        run: echo Hello, world!

      # 执行多行命令
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.          

workflow字段非常多,这里只介绍一部分常用字段,官方文档点此查看

(1) name

name字段是workflow的名称。如果省略该字段,默认为当前workflow的文件名。

name: gitHub workflow name

(2) on

on字段指定触发workflow的条件,通常是某些事件。

on: push

上面代码指定,push事件触发workflow。

on字段也可以是事件的数组。

on: [push, pull_request]

上面代码指定,push事件或pull_request事件都可以触发workflow。

完整的事件列表,请查看官方文档。除了代码库事件,GitHub Actions也支持定时运行。

# 每天北京时间的8点运行
on: 
  schedule:
  - cron: "* 0 * * *" 

同时做到指定路径和排除路径: push事件触发 workflow,sub-project目录或其子目录中的文件变更时触发workflow,但是在sub-project/docs目录下的文件变更不触发 workflow

on:
  push:
    paths:
      - 'sub-project/**'
      - '!sub-project/docs/**'

只排除路径:README.mdLICENSE修改不会触发workflow

on:
  push:
    paths-ignore: 
      - README.md
      - LICENSE

(3) on.<push|pull_request>.<tags|branches>

指定触发事件时,可以限定分支或标签。

on:
  push:
    branches:    
      - master
      - 'releases/**'
    tags:        
      - v2
      - v1.*

上面代码指定,当master或以 releases/ 开头的分支发生push事件时,或者当名为v2或以v1.开头的tag发生push事件时才会触发workflow。

(4) jobs.<job_id>.name

workflow 文件的主体是jobs字段,表示要执行的一项或多项任务。

jobs字段里面,需要写出每一项任务的job_id,具体名称自定义。job_id里面的name字段是任务的说明。

jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job

上面代码的jobs字段包含两项任务,job_id分别是my_first_jobmy_second_job

(5) jobs.<job_id>.needs

needs字段指定当前任务的依赖关系,即运行顺序。

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

上面代码中,job1必须先于job2完成,而job3等待job1job2的完成才能运行。因此,这个 workflow 的运行顺序依次为:job1job2job3

(6) jobs.<job_id>.runs-on

runs-on字段指定运行job的虚拟机环境。

下面代码指定job运行的虚拟机环境为ubuntu-18.04

runs-on: ubuntu-18.04

(7) jobs.<job_id>.steps

steps字段指定每个job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。

  • jobs.<job_id>.steps.name:步骤名称。
  • jobs.<job_id>.steps.run:该步骤运行的命令或者 action。
  • jobs.<job_id>.steps.env:该步骤所需的环境变量。
name: Greeting from Mona
on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
    - name: Print a greeting
      env:
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
        MIDDLE_NAME: The
        LAST_NAME: Octocat
      run: |
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.        

上面代码中,steps字段只包括一个步骤。该步骤先注入四个环境变量,然后执行一条 bash命令。

(8) jobs.<job_id>.uses

调用本仓库其他位置的actions,或者调用其他人公开的actions

steps:
	- uses: actions/checkout@v3
	- name: Use Node.js
	  uses: actions/setup-node@v3
	  with:
		node-version: '12.x'
	- run: |
		npm ci
		npm run build --if-present
		npm test

(9) jobs.<job_id>.container

在指定的容器中运行run中的命令。若不设置 container,所有步骤将直接在 runs-on 指定的主机上运行。

不能直接使用uses指定容器中运行,若使用uses: 容器只会在系统中启动一个容器,不会在容器中运行。

注意
用于容器中的 run 步骤的默认shellsh,而不是 bash

(10) jobs.<job_id>.services

启动一个nginx容器,容器内端口为80,本地端口为8080

services:
  nginx:
    image: nginx
    ports:
      - 8080:80

(10) serects

在调用的工作流中,可以使用 secrets 上下文来引用机密。在仓库中依次点击Setting->Secrets->Actions设置

/images/all/image-20230225000802195.png
/images/all/image-20230225000823308.png

使用下面的方式调用secrets中的变量:

${{ secrets.TEST }}

相关文章