第8回ゆるはち.it: CI/CDについてゆるく話す - https://yuruhachi-it.connpass.com/event/123888/ での LT 資料です。
仕事でGoで書いたWindows向けの小さなアプリをAppVeyorを使ってCIした話
View Slide
自己紹介- 株式会社クリプラでクラウド電子カルテを開発している Railsエンジニア- https://clipla.jp/- 最近は Go で Windows 向けアプリを作成中- こちらにまつわる CI のご紹介
AppVeyor とは- Windows 環境の CI ができるやつ- (Windows 以外も対応してるけど・・)- 価格- Public なリポジトリなら無料- 2019年3月時点で Private なリポジトリは $29/month
設定方法- Web からでも YAML でも設定可能- Web の場合は→- YAMLの場合はappveyor.yml で
設定方法- Web で設定したものをYAML へ Export することも可能
Build Worker Image- 現時点でのデフォルト:- Visual Studio 2015- ubuntu 等も選択可能- ubuntu を Worker Image に使った Getting started ページもある- Getting started with AppVeyor forLinux | AppVeyor
Stack (※ 今回は使わず)- stack: go 1.11 のように指定することで公式の用意した Go を使える
Build Cache- 指定したディレクトリやファイルの内容をビルド間で保持できる機能
AppVeyor でテストを行う例
appveyor.yml に変更があったら cache からの restore を skip するこちらは Windows のコマンド> https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ifif [not] exist [else ]公式でまだ Go1.12 がサポートされていないためソースからインストールmsiexec /i でインストールhttps://docs.microsoft.com/ja-jp/windows/desktop/Msi/command-line-optionsあらかじめ environment の箇所で環境変数 GOBIN を c:\gobin に設定しているため、$ goinstall した時に c:\gobin 以下にツールをインストールしてくれるどこでもよさそう。Go の Modules 導入以前は制限があったかも。Go のモジュールシステムが過渡期なのでこのような指定が必要詳細: https://github.com/golang/go/wiki/Modules
AppVeyor にGoReleaser を組み合わせることでtag を push した時に自動でGitHub Releases に Publish する例
if %APPVEYOR_REPO_TAG% equ true <コマンド> で tagを push した時だけ実行したいコマンドを定義できるdeploy_script 内での goreleaser release の実行
GoReleaser の設定ファイルは .goreleaser.yaml- builds の goos と goarch で指定した組み合わせをすべて生成してくれる- 右の例では 6 通り
GoReleaser には環境変数 GITHUB_TOKEN が必要- GoReleaser を使ってリリースするためには repo の scope を持った GitHub token を環境変数 GITHUB_TOKEN に設定する必要がある
GitHub token の作成- https://github.com/settings/tokens/new で作るだけ
AppVeyor で環境変数 GITHUB_TOKEN を指定する
あとは tag を push するだけ- tag を push するだけでGitHub Releases にリリースが作成される
まとめ
- 話したこと- AppVeyor の概要:- 設定方法、Build Worker Image、Stack、Build Cache- プロジェクトでの実例:- Go1.12 をソースからインストールして statik もインストールしてテスト- AppVeyor + GoReleaser:- AppVeyor と GoReleaser を組み合わせて、tag を push した時に自動でGitHub Releases に publish- その他- 今回試していなかったけれど、コードが大きい場合は Azure Pipelines の方が良いかも?- https://azure.microsoft.com/ja-jp/services/devops/pipelines/- Public なリポジトリなら無料で 10 個の並列ジョブ(時間制限なし)を実行可能らしい