List of Cross-Compile - text.Baldanders.info
tag:text.Baldanders.info,2020-09-30:/tags
2020-09-30T15:14:35+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
GitHub Actions でクロス・コンパイル(GoReleaser 編)
tag:text.Baldanders.info,2020-09-30:/golang/cross-compiling-in-github-actions-with-goreleaser/
2020-09-30T06:14:35+00:00
2023-02-19T02:19:52+00:00
公式の GitHub Action があるので,それを使えばよい。簡単!
Spiegel
https://baldanders.info/profile/
<p>以前(3年前だ!)に Travis CI と <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> でクロス・コンパイル&デプロイを行う方法を<a href="https://text.baldanders.info/golang/cross-compiling-in-travis-ci-with-goreleaser/" title="Travis CI でクロス・コンパイル(GoReleaser 編)">紹介</a>したが,今回は <a href="https://github.com/" title="GitHub">GitHub</a> Actions を使う方法を紹介する。
なお <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> 自体の説明については(だいぶ内容が古いが)以下の記事を参考にどうぞ。</p>
<ul>
<li><a href="https://text.baldanders.info/golang/cross-compiling-in-travis-ci-with-goreleaser/">Travis CI でクロス・コンパイル(GoReleaser 編)</a></li>
</ul>
<p>紹介と言っても公式の <a href="https://github.com/" title="GitHub">GitHub</a> Action があるので,それを使えばよい。</p>
<ul>
<li><a href="https://github.com/goreleaser/goreleaser-action">goreleaser/goreleaser-action: GitHub Action for GoReleaser</a></li>
</ul>
<p>リポジトリの <code>.github/workflows/</code> ディレクトリに YAML ファイル(例えば <code>build.yml</code>)を置き,以下のように記述する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">build</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tags</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">v*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goreleaser</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Checkout</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fetch-depth</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Set up Go</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/setup-go@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-version</span><span class="p">:</span><span class="w"> </span><span class="m">1.15</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Run GoReleaser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">goreleaser/goreleaser-action@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="l">release --rm-dist</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">GITHUB_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.GITHUB_TOKEN }}</span><span class="w">
</span></span></span></code></pre></div><p>これでバージョンタグを打った際に <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> によるクロス・コンパイルとデプロイが走る。
簡単!</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://tellme.tokyo/post/2020/02/04/release-go-cli-tool/">Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり | tellme.tokyo</a></li>
<li><a href="https://budougumi0617.github.io/2020/10/07/auto_release_by_goreleaser/">goreleaserとGitHub Actionsを使えばGoのCLIはgit tagをpushするだけでGitHubとHomeBrewに自動リリースできる - My External Storage</a></li>
<li><a href="https://zenn.dev/spiegel/articles/20230219-goreleaser-config">GoReleaser の設定のいくつかが DEPRECATED になっていた</a></li>
</ul>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/416Stewy0NS._SL160_.jpg" width="123" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B099928SJD?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語Go</a></dt>
<dd>アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)</dd>
<dd>丸善出版 2016-06-20 (Release 2021-07-13)</dd>
<dd>Kindle版</dd>
<dd>B099928SJD (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想は<a href="https://text.baldanders.info/remark/2016/07/go-programming-language/" >こちら</a>。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2021-05-22">2021-05-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語Go -->
Travis CI でクロス・コンパイル(GoReleaser 編)
tag:text.Baldanders.info,2017-11-02:/golang/cross-compiling-in-travis-ci-with-goreleaser/
2017-11-02T05:01:06+00:00
2020-01-18T11:33:18+00:00
クロス・コンパイルと GitHub への deploy をまとめてやってくれる GoReleaser というツールがあるらしい。
Spiegel
https://baldanders.info/profile/
<p>以前「<a href="https://text.baldanders.info/golang/cross-compiling-in-travis-ci/">Travis CI でクロス・コンパイル</a>」で <a href="https://github.com/mitchellh/gox" title="mitchellh/gox: A dead simple, no frills Go cross compile tool">mitchellh/gox</a> を使ったクロス・コンパイルと <a href="https://github.com/tcnksm/ghr" title="tcnksm/ghr: Create Github Release and upload artifacts in parallel">tcnksm/ghr</a> を使った <a href="https://github.com/" title="GitHub">GitHub</a> への deploy 手順を紹介したが,これらをまとめてやってくれる <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> というツールがあるらしい。</p>
<ul>
<li><a href="https://goreleaser.com/">GoReleaser | Deliver Go binaries as fast and easily as possible</a></li>
<li><a href="https://github.com/goreleaser/goreleaser">goreleaser/goreleaser: Deliver Go binaries as fast and easily as possible</a></li>
</ul>
<p>すでにあるプロジェクトで試すのはどうかと思ったので,まずは以下のデモ用のリポジトリを作って試してみることにした。</p>
<ul>
<li><a href="https://github.com/spiegel-im-spiegel/reldemo">spiegel-im-spiegel/reldemo</a></li>
</ul>
<p>ちなみに中身は,このまえ<a href="https://qiita.com/spiegel-im-spiegel/items/272c1b8c01eb287059e0">ついカッとなって</a>作った <a href="https://github.com/spiegel-im-spiegel/godump">spiegel-im-spiegel/godump</a> のコードを流用している。
おおっ,役に立ったじゃないか(笑)</p>
<h2><a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> の導入</h2>
<p>当然ながら <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> 自身は <a href="https://github.com/" title="GitHub">GitHub</a> 上でバイナリを配布しているので,そちらを使うのが手っ取り早い。</p>
<ul>
<li><a href="https://github.com/goreleaser/goreleaser/releases/latest">Releases · goreleaser/goreleaser</a></li>
</ul>
<p>ヘルプを見るとこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ goreleaser help
</span></span><span class="line"><span class="cl">NAME:
</span></span><span class="line"><span class="cl"> goreleaser - Deliver Go binaries as fast and easily as possible
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">USAGE:
</span></span><span class="line"><span class="cl"> goreleaser.exe [global options] command [command options] [arguments...]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VERSION:
</span></span><span class="line"><span class="cl"> 0.35.5, commit 11fee22a2edf211caec98f2bee97576d3160bdb7, built at 2017-10-25T11:49:23Z
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">COMMANDS:
</span></span><span class="line"><span class="cl"> init, i generate .goreleaser.yml
</span></span><span class="line"><span class="cl"> help, h Shows a list of commands or help for one command
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">GLOBAL OPTIONS:
</span></span><span class="line"><span class="cl"> --config FILE, --file FILE, -c FILE, -f FILE Load configuration from FILE (default: ".goreleaser.yml")
</span></span><span class="line"><span class="cl"> --release-notes FILE Load custom release notes from a markdown FILE
</span></span><span class="line"><span class="cl"> --skip-validate Skip all the validations against the release
</span></span><span class="line"><span class="cl"> --skip-publish Skip all publishing pipes of the release
</span></span><span class="line"><span class="cl"> --snapshot Generate an unversioned snapshot release
</span></span><span class="line"><span class="cl"> --rm-dist Remove ./dist before building
</span></span><span class="line"><span class="cl"> --parallelism value, -p value Amount of builds launch in parallel (default: 4)
</span></span><span class="line"><span class="cl"> --debug Enable debug mode
</span></span><span class="line"><span class="cl"> --help, -h show help
</span></span><span class="line"><span class="cl"> --version, -v print the version
</span></span></code></pre></div><p><a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> では <code>.goreleaser.yml</code> ファイルでビルドや deploy を制御しているようだ。
<code>goreleaser init</code> コマンドで雛形を生成してくれるみたいなので試してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ goreleaser init
</span></span><span class="line"><span class="cl"> • config created; please edit accordingly to your needs file=.goreleaser.yml
</span></span></code></pre></div><p>作成された <code>.goreleaser.yml</code> の中身はこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">project_name</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">release</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">github</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="l">spiegel-im-spiegel</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{.Tag}}'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">brew</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commit_author</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">goreleaserbot</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">email</span><span class="p">:</span><span class="w"> </span><span class="l">goreleaser@carlosbecker.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">install</span><span class="p">:</span><span class="w"> </span><span class="l">bin.install "reldemo"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">builds</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">goos</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">darwin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goarch</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">amd64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"386"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goarm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"6"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">main</span><span class="p">:</span><span class="w"> </span><span class="l">.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ldflags</span><span class="p">:</span><span class="w"> </span>-<span class="l">s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">binary</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">archive</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">tar.gz</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{
</span></span></span><span class="line"><span class="cl"><span class="s1"> .Arm }}{{ end }}'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">licence*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">LICENCE*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">license*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">LICENSE*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">readme*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">README*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">changelog*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CHANGELOG*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">snapshot</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="l">SNAPSHOT-{{ .Commit }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">checksum</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{ .ProjectName }}_{{ .Version }}_checksums.txt'</span><span class="w">
</span></span></span></code></pre></div><p>これをベースにアレンジしていくわけだ。</p>
<h2>設定ファイルの調整とクロス・コンパイル</h2>
<p>さて,修正した <code>.goreleaser.yml</code> がこれ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">project_name</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">release</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">github</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="l">spiegel-im-spiegel</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">builds</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">goos</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">darwin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">windows</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goarch</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">amd64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"386"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arm</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arm64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goarm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"6"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">main</span><span class="p">:</span><span class="w"> </span><span class="l">./cli/reldemo/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ldflags</span><span class="p">:</span><span class="w"> </span>-<span class="l">s -w -X github.com/spiegel-im-spiegel/reldemo/cli/reldemo/facade.Version={{ .Version }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">binary</span><span class="p">:</span><span class="w"> </span><span class="l">reldemo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">archive</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">tar.gz</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format_overrides</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">goos</span><span class="p">:</span><span class="w"> </span><span class="l">windows</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">zip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replacements</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">amd64</span><span class="p">:</span><span class="w"> </span><span class="l">64bit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">386</span><span class="p">:</span><span class="w"> </span><span class="l">32bit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arm</span><span class="p">:</span><span class="w"> </span><span class="l">ARM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arm64</span><span class="p">:</span><span class="w"> </span><span class="l">ARM64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">darwin</span><span class="p">:</span><span class="w"> </span><span class="l">macOS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linux</span><span class="p">:</span><span class="w"> </span><span class="l">Linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">windows</span><span class="p">:</span><span class="w"> </span><span class="l">Windows</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">LICENSE*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">README*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">snapshot</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="l">SNAPSHOT-{{ .Commit }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">checksum</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name_template</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{ .ProjectName }}_{{ .Version }}_checksums.txt'</span><span class="w">
</span></span></span></code></pre></div><p>主な変更点は以下の通り。</p>
<ul>
<li><code>brew</code> 項目はバッサリ捨てた</li>
<li>コンパイル対象の OS に Windows を加えた。更にアーキテクチャに ARM を加えた</li>
<li><code>ldflags</code> を現状のものに合わせた</li>
<li>圧縮フォーマットで Windows の場合は zip 圧縮にした。また名前の置き換えも行った</li>
</ul>
<p>これで実際にビルドを行ってみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ goreleaser --snapshot --skip-publish
</span></span><span class="line"><span class="cl"> • running goreleaser 0.35.5
</span></span><span class="line"><span class="cl"> • loading config file file=.goreleaser.yml
</span></span><span class="line"><span class="cl"> • publishing disabled in snapshot mode
</span></span><span class="line"><span class="cl"> • SETTING DEFAULTS
</span></span><span class="line"><span class="cl"> • GETTING AND VALIDATING GIT STATE
</span></span><span class="line"><span class="cl"> • releasing v0.0.9, commit 6b96405452b3b9af8817157629fce00acb81564e
</span></span><span class="line"><span class="cl"> • GENERATING CHANGELOG
</span></span><span class="line"><span class="cl"> • skipped reason=not available for snapshots
</span></span><span class="line"><span class="cl"> • LOADING ENVIRONMENT VARIABLES
</span></span><span class="line"><span class="cl"> • skipped reason=publishing is disabled
</span></span><span class="line"><span class="cl"> • CHECKING ./DIST
</span></span><span class="line"><span class="cl"> • BUILDING BINARIES
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARM64\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_32bit\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_64bit\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARMv6\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_64bit\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_32bit\reldemo
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_64bit\reldemo.exe
</span></span><span class="line"><span class="cl"> • building binary=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_32bit\reldemo.exe
</span></span><span class="line"><span class="cl"> • CREATING ARCHIVES
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARM64.tar.gz
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARMv6.tar.gz
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_64bit.zip
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_32bit.zip
</span></span><span class="line"><span class="cl"> • creating archive=dist\reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_64bit.zip
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_32bit.zip
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARM64.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARMv6.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • CREATING LINUX PACKAGES WITH FPM
</span></span><span class="line"><span class="cl"> • skipped reason=no output formats configured
</span></span><span class="line"><span class="cl"> • CREATING LINUX PACKAGES WITH SNAPCRAFT
</span></span><span class="line"><span class="cl"> • skipped reason=no summary nor description were provided
</span></span><span class="line"><span class="cl"> • CALCULATING CHECKSUMS
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_64bit.tar.gz
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARMv6.tar.gz
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_64bit.zip
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Windows_32bit.zip
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_Linux_ARM64.tar.gz
</span></span><span class="line"><span class="cl"> • checksumming file=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_macOS_32bit.tar.gz
</span></span><span class="line"><span class="cl"> • new release artifact artifact=reldemo_SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e_checksums.txt
</span></span><span class="line"><span class="cl"> • CREATING DOCKER IMAGES
</span></span><span class="line"><span class="cl"> • skipped reason=docker section is not configured
</span></span><span class="line"><span class="cl"> • RELEASING TO GITHUB
</span></span><span class="line"><span class="cl"> • skipped reason=--skip-publish is set
</span></span><span class="line"><span class="cl"> • CREATING HOMEBREW FORMULA
</span></span><span class="line"><span class="cl"> • skipped reason=--skip-publish is set
</span></span><span class="line"><span class="cl"> • SUCCESS!
</span></span></code></pre></div><p>これでビルドと(<code>README.md</code> や <code>LICENSE</code> ファイルを同梱した)圧縮ファイルの生成までできた。
fpm とか snapcraft とか Homebrew とか Docker イメージとか設定がないのでスキップしてるけど,今回はスルーの方向で。</p>
<p>まだバージョンタグを打ってないので <code>--snapshot</code> で。
また現時点では <a href="https://github.com/" title="GitHub">GitHub</a> に deploy して欲しくないので <code>--skip-publish</code> にしている。
OS とアーキテクチャの組み合わせで出来ないものはビルドされないのが分かるだろうか。</p>
<p>実際に生成された実行モジュールを起動してみると</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ reldemo -h
</span></span><span class="line"><span class="cl">Usage:
</span></span><span class="line"><span class="cl"> reldemo [flags] [binary file]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Flags:
</span></span><span class="line"><span class="cl"> -h, --help help for reldemo
</span></span><span class="line"><span class="cl"> -n, --name string value name (default "dumpList")
</span></span><span class="line"><span class="cl"> -v, --vaersion output version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ reldemo -v
</span></span><span class="line"><span class="cl">reldemo SNAPSHOT-6b96405452b3b9af8817157629fce00acb81564e
</span></span></code></pre></div><p>という感じでバージョン番号にスナップショット情報が入っているのがわかると思う。</p>
<p>なお <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> でビルドする際は全てのファイルがコミットされている必要がある。
したがって <code>.goreleaser.yml</code> ファイルの調整に手こずるとコミット履歴がアレなことになる。</p>
<h2><a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> との連携と <a href="https://github.com/" title="GitHub">GitHub</a> への Deploy</h2>
<p>「<a href="https://text.baldanders.info/golang/cross-compiling-in-travis-ci/">Travis CI でクロス・コンパイル</a>」でも書いたが <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> から <a href="https://github.com/" title="GitHub">GitHub</a> へ Deploy するためには <a href="https://github.com/" title="GitHub">GitHub</a> のアクセス・トークンを取得して <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> の環境変数としてセットする必要がある。</p>
<p><a href="https://github.com/" title="GitHub">GitHub</a> のアクセス・トークンは “Settings” の “Developer settings” → “Personal access tokens” のページで取得できる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/24367702843/"><img src="https://photo.baldanders.info/flickr/image/24367702843_m.png" srcset="https://photo.baldanders.info/flickr/image/24367702843_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="get access token in GitHub" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/24367702843/">get access token in GitHub</a></div></figcaption>
</figure>
<p>repo の権限のみを付けること。
この access token を <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> で参照するには, “Settings” の “Environment Variables” でセットすればよい。
Build log にこの access token が表示されないようにすること。</p>
<p>今回の <code>.travis.yml</code> の内容はこんな感じ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">language</span><span class="p">:</span><span class="w"> </span><span class="l">go</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">go</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="m">1.9</span><span class="l">.*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">DEP_VERSION="0.4.1"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">before_install</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Download the binary to bin folder in $GOPATH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">curl -L -s https://github.com/golang/dep/releases/download/v${DEP_VERSION}/dep-linux-amd64 -o $GOPATH/bin/dep</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Make the binary executable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">chmod +x $GOPATH/bin/dep</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">install</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">$GOPATH/bin/dep ensure -v</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">script</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v ./...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">after_success</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash</span><span class="w">
</span></span></span></code></pre></div><p>最後の行が <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> 起動に関する記述である。
<a href="https://github.com/" title="GitHub">GitHub</a> リポジトリにタグが打たれている場合は <code>$TRAVIS_TAG</code> にタグの値が入る。
したがってタグがない場合は <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> は起動しない。</p>
<p><code>https://git.io/goreleaser</code> は短縮 URL で,中身は <a href="https://github.com/goreleaser/get" title="goreleaser/get: Get the latest goreleaser binary">goreleaser/get</a> の <code>get</code> ファイルでシェル・スクリプトになっている。
こんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/sh
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nb">set</span> -e
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">TAR_FILE</span><span class="o">=</span><span class="s2">"/tmp/goreleaser.tar.gz"</span>
</span></span><span class="line"><span class="cl"><span class="nv">RELEASES_URL</span><span class="o">=</span><span class="s2">"https://github.com/goreleaser/goreleaser/releases"</span>
</span></span><span class="line"><span class="cl"><span class="nb">test</span> -z <span class="s2">"</span><span class="nv">$TMPDIR</span><span class="s2">"</span> <span class="o">&&</span> <span class="nv">TMPDIR</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>mktemp -d<span class="k">)</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">last_version<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl"> curl -sL -o /dev/null -w %<span class="o">{</span>url_effective<span class="o">}</span> <span class="s2">"</span><span class="nv">$RELEASES_URL</span><span class="s2">/latest"</span> <span class="p">|</span>
</span></span><span class="line"><span class="cl"> rev <span class="p">|</span>
</span></span><span class="line"><span class="cl"> cut -f1 -d<span class="s1">'/'</span><span class="p">|</span>
</span></span><span class="line"><span class="cl"> rev
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">download<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl"> <span class="nb">test</span> -z <span class="s2">"</span><span class="nv">$VERSION</span><span class="s2">"</span> <span class="o">&&</span> <span class="nv">VERSION</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>last_version<span class="k">)</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"> <span class="nb">test</span> -z <span class="s2">"</span><span class="nv">$VERSION</span><span class="s2">"</span> <span class="o">&&</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">"Unable to get goreleaser version."</span> ><span class="p">&</span><span class="m">2</span>
</span></span><span class="line"><span class="cl"> <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"> <span class="o">}</span>
</span></span><span class="line"><span class="cl"> rm -f <span class="s2">"</span><span class="nv">$TAR_FILE</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"> curl -s -L -o <span class="s2">"</span><span class="nv">$TAR_FILE</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s2">"</span><span class="nv">$RELEASES_URL</span><span class="s2">/download/</span><span class="nv">$VERSION</span><span class="s2">/goreleaser_</span><span class="k">$(</span>uname -s<span class="k">)</span><span class="s2">_</span><span class="k">$(</span>uname -m<span class="k">)</span><span class="s2">.tar.gz"</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">download
</span></span><span class="line"><span class="cl">tar -xf <span class="s2">"</span><span class="nv">$TAR_FILE</span><span class="s2">"</span> -C <span class="s2">"</span><span class="nv">$TMPDIR</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"><span class="s2">"</span><span class="si">${</span><span class="nv">TMPDIR</span><span class="si">}</span><span class="s2">/goreleaser"</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span>
</span></span></code></pre></div><p>要するに <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> の最新バージョンを取ってきて実行しているのである。</p>
<p>これで全ての準備が整ったので,コミットして origin/master にマージし,タグを討つ。
しばらくして <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> 側の処理が終われば <a href="https://github.com/spiegel-im-spiegel/reldemo/releases" title="Releases · spiegel-im-spiegel/reldemo">Releases</a> ページに反映される。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/26327727169/"><img src="https://photo.baldanders.info/flickr/image/26327727169_m.png" srcset="https://photo.baldanders.info/flickr/image/26327727169_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="Release page in GitHub" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/26327727169/">Release page in GitHub</a></div></figcaption>
</figure>
<p>Changelog も <a href="https://goreleaser.com/" title="GoReleaser | Deliver Go binaries as fast and easily as possible">GoReleaser</a> が生成している。
コミット・ログを元に生成しているので,ログがショボいと,上の図のように, Changelog もショボくなる。
まぁ,最悪は手直しすればいいんだけどね<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<p>こんなところかな。</p>
<p><code>.goreleaser.yml</code> を自分の気に入るように調整していく作業は悩ましいが,一度出来てしまえば他プロジェクトでも使い回しがし易いと思う。そうなればリリース管理はかなり楽になるはずである。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="http://rnitame.hatenablog.com/entry/automate-golang-binary-distribution">goreleaser と Travis CI で Golang のバイナリ配布を自動化する - /storage/tummy.log</a></li>
<li><a href="https://qiita.com/suin/items/d643a0ccb6270e8e3734">Go言語: ビルド時にバージョン情報を埋め込みたい - Qiita</a></li>
<li><a href="http://blog.shibayu36.org/entry/2017/10/04/193000">goreleaserを使ってGoで書いたツールのバイナリをGithub Releasesで配布する - $shibayu36->blog;</a></li>
<li><a href="http://sue445.hatenablog.com/entry/2017/01/30/214345">Travis CIでdepを使う - くりにっき</a></li>
<li><a href="https://qiita.com/knqyf263/items/53dd0d0916afc5472281">goreleaserでHomebrewのFormulaを自動生成する - Qiita</a></li>
<li><a href="https://medium.com/@robdefeo/cross-compile-with-cgo-and-goreleaser-6af884731222">Cross compile with CGO and GoReleaser - Rob De Feo - Medium</a>
<ul>
<li><a href="https://github.com/mailchain/mailchain">GitHub - mailchain/mailchain: Using Mailchain, blockchain users can now send and receive rich-media HTML messages with attachments via a blockchain address.</a> : 実装例</li>
</ul>
</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> への <a href="https://github.com/golang/dep" title="golang/dep: Go dependency management tool">dep</a> インストール手順については <a href="https://golang.github.io/dep/docs/FAQ.html" title="FAQ · dep">FAQ.md</a> を参考にした。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>特定の単語を含むログをフィルタリングする設定も <code>.goreleaser.yml</code> でできる。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Travis CI でクロス・コンパイル
tag:text.Baldanders.info,2016-02-13:/golang/cross-compiling-in-travis-ci/
2016-02-13T10:37:11+00:00
2019-07-01T13:48:09+00:00
今回は Travis CI から GitHub へ mitchellh/gox で生成した実行バイナリを deploy することを考える。
Spiegel
https://baldanders.info/profile/
<h2>Gox でまとめてクロス・コンパイル</h2>
<p><a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>の特徴のひとつにクロス・コンパイルの容易さがあるが,複数プラットフォームのビルドをまとめて行う <a href="https://github.com/mitchellh/gox" title="mitchellh/gox: A dead simple, no frills Go cross compile tool">mitchellh/gox</a> を使うと便利である。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go get github.com/mitchellh/gox
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$gox -h
</span></span><span class="line"><span class="cl">Usage: gox [options] [packages]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Gox cross-compiles Go applications in parallel.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> If no specific operating systems or architectures are specified, Gox
</span></span><span class="line"><span class="cl"> will build for all pairs supported by your version of Go.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Options:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> -arch="" Space-separated list of architectures to build for
</span></span><span class="line"><span class="cl"> -build-toolchain Build cross-compilation toolchain
</span></span><span class="line"><span class="cl"> -cgo Sets CGO_ENABLED=1, requires proper C toolchain (advanced)
</span></span><span class="line"><span class="cl"> -gcflags="" Additional '-gcflags' value to pass to go build
</span></span><span class="line"><span class="cl"> -ldflags="" Additional '-ldflags' value to pass to go build
</span></span><span class="line"><span class="cl"> -tags="" Additional '-tags' value to pass to go build
</span></span><span class="line"><span class="cl"> -os="" Space-separated list of operating systems to build for
</span></span><span class="line"><span class="cl"> -osarch="" Space-separated list of os/arch pairs to build for
</span></span><span class="line"><span class="cl"> -osarch-list List supported os/arch pairs for your Go version
</span></span><span class="line"><span class="cl"> -output="foo" Output path template. See below for more info
</span></span><span class="line"><span class="cl"> -parallel=-1 Amount of parallelism, defaults to number of CPUs
</span></span><span class="line"><span class="cl"> -rebuild Force rebuilding of package that were up to date
</span></span><span class="line"><span class="cl"> -verbose Verbose mode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Output path template:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> The output path for the compiled binaries is specified with the
</span></span><span class="line"><span class="cl"> "-output" flag. The value is a string that is a Go text template.
</span></span><span class="line"><span class="cl"> The default value is "{{.Dir}}_{{.OS}}_{{.Arch}}". The variables and
</span></span><span class="line"><span class="cl"> their values should be self-explanatory.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Platforms (OS/Arch):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> The operating systems and architectures to cross-compile for may be
</span></span><span class="line"><span class="cl"> specified with the "-arch" and "-os" flags. These are space separated lists
</span></span><span class="line"><span class="cl"> of valid GOOS/GOARCH values to build for, respectively. You may prefix an
</span></span><span class="line"><span class="cl"> OS or Arch with "!" to negate and not build for that platform. If the list
</span></span><span class="line"><span class="cl"> is made up of only negations, then the negations will come from the default
</span></span><span class="line"><span class="cl"> list.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Additionally, the "-osarch" flag may be used to specify complete os/arch
</span></span><span class="line"><span class="cl"> pairs that should be built or ignored. The syntax for this is what you would
</span></span><span class="line"><span class="cl"> expect: "darwin/amd64" would be a valid osarch value. Multiple can be space
</span></span><span class="line"><span class="cl"> separated. An os/arch pair can begin with "!" to not build for that platform.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> The "-osarch" flag has the highest precedent when determing whether to
</span></span><span class="line"><span class="cl"> build for a platform. If it is included in the "-osarch" list, it will be
</span></span><span class="line"><span class="cl"> built even if the specific os and arch is negated in "-os" and "-arch",
</span></span><span class="line"><span class="cl"> respectively.
</span></span></code></pre></div><p>オプションは色々あるが,とりあえずパッケージを指定して起動すれば全てのプラットフォームについてビルドを行う<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
私が今つくってる <a href="https://github.com/spiegel-im-spiegel/gpgpdump" title="spiegel-im-spiegel/gpgpdump: gpgpdump - OpenPGP packet visualizer">gpgpdump</a> を例にすると</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go get get github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ gox -output "goxdist/{{.OS}}_{{.Arch}}/{{.Dir}}" github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">--> netbsd/arm: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> windows/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> freebsd/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> darwin/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> darwin/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> linux/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> linux/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> linux/arm: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> freebsd/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> netbsd/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> freebsd/arm: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> netbsd/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> openbsd/amd64: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> openbsd/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">--> windows/386: github.com/spiegel-im-spiegel/gpgpdump
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ls -l goxdist
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 darwin_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 darwin_amd64/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 freebsd_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 freebsd_amd64/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 freebsd_arm/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 linux_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 linux_amd64/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 linux_arm/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 netbsd_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 netbsd_amd64/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 netbsd_arm/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 openbsd_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 openbsd_amd64/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:42 windows_386/
</span></span><span class="line"><span class="cl">drwx 0 2016-02-13 17:41 windows_amd64/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ls -l goxdist/windows_amd64
</span></span><span class="line"><span class="cl">-rw- 5712896 2016-02-13 17:41 gpgpdump.exe
</span></span></code></pre></div><p>といい感じに出力してくれる。</p>
<p>OS を指定する場合は <code>-os "linux windows"</code> のように指定する。
アーキテクチャは <code>-arch</code> オプションを, OS とアーキテクチャを組み合わせる場合は <code>-osarch linux/arm</code> などとする。</p>
<p><code>-output</code> オプションの <code>"goxdist/{{.OS}}_{{.Arch}}/{{.Dir}}"</code> は出力先のテンプレートで <code>{{ }}</code> で囲まれている部分に実際の値が埋め込まれる。
たとえば OS が windows でアーキテクチャが amd64 なら <code>goxdist/windows_amd64/gpgpdump</code> と展開されるわけだ<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<p>このようにクロス・コンパイルが非常に簡単なので <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> などで複数プラットフォームのバイナリを生成するのも難しくない。</p>
<h2>ghr を使って GitHub に Deploy する</h2>
<p>今回は <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> から <a href="https://github.com/" title="GitHub">GitHub</a> へ <a href="https://github.com/mitchellh/gox" title="mitchellh/gox: A dead simple, no frills Go cross compile tool">mitchellh/gox</a> で生成した実行バイナリを deploy することを考える。</p>
<p><a href="https://github.com/mitchellh/gox" title="mitchellh/gox: A dead simple, no frills Go cross compile tool">mitchellh/gox</a> で生成した実行バイナリをそのままアップしてもいいのだが,ちょっと気持ち悪いので<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>,まずは zip で固めてしまおう。
以下のような簡単な shell script を書いてみた。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="nv">DIR</span><span class="o">=</span><span class="sb">`</span><span class="nb">pwd</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">mkdir ./goxdist/dist
</span></span><span class="line"><span class="cl"><span class="k">for</span> PLATFORM in <span class="k">$(</span>find ./goxdist -mindepth <span class="m">1</span> -maxdepth <span class="m">1</span> -type d<span class="k">)</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> <span class="nv">PLATFORM_NAME</span><span class="o">=</span><span class="k">$(</span>basename <span class="si">${</span><span class="nv">PLATFORM</span><span class="si">}</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="o">[</span> <span class="si">${</span><span class="nv">PLATFORM_NAME</span><span class="si">}</span> <span class="o">=</span> <span class="s2">"dist"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl"> <span class="k">continue</span>
</span></span><span class="line"><span class="cl"> <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">cd</span> <span class="si">${</span><span class="nv">PLATFORM</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"> zip <span class="si">${</span><span class="nv">DIR</span><span class="si">}</span>/goxdist/dist/<span class="si">${</span><span class="nv">PLATFORM_NAME</span><span class="si">}</span>.zip ./*
</span></span><span class="line"><span class="cl"> <span class="nb">cd</span> <span class="si">${</span><span class="nv">DIR</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span></code></pre></div><p>先ほど <code>goxdist</code> フォルダ以下に生成した各バイナリをひとつづつ zip 圧縮して <code>goxdist/dist</code> フォルダに置くだけの簡単なお仕事。
これで <code>goxdist/dist</code> フォルダの中身を <a href="https://github.com/" title="GitHub">GitHub</a> に deploy すればよい。
<a href="https://github.com/" title="GitHub">GitHub</a> への deploy には <a href="https://github.com/tcnksm/ghr" title="tcnksm/ghr: Create Github Release and upload artifacts in parallel">tcnksm/ghr</a> が便利である。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go get github.com/tcnksm/ghr
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ghr -h
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage: ghr [options] TAG PATH
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> ghr is a tool to create Release on Github and upload your artifacts to
</span></span><span class="line"><span class="cl"> it. ghr parallelizes upload multiple artifacts.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> You can use ghr on GitHub Enterprise. Change URL by GITHUB_API env var.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Options:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --username, -u GitHub username. By default, ghr extracts user
</span></span><span class="line"><span class="cl"> name from global gitconfig value.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --repository, -r GitHub repository name. By default, ghr extracts
</span></span><span class="line"><span class="cl"> repository name from current directory's .git/config
</span></span><span class="line"><span class="cl"> value.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --token, -t GitHub API Token. To use ghr, you will first need
</span></span><span class="line"><span class="cl"> to create a GitHub API token with an account which
</span></span><span class="line"><span class="cl"> has enough permissions to be able to create releases.
</span></span><span class="line"><span class="cl"> You can set this value via GITHUB_TOKEN env var.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --parallel=-1 Parallelization factor. This option limit amount
</span></span><span class="line"><span class="cl"> of parallelism of uploading. By default, ghr uses
</span></span><span class="line"><span class="cl"> number of logic CPU of your PC.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --delete Delete release if it already created. If you want
</span></span><span class="line"><span class="cl"> to recreate release itself from begining, use
</span></span><span class="line"><span class="cl"> this. Just want to upload same artifacts to same
</span></span><span class="line"><span class="cl"> release again, use --replace option.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --replace Replace artifacts if it is already uploaded. Same
</span></span><span class="line"><span class="cl"> artifact measn, same release and same artifact
</span></span><span class="line"><span class="cl"> name.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> --stat=false Show number of download of each release and quit.
</span></span><span class="line"><span class="cl"> This is special command.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Examples:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> $ ghr v1.0 dist/ Upload all artifacts which are in dist directory
</span></span><span class="line"><span class="cl"> with version v1.0.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> $ ghr --stat Show download number of each relase and quit.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ghr --username spiegel-im-spiegel --token $GITHUB_TOKEN v0.1.2 goxdist/dist/
</span></span><span class="line"><span class="cl">--> Uploading: windows_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: linux_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: darwin_386_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: darwin_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: freebsd_386_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: freebsd_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: freebsd_arm_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: linux_386_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: netbsd_arm_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: linux_arm_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: netbsd_386_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: netbsd_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: openbsd_amd64_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: openbsd_386_v0.1.2.zip
</span></span><span class="line"><span class="cl">--> Uploading: windows_386_v0.1.2.zip
</span></span></code></pre></div><p>てな感じで deploy できる。
ちなみに <code>$GITHUB_TOKEN</code> には <a href="https://github.com/" title="GitHub">GitHub</a> の access token をセットする。
Access token は <a href="https://github.com/" title="GitHub">GitHub</a> の “Settings” の “Personal access tokens” のページで取得できる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/24367702843/"><img src="https://photo.baldanders.info/flickr/image/24367702843_m.png" srcset="https://photo.baldanders.info/flickr/image/24367702843_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="get access token in GitHub" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/24367702843/">get access token in GitHub</a></div></figcaption>
</figure>
<p>repo の権限を付けること。
この access token を <a href="https://travis-ci.org/" title="Travis CI - Test and Deploy Your Code with Confidence">Travis CI</a> で参照するには, “Settings” の “Environment Variables” でセットすればよい。
Build log にこの access token が表示されないようにすること。</p>
<p>最終的な <code>.travis.yml</code> の内容はこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">language</span><span class="p">:</span><span class="w"> </span><span class="l">go</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">go</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="m">1.5.3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">only</span><span class="p">:</span><span class="w"> </span><span class="l">master</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">before_install</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go get -v github.com/mitchellh/gox</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go get -v github.com/tcnksm/ghr</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">script</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v ./...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">after_success</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gox -output "goxdist/{{.OS}}_{{.Arch}}_`git tag | tail -1`/{{.Dir}}" -ldflags "-X main.Version=`git tag | tail -1`"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sh scripts/package.sh</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ghr --username spiegel-im-spiegel --token $GITHUB_TOKEN `git tag | tail -1` goxdist/dist/</span><span class="w">
</span></span></span></code></pre></div><p><code>git tag | tail -1</code> で最新のタグを取得して,そこに deploy するようにしている。
<a href="https://github.com/" title="GitHub">GitHub</a> に何か push するたびにビルドが走るのはウザいので, master ブランチのみテスト & ビルドの対象とした。</p>
<p>まっ,こんなもんかな。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="http://qiita.com/yanolab/items/5a6dfb3c07c94f7c760d">Golang + Raspberry Pi + LPS331AP で気圧・温度を測定してみた - Qiita</a> : arm アーキテクチャでいけるらしい</li>
<li><a href="http://deeeet.com/writing/2015/07/22/go1_5-cross-compile/">Go1.5はクロスコンパイルがより簡単 | SOTA</a></li>
<li><a href="http://qiita.com/rerofumi/items/d6a8ba08270acb61b31c">Raspberry PI 2 用の consul を作る (201512版 - Qiita</a> : Raspberry PI 上でビルドするより Linux のクロス環境を使ったほうが速いらしい</li>
<li><a href="http://deeeet.com/writing/2014/10/16/golang-in-ci-as-a-service/">CI-as-a-ServiceでGo言語プロジェクトの最新ビルドを継続的に提供する | SOTA</a></li>
<li><a href="http://qiita.com/m0a/items/d933982293dcadd4998c">RaspberryPi1(2とzeroも)で動かすgolang製アプリをクロスコンパイル(onMac) - Qiita</a></li>
</ul>
<p><a href="https://text.baldanders.info/golang/bookmark/">Go 言語に関するブックマーク集はこちら</a>。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>ちなみに <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>の 1.4 までは <a href="https://github.com/mitchellh/gox" title="mitchellh/gox: A dead simple, no frills Go cross compile tool">mitchellh/gox</a> インストール後に <code>gox -build-toolchain</code> でクロス環境を生成する必要があったが, 1.5 からは不要になった。めでたい! <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>ちなみに <code>{{ }}</code> でテンプレートをハンドリングするには <a href="https://golang.org/pkg/text/template/" title="template - The Go Programming Language"><code>text/template</code></a> パッケージを使う。静的サイト・ジェネレータの <a href="https://gohugo.io/" title="The world’s fastest framework for building websites | Hugo">Hugo</a> でもこのテンプレート・パッケージを使っている。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p>企業などのネット環境では Web から exe ファイルなどの実行バイナリを直接ダウンロードすることを禁止している場合もある。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>