乐趣区

Golang使用Github-Actions-CI教程

Github Actions 是 Github 推出的一个新的功能, 可以为我们的项目自动化地构建工作流,
例如代码检查, 自动化打包, 测试, 发布版本等等. 入口在项目 pull request 的旁边.
Github Actions 目前处于 beta 阶段, 需要申请 Beta 体验资格.
Github Actions Beta 申请体验资格入口网站.

1. 什么是 Github Actions

GitHub Actions allow you to implement custom logic without having to create an app to perform the task you need.
You can combine GitHub Actions to create workflows using an action defined in your repository,
a public repository on GitHub, or a published Docker container image.
GitHub Actions are customizable and can use the GitHub API and any publicly available third-party APIs to interact with a repository.
For example, an action can publish npm modules, send SMS alerts when urgent issues are created, or deploy production ready code.
You can discover, create, and share your GitHub Actions with the GitHub community.

GitHub Actions 允许您实现自定义逻辑, 而无需创建应用程序来执行您需要的任务.
你可以通过通过在 Github public 仓库定义 Action 或者通过你发布的 docker 镜像来创建 workflow.
GitHub 操作是可自定义的, 可以调用 GitHub API 和任何公开可用的第三方 API 与 Github Repo 进行交互.
例如, 操作可以发布 npm 模块, 在发送紧急 Issue 时发送 SMS 警报, 或部署 production 代码.
您可以通过 GitHub 社区发现, 创建和共享您的 GitHub Actions.

2.Github Actions 能够做什么

  1. 通过 Github Actions 你可以每次 Github 事件 (push,pull-request,merge,issue,comment…) 执行你的代码.
  2. (Travis/CircleCI 功能相似)最常见的功能就是持续集成(CI), 你可以在 Github Actions 中创建测试代码, 使用 Email/SMS 接受测试的反馈.
  3. (Travis/CircleCI 功能相似)可以查看特定运行的日志.
  4. GitHub 操作支持运行任意代码, 因此您可以做的不仅仅是构建和测试代码.

3.Golang Github Actions 基本 workflow

工作流定义一个或多个 Job. 每个 Job 都包含多个步骤, 例如检查源代码, 安装 Go 工具链, 构建和测试 Go 代码等.
workflow 由 GitHub 托管的计算机上运行. 这些服务是对私有仓库收费, 功能仓库免费.

一下构建和测试 Go 包的最简单的 workflow. 在你的 public 仓库 .github/workflows/go.yml 中创建一下代码:

name: TechMojotvGo
on: push
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go 1.12
        uses: actions/setup-go@v1
        with:
          go-version: 1.12
        id: go

      - name: Check out source code
        uses: actions/checkout@v1

      - name: Build
        run: go build .

      - name: Test
        run: go test -v .

让我们来解读一下.github/workflows/go.yml

3.1 定义工作流的名称

name定义 GitHub Actions 的名称,Actions 在 GitHub 的 repo 视图的选项卡中可见.

name: TechMojotvGo

3.2 指定触发 workflow 的事件

工作流由 GitHub repo 中的事件触发. 有许多事件类型, 包括 push,pull request,merge… 等.

on:push 表示:当 Github 收到 push 代码.
您可以使用 yaml 数组指定多个事件:

on: [push, pull_request]

3.3 指定执行工作流的操作系统

runs-on 定义运行工作流的机器的操作系统. 最常见的:

  • ubuntu-latest:ubuntu 18.04(将来可能会更新)
  • macos-latest
  • windows-latest

常见的操作系统列表

3.4 定义 Job

Job 是一系列操作

jobs:
  build:
    name: BuildJobName

我们只定义一个 build 的 job, name可见名称为 BuildJobName.

我们可以定义多个 job. job 并行运行, 但它们是在一个空的环境中开始的, 所以如果你有多个步骤, 比如构建和测试, 那么把他们合并成一个单一任务会更快.

3.5 安装 Golang 工具链

- name: Set up Go 1.12
  uses: actions/setup-go@v1
  with:
    go-version: 1.12
  id: go

Actions 的美妙之处在于它们是开源的并且可以被共享.
actions/setup-go 是 https://github.com/actions/se…

Actions 可以是 JavaScript(node.js)脚本或 docker 镜像.
actions/setup-go 是一个 node.js actions.

name是人类可读的步骤名称.
Action 可以接受我们提供的参数 with go-version 是一个 actions/setup-go 能够解析的参数. 它定义了我们要安装的 Go 版本.

3.6 编译和测试代码

- name: Build
  run: go build .

- name: Test
  run: go test -v .

我们可以逐步执行任意命令.
Go 代码最常见的步骤是:构建它并运行测试. 执行命令时的默认工作目录是源代码目录. 当步骤失败时,workflow 将停止, 您将收到一封电子邮件.

4.Github 高级 feature

4.1 使用 secret

有时你需要使用一个你不能公开的 secret. 在此示例中, 我们有一个部署到 Netlify 帐户的项目.

在 GitHub UI 中, 我们定义了NETLIFY_TOKEN 使用 Netlify 进行身份验证所需的secret

接下来我们在 .github/workflows/go.yml 中使用他

- name: Netlify deploy
  env:
    NETLIFY_TOKEN: ${{secrets.NETLIFY_TOKEN}}
  run: |
    ./netlifyctl -A ${{secrets.NETLIFY_TOKEN}} deploy || true
    cat netlifyctl-debug.log || true

我们可以在工作流.yml 文件中访问 secret {{secrets.NETLIFY_TOKEN}} . 我们可以作为参数传递给用 runor 执行的命令, 如本例所示, 设置环境变量 use env.
请记住, 已记录执行命令的 stdoutstderr, 因此请小心不要打印 secret. 更多关于 secret 的信息.

4.2 调试 workflow

workflow 正在远程服务器上运行, 因此如果出现问题, 可能很难弄清楚原因.

这里有一些 tips:

  • 阅读有关机器设置(文件系统布局, 环境变量)和仔细检查脚本中的假设
  • 阅读有关机器上安装的软件的信息
  • 如果您不确定, 请添加更多日志记录. 例如, 如果您不确定当前目录是否是您期望的目录, 请在发生错误之前将其记录(在 Linux 上 echo “ 打印当前目录: pwd“)

5. 总结

由于 github action 还算比较新的功能, 大部分功能机制和 Travis/CircleCI 类似, 但是 Github Actions 可以获取更多的 Github Actions 权限, 目前还在 Beta 状态还有很多不足.

相关文档

  • https://github.com/features/a…
  • Github Action 配置模板: https://github.com/actions/st…
  • Github Beta 测试申请: https://github.com/features/a…
  • Github 操作虚拟环境: https://help.github.com/en/ar…
  • Github Action Workflow 语法: https://help.github.com/en/ar…
  • 原文地址 https://tech.mojotv.cn/go/golang-github-actions
退出移动版