GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。
公共存储库中标准 GitHub 托管的运行器和自托管运行器可免费使用 GitHub Actions。 对于专用存储库,每个 GitHub 帐户可获得一定数量的免费时间和存储以用于 GitHub 托管的运行器,具体取决于帐户所使用的产品。 超出包含数量的任何使用量都由支出限制控制。分钟数每月重置一次,而存储空间使用量不会重置。ci机器使用超过 2 核的 Windows 和 Ubuntu 运行器,将始终收取费用,包括在公共存储库中。其中GitHub Free 给的存储是 500M,2000分钟/月。在 GitHub 主机的 Windows 和 macOS 运行器上运行的作业,其消耗分钟数是在 Linux 运行器上运行的作业的 2 倍和 10 倍。 例如,1000 分钟的 Windows 使用时间将占用帐户中包含的 2000 分钟。 1000 分钟的 macOS 使用时间将占用帐户中包含的 10000 分钟。仓库使用的存储空间是 GitHub Actions 构件和 GitHub Packages 使用的存储空间总计。
操作路径:在GitHub右上角点击头像 -> Settings -> 左侧变栏目(Billing and Plans) -> Plans and usage -> Usage this month
可以分别看到 Action部分与Packages 的使用情况
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install -g bats
- run: bats -v
一个仓库可以定义多个工作流程,多个工作流的表现形式为 github/workflows/ 下存在多个不同的yml文件
name 以及 run-name 只是一个标识和展示的用途,不是特别关键
on:
# 只有push到master分支上才能触发这个action
push:
branches: [ "master" ]
# 定义了这个结点表示可以手动触发,手动触发时还支持定义一些自定义参数
workflow_dispatch:
# 定时执行,注意这里的定时时间都是世界标准时间UTC,和中国有时差
schedule:
- cron: 0 2 * * *
工作流运行由一个或多个 jobs 组成,默认情况下并行运行。 若要按顺序运行作业,可以使用 jobs.
.needs 关键字定义对其他作业的依赖关系。每个作业在 runs-on 指定的运行器环境中运行。
使用 jobs.
为作业提供唯一标识符。 键 job_id 是一个字符串,其值是作业配置数据的映射。 必须将 替换为对于 jobs 对象的唯一字符串。 必须以字母或 _ 开头,并且只能包含字母数字字符、- 或 _。
jobs:
my_first_job:
name: My first job
my_second_job:
name: My second job
jobs.
在此示例中,job1 必须在 job2 开始之前成功完成,并且 job3 等待 job1 和 job2 完成。
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
目前只支持 Windows、Ubuntu、macOS 三种运行器。注意 Windows和macOS如果使用时超过2核心则需要收费。支持的yml标签
Ubuntu 运行器已添加到名为 ubuntu-runners 的组中。 runs-on 键将作业发送到 ubuntu-runners 组中的任何可用运行器:
name: learn-github-actions
on: [push]
jobs:
check-bats-version:
runs-on:
group: ubuntu-runners
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install -g bats
- run: bats -v
jobs:
job1:
runs-on: ubuntu-latest
# Map a step output to a job output
outputs:
output1: ${{ steps.step1.outputs.test }}
output2: ${{ steps.step2.outputs.test }}
steps:
- id: step1
run: echo "test=hello" >> "$GITHUB_OUTPUT" # 要输出的内容统一指向这个环境变量
- id: step2
run: echo "test=world" >> "$GITHUB_OUTPUT"
job2:
runs-on: ubuntu-latest
needs: job1
steps:
- env:
OUTPUT1: ${{needs.job1.outputs.output1}} # 前面输出的内容可以在其它步骤引用,但是注意时序问题
OUTPUT2: ${{needs.job1.outputs.output2}}
run: echo "$OUTPUT1 $OUTPUT2"
uses 标签标识当前你需要用什么工具去做操作。例如,你要下载代码 需要用这个 actions/checkout@v3 ,如果你接下来是编译go代码,那你得有go sdk actions/setup-go@v3。这其中是一系列封装好的步骤脚本。你也可以字节开发这样一个工具并且发布到 github社区供他人使用。更多例子
例如 go版本
name: Go package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.15
- name: Build
run: go build -v ./...
- name: Test
run: go test -v ./...
例如 maven-java版本
name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn --batch-mode --update-snapshots package
有时候在编写action yml时 需要用到 账号,密码,cookie 等比较隐私的内容,不方便直接写在文件中。action有提供环境变量一样的引用方式。
操作路径
注意这里有 Secrets和Variables 两种变量。Secrets 变量设置完成后无法查看,在action流程执行中也无法将值打印出来,适合账号密码等比较隐私的场景。Variables 则是普通的环境变量,设置后可以直接看到值。
name: Study-CI
on:
# 只有push到master分支上才能触发这个action
push:
branches: [ "master" ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Go and Run Code Linting
uses: actions/setup-[email protected]
with:
go-version: 1.18
- name: Use variables # 使用vars关键词引用 Variables 中定义的变量
run: |
echo "repository variable : ${{ vars.REPOSITORY_VAR }}"
echo "organization variable : ${{ vars.ORGANIZATION_VAR }}"
echo "overridden variable : ${{ vars.OVERRIDE_VAR }}"
echo "variable from shell environment : $env_var"
- name: Go Build
run: go build -o main
- name: Go Run
run: ./main
- name: Ssh Romote Commands
uses: appleboy/ssh-[email protected]
with:
host: ${{ secrets.HOST }} # 直接使用secrets中的环境变量
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: cat readme.md
前面介绍的都是ci环节,cd及部署。GitHub action 本质上只提供一个ci的机器。部署需要你有自己的一台服务器。关于CD 社区中也有各云厂商自己开发的action 插件可用。搜索地址 可按照自己实际的情况各取所需。
如果不想用云厂商开发好的功能,也可以使用通用的 ssh action 自定义cd流程。
例如,这里就演示了 使用 appleboy/ssh-action 登录到远程主机上,并且在用户家目录下 查看了 readme.md 文件的内容。
# This is a basic workflow to help you get started with Actions
# 取个ci流程的名字
name: Study-CI
on:
# 只有push到master分支上才能触发这个action
push:
branches: [ "master" ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Go and Run Code Linting
uses: actions/setup-[email protected]
with:
go-version: 1.18
- name: Go Build
run: go build -o main
- name: Go Run
run: ./main
- name: Ssh Romote Commands # 使用ssh-action 登录远程主机执行脚本
uses: appleboy/ssh-[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: cat readme.md
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3 # 前面用一个横线标识 steps 有多个值是一个数组
- name: Use variables # 执行多行命令
run: |
echo "repository variable : ${{ vars.REPOSITORY_VAR }}"
echo "organization variable : ${{ vars.ORGANIZATION_VAR }}"
echo "overridden variable : ${{ vars.OVERRIDE_VAR }}"
echo "variable from shell environment : $env_var"
steps:
- name: Display the path
run: echo $PATH
shell: bash
第一个job计算3+7的结果写到文件math-homework.txt,第二job将第一个job的结果下载下来继续进行乘法计算 *9 并且将结果又写回原来的文件。第三步 下载下来这个文件,进行最终结果的打印。
name: Share data between jobs
on: [push]
jobs:
job_1:
name: Add 3 and 7
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
expr 3 + 7 > math-homework.txt
- name: Upload math result for job 1
uses: actions/upload-artifact@v3
with:
name: homework
path: math-homework.txt
job_2:
name: Multiply by 9
needs: job_1
runs-on: windows-latest
steps:
- name: Download math result for job 1
uses: actions/download-artifact@v3
with:
name: homework
- shell: bash
run: |
value=`cat math-homework.txt`
expr $value \* 9 > math-homework.txt
- name: Upload math result for job 2
uses: actions/upload-artifact@v3
with:
name: homework
path: math-homework.txt
job_3:
name: Display results
needs: job_2
runs-on: macOS-latest
steps:
- name: Download math result for job 2
uses: actions/download-artifact@v3
with:
name: homework
- name: Print the final result
shell: bash
run: |
value=`cat math-homework.txt`
echo The result is $value
本篇文章只是介绍了GitHub action 的一些最基础,最常用的内容。还有一些高级特性,比如条件控制,并发控制,权限管理,云厂商部署,容器化服务,标签管理,自定义运行器(自己提供ci机器)等。更多特性请参考官方文档