CI/CD

CI/CD 是持续集成、持续部署(Continuous Integration and either Continuous Delivery or Continuous Deployment) 的简写。github 在最近的更新中提供了 github actions 用于个人或者企业项目的 CI/CD,并号称 "any language, any cloud"。

本文使用 github actions release 一个简单的 golang 项目用以试用和体验。

示例代码 & 试验推荐 build workflow

// main.go
package main

import (
    "fmt"
    "github.com/sysu-yunz/go-base/utils"
    "math"
)

func main(){
    fs := []float64{1.1, 3.5, 9, 100, 0.89765, math.Pi, math.E}
    fmt.Println(utils.MaxFloatSlice(fs))
}

调用 go-base/utils 中的 MaxFloatSlice 函数,返回 float64 切片的最大值并打印。使用 go mod 做包管理。 把项目 push 到 github 上,用 actions 用推荐的 Go build workflow 配置文件新建一个项目 workflow, 改名为 build.yml 并 commit。

新建 Release workflow

同步代码后,可以在 repo 的 .github/workflows/build.yml 中看到刚才的内容。

name: build

on:
    push:
        branches: [ master ]
    pull_request:
        branches: [ master ]

jobs:

    build:
        name: Build
        runs-on: ubuntu-latest
        steps:

            - name: Set up Go 1.x
            uses: actions/setup-go@v2
            with:
                go-version: ^1.13
            id: go

            - name: Check out code into the Go module directory
            uses: actions/checkout@v2

            - name: Get dependencies
            run: |
                go get -v -t -d ./...
                if [ -f Gopkg.toml ]; then
                    curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
                    dep ensure
                fi

            - name: Build
            run: go build -v .

            - name: Test
            run: go test -v .

name 是 workflow 名,on 设定了触发条件,jobs 说明了本 workflow 完成哪些自动化的工作,steps 中包含了具体的步骤。

我们的目标是自动 release,所以在 build.yml 同级目录下新建 release.yml, 作为另一个 workflow:

name: Release
on:
    create:
        tags:
        - v*

jobs:
    release:
        name: Release on GitHub
        runs-on: ubuntu-latest
        steps:

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

            - name: Validates GO releaser config
                uses: docker://goreleaser/goreleaser:latest
                with:
                args: check

            - name: Create release on GitHub
                uses: docker://goreleaser/goreleaser:latest
                with:
                args: release
                env:
                GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

此 workflow 指明当使用创建版本 tags 的时候用 go releaser 的 docker 镜像发布二进制包。

git tag v0.1.0
git push --tags

执行以下命令,打开 actions 可以看到 workflow 正在执行,执行完后就可以在项目 releases 中发现新的 release 以及 log 了。