让你满意的GitHub Actions详解

GitHub Actions 指南

GitHub Actions使你可以直接在你的GitHub库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建、测试、打包、发布、部署等等,也就是说你可以直接进行 CI(持续集成)和 CD(持续部署)。

基本概念

(1)workflow: 一个 workflow 工作流就是一个完整的过程,每个workflow 包含一组 jobs任务。

(2)job : jobs任务包含一个或多个job ,每个 job包含一系列的 steps 步骤。

(3)step : 每个 step 步骤可以执行指令或者使用一个 action 动作。

(4)action : 每个 action 动作就是一个通用的基本单元。

配置 workflow

workflow必须存储在你的项目库根路径下的 .github/workflows 目录中,每一个 workflow对应一个具体的.yml 文件(或者 .yaml)。

workflow 示例:

name:GreetEveryone
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
your_job_id:
# Job name is Greeting
name: Greeting
# This job runs on Linux
runs-on: ubuntu-latest
steps:
# This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action
- name: Hello world
uses: actions/hello-world-javascript-action@v1
with:
who-to-greet: 'Mona the Octocat'
id: hello
# This step prints an output (time) from the previous step's action.
- name: Echo the greeting's time
run: echo 'The time was ${{ steps.hello.outputs.time }}.

说明:
(1)最外层的 name 指定了 workflow的名称。

(2)on 声明了一旦发生了 push 操作就会触发这个 workflow

(3)jobs定义了任务集,其中可以有一个或多个job 任务,示例中只有一个。

(4)runs-on 声明了运行的环境。

(5)steps定义需要执行哪些步骤。

(6)每个 step可以定义自己的 nameid,通过 uses 可以声明使用一个具体的 action,通过run 声明需要执行哪些指令。

(7)${{}}可以使用上下文参数。

上述示例可以抽象为:

name: <workflow name>
on: <events that trigger workflows>
jobs:
<job_id>:
name: <job_name>
runs-on: <runner>
steps:
- name: <step_name>
uses: <action>
with:
<parameter_name>: <parameter_value>
id: <step_id>
- name: <step_name>
run: <commands>

on

on声明了何时触发 workflow ,它可以是:

(1)一个或多个GitHub 事件,比如 ush 了一个 commit、创建了一个issue、产生了一次pull`` request 等等,示例:

on:[push,pull_request]

(2)预定的时间,示例(每天零点零分触发):

on:
    schedule:
        -cron:'00 ***'

(3)某个外部事件。所谓外部事件触发,简而言之就是你可以通过REST APIGitHub 发送请求去触发,具体请查阅官方文档: repository-dispatch-event

配置多个事件,示例:

on:

# Trigger the workflow on push or pull request,

# but only for the master branch

push:

branches:

- master

pull_request:

branches:

- master

# Also trigger on page_build, as well as release created events

page_build:

release:

types: # This configuration does not affect the page_build event above

- created

详细文档请参考: 触发事件

jobs

jobs可以包含一个或多个 job ,如:

jobs:

my_first_job:

name: My first job

my_second_job:

name: My second job

如果多个job 之间存在依赖关系,那么你可能需要使用 needs :

jobs:

job1:

job2:

needs: job1

job3:

needs: [job1, job2]

这里的needs声明了job2 必须等待 job1 成功完成,job3必须等待 job1job2依次成功完成。

每个任务默认超时时间最长为 360分钟,你可以通过 timeout-minutes 进行配置:

jobs:
    job1:
        timeout-minutes:

runs-on & strategy

runs-on 指定了任务的 runner 即执行环境,runner 分两种:GitHub-hosted runnerself-hosted runner

所谓的 self-hosted runner 就是用你自己的机器,但是需要 GitHub 能进行访问并给与其所需的机器权限,这个不在本文描述范围内,有兴趣可参考 self-hosted runner

GitHub-hosted runner 其实就是 GitHub 提供的虚拟环境,目前有以下四种:

(1)windows-latest : Windows Server 2019

(2)ubuntu-latestubuntu-18.04 : Ubuntu 18.04

(3)ubuntu-16.04 : Ubuntu 16.04

(4)macos-latest : macOS Catalina 10.15

比较常见的:

runs-on:ubuntu-latest

runs-on 多环境

有时候我们常常需要对多个操作系统、多个平台、多个编程语言版本进行测试,为此我们可以配置一个构建矩阵。

例如:

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [ubuntu-16.04, ubuntu-18.04]

node: [6, 8, 10]

示例中配置了两种os操作系统和三种 node版本即总共六种情况的构建矩阵, ${{matrix.os}} 是一个上下文参数。

strategy 策略,包括:

(1)matrix: 构建矩阵。

(2)fail-fast : 默认为true ,即一旦某个矩阵任务失败则立即取消所有还在进行中的任务。

(3)max-paraller : 可同时执行的最大并发数,默认情况下 GitHub 会动态调整。

示例:

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [macos-latest, windows-latest, ubuntu-18.04]

node: [4, 6, 8, 10]

include:

# includes a new variable of npm with a value of 2 for the matrix leg matching the os and version

- os: windows-latest

node: 4

npm: 2

include声明了 oswindows-latest 时,增加一个 nodenpm分别使用特定的版本的矩阵环境。

include 相反的就是exclude

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [macos-latest, windows-latest, ubuntu-18.04]

node: [4, 6, 8, 10]

exclude:

# excludes node 4 on macOS

- os: macos-latest

node: 4

exclude 用来删除特定的配置项,比如这里当osmacos-latest,将 node为 4 的版本从构建矩阵中移除。

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 步骤可以有:

(1)id : 每个步骤的唯一标识符

(2)name : 步骤的名称

(3)uses : 使用哪个action

(4)run: 执行哪些指令

(5)with: 指定某个action 可能需要输入的参数

(6)continue-on-error : 设置为 true 允许此步骤失败job 仍然通过

(7)timeout-minutes : step 的超时时间

action

action 动作通常是可以通用的,这意味着你可以直接使用别人定义好的action

checkout action

checkout action 是一个标准动作,当以下情况时必须且需要率先使用:

(1)workflow 需要项目库的代码副本,比如构建、测试、或持续集成这些操作。

(2)workflow 中至少有一个 action是在同一个项目库下定义的。

使用示例:

- users:action/checkout@v1

如果你只想浅克隆你的库,或者只复制最新的版本,你可以在 with中使用fetch-depth声明,例如:

- user:action/checkout@v1
  with:
    fetch-depth:1

引用 action

(1)官方action标准库: github.com/actions

(2)社区库:marketplace

引用公有库中的 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

引用同一个库中的 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

引用 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 workflowCreating a Docker container ``action

构建 actions

请参考:building-actions

env

环境变量可以配置在以下地方:

(1)env

(2)jobs.<job_id>.env

(3)jobs.<job_id>.steps.env

示例:

env:

NODE_ENV: dev


jobs:

job1:

env:

NODE_ENV: test


steps:

- name:

env:

NODE_ENV: prod

如果重复,优先使用最近的那个。

if & context

你可以在 jobstep中使用if条件语句,只有满足条件时才执行具体的jobstep :

(1)jobs.<job_id>.if

(2)jobs.<job_id>.steps.if

任务状态检查函数:

(1)success() : 当上一步执行成功时返回 true

(2)always() : 总是返回 true

(3)cancelled() : 当 workflow被取消时返回 true

(4)failure() : 当上一步执行失败时返回 true

例如:

steps:

- name: step1

if: always()


- name: step2

if: success()


- name: step3

if: failure()

意思就是 step1总是执行,step2 需要上一步执行成功才执行,step3 只有当上一步执行失败才执行。

${{<expression>}}

上下文和表达式: ${{<expression>}} 。

有时候我们需要与第三方平台进行交互,这时候通常需要配置一个token,但是显然这个 token 不可能明文使用,这种个情况下我们要做的就是:

(1)在具体 repositorySettingsSecrets 中添加一个密钥,如 SOMEONE_TOKEN

(2)然后在workflow中就可以通过 ${{secrets.SOMEONE_TOKEN}}token安全地传递给环境变量。

steps:

- name: My first action

env:

SOMEONE_TOKEN: ${{ secrets.SOMEONE_TOKEN }}

这里的secrets 就是一个上下文,除此之外还有很多,比如:

(1)github.event_name : 触发workflow的事件名称

(2)job.status : 当前job 的状态,如 success, failure, or cancelled

(3)steps.<step id>.outputs : 某个 action 的输出

(4)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

以上就是小编今天带来的内容,小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴点击下方链接即可领取
https://docs.qq.com/doc/DTGpFa2lVeE9jUkRv

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342