赞
踩
GitHub Actions允许构建一个完整的 CI/CD Pipeline,与 GitHub 生态系统深度集成,而无需使用 Travis CI 或者 Circle CI 等第三方服务,对于开源项目都是可以免费使用的。
为了触发Github工作流,我们需要定义一个yml文件
- workflow主要是为了定义什么时候做什么事情(on:什么时候,action:做什么事)
- 每个 workflow 由一个或多个 Job 组成,我们的 Build Workflow 包含 3 个 Job(Lint、Build 和 Test),而 Release Workflow 只包含一个 Release 的 Job。
- 每个 Job 都由多个 Step 组成,比如,“单元测试”的 Job 就包含获取代码、运行测试和生产代码覆盖率报告的几个步骤。
- Workflow 会被定义在代码仓库根目录下面的.github/workflows目录中的 YAML 文件中,该目录下面的每个文件就代表了不同的工作流。
例如:Build.yml
name: Build and Test on: push: branches: - master pull_request: jobs: lint: name: Lint runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Lint Go Code run: | export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 go get -u golang.org/x/lint/golint make lint test: name: Test runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Run Unit tests. run: make test-coverage - name: Upload Coverage report to CodeCov uses: codecov/codecov-action@v1.0.0 with: token: ${{secrets.CODECOV_TOKEN}} file: ./coverage.txt build: name: Build runs-on: ubuntu-latest needs: [lint, test] steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Build run: make build
# 1 当推送到master或者release分支时触发构建 on: push: branches: - master - release/* # 2 提交pr到master时构建 on: pull_request: branches: - master # 3 定时任务 on: schedule: - cron: 0 2 * * 1-5
其他语法见: https://help.github.com/articles/workflow-syntax-for-github-actions
yml中我们可以定义一个或多个job。
- steps包含完成某个job具体的步骤。
- actions 是可重复使用的工作单元,可由任何人在 GitHub 上构建和分发,我们可以在 GitHub marketplace 中找打各种各样的操作,通过指定包含 action 和 想使用的 ref 来进行操作:
# 当有push发生时,触发构建 name: CI on: [push] # jobs:定义一个或多个job jobs: # 每个job的构建环境及steps所做操作 build: # 该job在什么环境下运行 runs-on: ubuntu-latest # 该jobs需要做哪些操作 steps: - uses: actions/checkout@v1 - 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.
下面我将演示通过Github Actions构建两个workflow工作流。
- 推送代码到 master 分支或者创建 PR 的时候将触发 Build 的 workflow
- 当创建了一个新的 tag 的时候,会触发 Release 的 workflow,该工作流会发布一个新的应用版本。
git init
# 添加远程仓库地址
git remote add origin git@github.com:ziyifast/yi-github-actions.git
# 拉取分支
git fetch -p
git merge --ff-only
# 切换到main分支
git checkout main
这里主要讲解:main.yml的编写
Build Workflow 包含 3 个 Job(Lint、Build 和 Test)
- Lint:检测代码格式
- Build:构建代码
- Test:检查测试覆盖率
项目结构:
on:
push:
branches:
- master
pull_request:
整个 workflow 中包含了 3 个 Job:Lint、Test 和 Build,Lint 的 Job 定义如下:
下面我们指定了我们希望这个 Job 任务在 ubuntu 机器上运行(runs-on关键字)。Actions 现在支持 Linux、Mac、Windows 和 Docker 环境,在以后,也可以将自己的机器来作为 runners 运行,类似与 GitLab CI Runner。然后定义了该 Job 任务的执行步骤:
lint: name: Lint # 指定运行环境 runs-on: ubuntu-latest steps: # 安装Go环境,Github已经提供了对应的actions(可以理解为脚本,直接诶执行) - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.19 - name: Check out code uses: actions/checkout@v1 # 安装Go lint - name: Lint Go Code run: | export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 go get -u golang.org/x/lint/golint make lint
这里的定义唯一不同的是上传代码测试覆盖率使用的 action 是一个第三方的,当然这个 action 也在 marketplace 上面可以找到:
https://github.com/marketplace/actions/codecov
,我们会将测试的代码覆盖率上传到 CodeCov。这里我们需要使用 GitHub 的secrets来存储操作 CodeCov 所需要的Codecov Token,在 CodeCov 网站上通过 GitHub 用户授权登录,然后启用上面的[yi-github-actions]项目,就可以获得Codecov Token的值,然后在 GitHub 项目 settings -> Secrets 下面添加,Name 为CODECOV_TOKEN,Value 就是刚刚获取的Codecov Token的值。这样我们就完成了 Test 这个 Job 任务的操作声明。
- 以Github账户登录CodeCov官网
- 点击对应项目的Configure,拷贝token信息
- 找到对应项目的settings-Secrets and variable-添加Action Secret。Name 为CODECOV_TOKEN,Value 就是刚刚获取的Codecov Token的值。
拓展:
我们可以使用任何语言创建自己的 actions(只需要包含一个 Dockerfile 文件),如果你喜欢使用 Typescript 的话还可以直接使用官方提供的 action 开发工具包:https://github.com/actions/toolkit。
test: name: Test runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.19 - name: Check out code uses: actions/checkout@v1 - name: Run Unit tests. run: make test-coverage - name: Upload Coverage report to CodeCov uses: codecov/codecov-action@v1.0.0 with: token: ${{secrets.CODECOV_TOKEN}} file: ./coverage.txt
这样我们就完成了第一个 workflow
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。