共计 6337 个字符,预计需要花费 16 分钟才能阅读完成。
<!– more –>
一、GitHubAction 简介
🧅什么是 Github Action ?
GitHubActions 是一个继续集成和继续交付的平台,它能够帮忙你通过自动化的构建(包含编译、公布、自动化测试)来验证你的代码,从而尽快地发现集成谬误。github 于 2019 年 11 月后对该性能全面凋谢,当初所有的 github 用户能够间接应用该性能。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行您的工作流程,或者您能够在本人的数据中心或云基础架构中托管本人的自托管运行器。在应用 Github Action 之前首先须要理解以下前置常识:
- 继续集成 / 继续交付的概念。
- Git 相干常识。
- Linux 或 Windows 或 macOS 脚本相干常识。
- Yaml 根底语法。
🍤什么是 Yaml ?
编写 GithubAction 的流程时,须要创立一个 workflow 工作流,workflow 必须存储在你的我的项目库根门路下的.github/workflows 目录中,每一个 workflow 对应一个具体的.yml 文件(或者 .yaml)。
yml 是 YAML(YAML Ain’t Markup Language)语言的文件,以数据为核心,比 properties、xml 等更适宜做配置文件,次要有以下几个特点:
- 大小写敏感。
- 应用缩进示意层级关系。
- 缩进只能应用空格,不能用 TAB 字符。
- 缩进的空格数量不重要,只有层级雷同的元素左对齐即可。
- ‘#’示意正文。
🍝Github Action 基本概念
- workflow: 一个 workflow 就是一个残缺的工作流过程,每个 workflow 蕴含一组 jobs 工作。
- job : jobs 工作蕴含一个或多个 job,每个 job 蕴含一系列的 steps 步骤。
- step : 每个 step 步骤能够执行指令或者应用一个 action 动作。
- action : 每个 action 动作就是一个通用的根本单元。
🍓Github Action 的应用限度
在应用收费版本的 Github Action 是有如下限度的:
- 作业执行工夫 – 工作流中的每个作业最多能够运行 6 小时的执行工夫。如果作业达到此限度,该作业将终止且无奈实现。
- 工作流运行工夫 – 每个工作流运行限度为 35 天。如果工作流运行达到此限度,则工作流运行将被勾销。此时间段包含执行持续时间以及期待和批准所破费的工夫。
- API 申请 – 您能够在一小时内跨存储库中的所有操作执行多达 1000 个 API 申请。如果超出此限度,其余 API 调用将失败,这可能会导致作业失败。
- 并发作业 – 能够在帐户中运行的并发作业数取决于 GitHub 打算,如下表所示。如果超出,则任何其余作业都将排队。
| GitHub 打算 | 并发作业总数 | 最大并发 macOS 作业数 |
| :———: | :———-: | :——————-: |
| 自在 | 20 | 5 |
| 专业版 | 40 | 5 |
| 团队 | 60 | 5 |
| 企业 | 180 | 50 |
- 作业矩阵 – 作业矩阵每次工作流运行最多能够生成 256 个作业。此限度实用于 GitHub 托管和自托管的运行程序。
- 工作流运行队列 – 每个存储库的排队工夫距离不超过 500 个工作流运行,距离为 10 秒。如果工作流运行达到此限度,则工作流运行将终止且无奈实现。
具体以最新版官网文档为主:usage-limits-billing-and-administration
二.GitHubAction 的应用
😀workflow
在我的项目库根门路下的 .github/workflows
目录中创立一个.yml 文件(或者 .yaml):
name: hello-github-actions
# 触发 workflow 的事件
on:
push:
# 分支随便
branches:
- master
# 一个 workflow 由执行的一项或多项 job
jobs:
# 一个 job 工作,工作名为 build
build:
#运行在最新版 ubuntu 零碎中
runs-on: ubuntu-latest
#步骤合集
steps:
#新建一个名为 checkout_actions 的步骤
- name: checkout_actions
#应用 checkout@v2 这个 action 获取源码
uses: actions/checkout@v2
#应用建一个名为 setup-node 的步骤
- name: setup-node
#应用 setup-node@v1 这个 action
uses: actions/setup-node@v1
#指定某个 action 可能须要输出的参数
with:
node-version: '14'
- name: npm install and build
#执行执行某个 shell 命令或脚本
run: |
npm install
npm run build
- name: commit push
#执行执行某个 shell 命令或脚本
run: |
git config --global user.email xxx@163.com
git config --global user.name xxxx
git add .
git commit -m "update" -a
git push
# 环境变量
env:
email: xxx@163.com
😂name
Workflow 的名字,轻易能够设置,就是工作流的名字。如果省略该字段,默认为以后 workflow 的文件名。
name: hello-github-actions
🤣on
触发的事件,能够是一个事件数组。
在代码仓库 Push 时触发:
#push 时触发
on: push
能够用数组指定多个条件触发:
#push 和 merge 时触发
on: [push, merge]
还能够对条件进行限度触发:
#当 master 分支 push 时触发,能够限定分支或标签。on:
push:
branches:
- master
残缺的事件列表,请查看官网文档。除了代码库事件,GitHub Actions 也反对内部事件触发,或者定时运行。
😉jobs
1.job
jobs 示意要执行的一项或多项工作。jobs 能够蕴含一个或多个 job,一个 job 就是一个工作,这个工作能够蕴含多个步骤(steps):
jobs:
job1:
...
job2:
...
须要留神的是每一个 Job 都是并发执行的并不是依照申明的先后顺序执行的,如果多个 job 之间存在依赖关系,那么你可能须要应用 needs :
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
这里的 needs 申明了 job2 必须期待 job1 胜利实现,job3 必须期待 job1 和 job2 顺次胜利实现。因而,这个 workflow 的运行程序顺次为:job1、job2、job3。needs 字段指定当前任务的依赖关系,即运行程序。
2.job->runs-on
runs-on 字段指定运行所须要的虚拟机环境。它是必填字段,目前可用的虚拟机如下:
- ubuntu-latest,ubuntu-18.04 或 ubuntu-16.04。
- windows-latest,windows-2019 或 windows-2016。
- macOS-latest 或 macOS-10.14。
指定 job 的运行环境:
jobs:
job1:
runs-on: ubuntu-18.04
job2:
runs-on: macos-10.15
job3:
runs-on: windows-2019
github 会提供一个配置很不错的服务器做为 runner,Windows 和 Linux 虚拟机的硬件规格:
- 2 核处理器。
- 7 GB 内存。
- 14 GB 固态硬盘空间。
macOS 虚拟机的硬件规格:
- 3 核处理器。
- 14 GB 内存。
- 14 GB 固态硬盘空间。
如果你有网络时延的需要,(比方推送及拉取镜像时产生的网络时延),你也能够自建 runner。
3.job->env
应用 env 能够给该工作或者是步骤配置环境变量:
env:
name: "zhangsan"
run: |
echo $name
环境变量能够配置在以下中央:
- jobs->job->env
- jobs->job->steps.env
4.job->steps
steps 字段指定每个 Job 的运行步骤,每个 job 由多个 step 形成,它会从上至下顺次执行。steps 能够蕴含一个或多个步骤,每个 step 步骤能够有:
- name:步骤名称,步骤的名称。
- env:该步骤所需的环境变量。
- id : 每个步骤的惟一标识符
- uses : 应用哪个 action,这个示意应用他人事后设置好的 Actions,比方因为我代码中要用到 python,所以就用了 actions/setup-
- python@v1 来设置 python 环境,不必我本人设置了。
- with: 指定某个 action 可能须要输出的参数。
- run: 执行哪些指令,具体运行什么命令行代码。
- continue-on-error : 设置为 true 容许此步骤失败 job 依然通过。
- timeout-minutes : step 的超时工夫。
例如:
`
yaml
…
name: Sync To Gitee
on: [push]
jobs:
sync:
runs-on: ubuntu-latest
steps:
# 创立一个打印环境变量的步骤
-
name: PrintName
env:
name: “zhangsan”
run: |
echo $name
# 创立一个装置 Python 环境的步骤
-
name: SetUpPython
uses: actions/setup-python@v1
with:
python-version: 3.7
# 创立一个装置 Python 包的步骤
-
name: Install dependencies
run: |
python -m pip install –upgrade pip
pip install requests
pip install bs4
pip install lxml
`
应用 uses 指的是这一步骤须要先调用哪个 Action。Action 是组成工作流最外围最根底的元素。每个 Action 能够看作封装的独立脚本,有本人的操作逻辑,咱们只须要 uses 并通过 with 传入参数即可。比方 actions/checkout@v2 就是官网社区奉献的用来拉取仓库分支的 Action,你不须要思考装置 git 命令工具,只须要把分支参数传入即可。
5.Action
Github Actions 是 GitHub 的继续集成服务。继续集成由很多操作组成,比方登录近程服务器,公布内容到第三方服务等等,这些雷同的操作齐全能够提取进去制作成脚本供所有人应用。GitHub 容许开发者把每个操作写成独立的脚本文件,寄存到代码仓库,使得其余开发者能够援用该脚本,这个脚本就是一个 Action。如果你须要某种性能的 Action 能够从 GitHub 社区共享的 action 官网市场查找,也能够本人编程 Action 开源进去供大家应用。既然 actions 是代码仓库,当然就有版本的概念,用户能够援用某个具体版本的 action。上面都是非法的 action 援用:
actions/setup-node@74bc508 # 指向一个 commit
actions/setup-node@v1.0 # 指向一个标签
actions/setup-node@master # 指向一个分支
😊GitHub Actions 中应用密文
在继续集成的过程中,咱们可能会应用到本人的敏感数据,这些数据不应该被开源并泄露。那么如何能力平安的应用这些敏感数据呢?GithubActions 提供了 Secrets 变量来实现这一成果。咱们能够在 github repo 上顺次点击 Settings -> Secrets-> Actions->New repository secret 创立一个敏感数据例如:OSS_KEY_ID,OSS_KEY_SECRET,而后咱们就能够在 GithubAction 脚本中应用这一变量了:
- name: setup aliyun oss
uses: manyuanrong/setup-ossutil@master
with:
endpoint: oss-cn-beijing.aliyuncs.com
access-key-id: ${{secrets.OSS_KEY_ID}}
access-key-secret: ${{secrets.OSS_KEY_SECRET}}
这里的 secret 就是一种 context,形容 CI/CD 一个 workflow 中的上下文信息,应用 ${{expression}}语法示意。更多 context 信息能够参考官网文档
😎GitHubAction 执行后果
对于 GitHubAction 的执行流程咱们能够通过 repo 上顺次点击 Actions 就能够看到 Action 的状态和执行后果等信息:
三. 示例
应用 GitHubAction 实现 Push 代码发送邮件告诉性能。次要通过 GitHub Action 监听代码 push 事件,并发送邮件(前提是邮箱须要开明 SMTP 服务)。
在我的项目中 ./github/workflows/ 门路下增加 .yml 或者 .yaml 文件,名字能够轻易取。在这里我取名为 github-action-email.yml:
name: github-action-email
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 检出代码
- name: CheckoutRepo
uses: actions/checkout@v2
# 获取 master 分支上最新一条提交的 git log
- name: GetLastLog
id: git_log
uses: Edisonboy/latest-git-log-action@main
with:
tag: origin/master
# 发送邮件
- name: Send email
uses: dawidd6/action-send-mail@v3
with:
server_address: smtp.qq.com
server_port: 465
username: ${{secrets.MAIL_USERNAME}}
password: ${{secrets.MAIL_PASSWORD}}
subject: Github Actions job result
to: ${{secrets.MAIL_TOUSERNAME}}
from: ${{secrets.MAIL_USERNAME}}
body: ${{github.repository}} push log : ${{steps.git_log.outputs.log}}
- secrets.XXX:GitHub 容许仓库所有者创立和治理须要保密性的参数。例如邮件的账号和明码都是属于敏感参数。能够通过我的项目
- Settings -> Secrets -> Actions 配置明码,在这里咱们增加 MAIL_USERNAME、MAIL_PASSWORD、MAIL_TOUSERNAME 三个配置参数(留神:这里的明码是指 SMTP 服务的受权明码)。
上下文:能够拜访工作流程运行、运行器环境、作业及步骤相干信息的形式 ${{github.repository}}:以后仓库的的所有者和仓库名称。${{steps.git_log_outputs.log}}:获取 step id 为 git_log 的输入集。
因为咱们定义 push 为触发条件,所以当咱们只有 push 代码后,咱们定义的 GitHub Action 才会被执行。而后在 GitHub 上的 Action 可能实时看到以后的执行状态。
转载至 GitHubActions 详解