repl.info

Go製ソフトウェアのCIやリリースをGithubActionsで行う

Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり を読んで、自分もどうやっているのか書いておこうと思ったので書く。

CIでテストを実行する

これはまあ、素朴にやる。テスト自体はMakefileに隠蔽しておくと手元でもCIと同じテストを実行できて便利。

---

 name: CI

 on: [push]

 jobs:

 

   run_test:

     name: Go Test

     runs-on: ubuntu-latest

     steps:

 

       - name: Set up Go 1.13

         uses: actions/setup-go@v1

         with:

           go-version: 1.13

         id: go

 

       - name: Check out code into the Go module directory

         uses: actions/checkout@v1

 

       - name: Run Test

         run: |

           make test

タグを打ってリリースする

masterブランチに対してタグを作成すると、Actionsで自動的にリリースされるようにしている。

---

 name: Release

 on:

   create:

     tags:

       - v*.*.*

     branches:

       - master

 

 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.GORELEASER_TOKEN}}

リリースにはGoReleaserを使っている。これはtakaishi/kelmの.goreleaser.yaml。バージョンの埋め込みなども行なっている。

# This is an example goreleaser.yaml file with some sane defaults.

 # Make sure to check the documentation at http://goreleaser.com

 before:

   hooks:

     # you may remove this if you don't use vgo

     - go mod download

     # you may remove this if you don't need go generate

     - go generate ./...

 builds:

   - env:

       - CGO_ENABLED=0

     ldflags:

       -X github.com/takaishi/kelm/config.Version={{.Version}}

 archive:

   replacements:

     darwin: Darwin

     linux: Linux

     windows: Windows

     amd64: x86_64

 checksum:

   name_template: 'checksums.txt'

 snapshot:

   name_template: "{{ .Tag }}-next"

 changelog:

   sort: asc

   filters:

     exclude:

       - '^docs:'

       - '^test:'

 brew:

   github:

     owner: takaishi

     name: homebrew-fomulas

   commit_author:

     name: goreleaserbot

     email: goreleaser@carlosbecker.com

   description: "CLI tool to Generate and insert markdown's table of contents"

   homepage: "https://github.com/takaishi/kelm"

   install: |

     bin.install Dir['kelm']

   test: |

     system "#{bin}/kelm"

このように、環境ごとのアーカイブファイルやチェックサム、チェンジログを作ってくれる。Homebrew用のfomulasも更新する機能があって便利。

コンテナイメージをビルドする

ソフトウェアによってはコンテナイメージをビルドしたいことがある。この場合も、ActionsでビルドしてDockerHubにプッシュしている。これはtakaishi/openstack-sg-controller の例。

---

 name: Docker Image CI

 on:

   push:

     tags:

       - v*.*.*

 env:

   DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN}}

 jobs:

   build:

     runs-on: ubuntu-latest

     steps:

       - uses: actions/checkout@v1

       - name: Build the Docker image

         run: |

           tag=$(echo ${{ github.ref }} | sed 's/refs\/tags\///g' | tr -d '\n')

           docker login -u rtakaishi -p $DOCKER_HUB_TOKEN

           docker build . --file Dockerfile --tag rtakaishi/openstack-sg-controller:${tag}

           docker push rtakaishi/openstack-sg-controller:${tag}

タグの作成はlinyows/git-semvを使っている

linyows/git-semv というgit pluginがあって、これを使ってタグを作っている。major/minor/patchのタグ作成以外にもpre-releaseタグの作成ができたりして便利。

課題:リリース時にChangeLogをどう作るか

今の方法だとコミットログが羅列してあるだけなので、ちょっと読みにくいかなあと思っている。また、PullRequestがある場合はそちらの情報を表示したい。CHANGELOGファイルに自動追記されると変更を追いかけやすくて嬉しいと思うが、どうやるのがいいのか悩み中である。