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:

5.总结

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

相关文档


golang后端
Go语言后端技术分享,希望 [链接]的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交...

mojotv.cn

447 声望
33 粉丝
0 条评论
推荐阅读
Go语言详解:HTTP断点续传多线程下载原理
原文地址:Go语言详解:HTTP断点续传多线程下载原理

mojotv_cn阅读 2.1k

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.2k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

mojotv.cn

447 声望
33 粉丝
宣传栏