List of Continuous-Integration - text.Baldanders.info
tag:text.Baldanders.info,2022-04-24:/tags
2022-04-24T18:41:02+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
CI 用の GitHub Actions が諸々アップデートされていた
tag:text.Baldanders.info,2022-04-24:/golang/update-github-actions/
2022-04-24T09:41:02+00:00
2022-08-05T22:17:21+00:00
GitHub Actions アップデートまつりw
Spiegel
https://baldanders.info/profile/
<p><a href="https://go.dev/">Go</a> で Excel ファイルを扱う <a href="https://github.com/qax-os/excelize">Excelize</a> パッケージがバージョンアップしていた。</p>
<ul>
<li><a href="https://zenn.dev/xuri/articles/5a22e06f106657">Go 言語スプレッドシートライブラリ:Excelize 2.6.0 がリリースされました</a></li>
</ul>
<p>なので,このパッケージを使っている拙作の <a href="https://github.com/goark/csvdata" title="goark/csvdata: Reading CSV Data">goark/csvdata</a> パッケージもバージョンを上げた。</p>
<ul>
<li><a href="https://github.com/goark/csvdata/releases/tag/v0.5.1">Release v0.5.1 · goark/csvdata · GitHub</a></li>
</ul>
<p>ぶっちゃけ <code>go.mod</code> ファイルだけ更新してもよかったのだが,少し前に公式の GitHub Actions である <a href="https://github.com/actions/setup-go">actions/setup-go</a> や <a href="https://github.com/actions/checkout">actions/checkout</a> が v3 系に上がっているのに気付いたこともあり,諸々更新することにした。</p>
<ul>
<li><a href="https://github.com/actions/setup-go/releases/tag/v3.0.0">Release v3.0.0 · actions/setup-go · GitHub</a></li>
<li><a href="https://github.com/actions/checkout/releases/tag/v3.0.2">Release v3.0.2 · actions/checkout · GitHub</a></li>
</ul>
<h2><a href="https://github.com/github/codeql-action" title="github/codeql-action: Actions for running CodeQL analysis">github/codeql-action</a></h2>
<p>GitHub が買収して手に入れたコードチェッカの GitHub Actions。
Workflow の設定例はこんな感じらしい。</p>
<figure lang="en">
<blockquote class="nobox"><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="s2">"Code Scanning - Action"</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">branches</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">main]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pull_request</span><span class="p">:</span><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 class="p">[</span><span class="l">main]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">schedule</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ┌───────────── minute (0 - 59)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ ┌───────────── hour (0 - 23)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ ┌───────────── day of the month (1 - 31)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ │ │ │</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ │ │ │</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># │ │ │ │ │</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># * * * * *</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">cron</span><span class="p">:</span><span class="w"> </span><span class="s1">'30 1 * * 0'</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">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">CodeQL-Build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># CodeQL runs on ubuntu-latest, windows-latest, and macos-latest</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">permissions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># required for all workflows</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">security-events</span><span class="p">:</span><span class="w"> </span><span class="l">write</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="c"># only required for workflows in private repositories</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">actions</span><span class="p">:</span><span class="w"> </span><span class="l">read</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">contents</span><span class="p">:</span><span class="w"> </span><span class="l">read</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">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 repository</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@v3</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="c"># Initializes the CodeQL tools for scanning.</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">Initialize CodeQL</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">github/codeql-action/init@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Override language selection by uncommenting this and choosing your languages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># with:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># languages: go, javascript, csharp, python, cpp, java</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="c"># Autobuild attempts to build any compiled languages (C/C++, C#, or Java).</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this step fails, then you should remove it and run the build manually (see below).</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">Autobuild</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">github/codeql-action/autobuild@v2</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="c"># ℹ️ Command-line programs to run using the OS shell.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 📚 https://git.io/JvXDl</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="c"># ✏️ If the Autobuild fails above, remove it and uncomment the following</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># three lines and modify them (or add more) to build your code if your</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># project uses a compiled language</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="c">#- run: |</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># make bootstrap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># make release</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">name</span><span class="p">:</span><span class="w"> </span><span class="l">Perform CodeQL Analysis</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">github/codeql-action/analyze@v2</span><span class="w">
</span></span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://github.com/github/codeql-action">github/codeql-action: Actions for running CodeQL analysis</a></q></div></figcaption>
</figure>
<p><a href="https://go.dev/">Go</a> コードのチェックをするなら “<code>Initialize CodeQL</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="w"> </span><span class="c"># Initializes the CodeQL tools for scanning.</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">Initialize CodeQL</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">github/codeql-action/init@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Override language selection by uncommenting this and choosing your languages</span><span class="w">
</span></span></span><span class="line hl"><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 hl"><span class="cl"><span class="w"> </span><span class="nt">languages</span><span class="p">:</span><span class="w"> </span><span class="l">go</span><span class="w">
</span></span></span></code></pre></div><p>とすればよい。</p>
<p>CodeQL は v2 系に上がったことでかなり深いところまでチェックするようになったようだ。
たとえば今回の <a href="https://github.com/goark/csvdata" title="goark/csvdata: Reading CSV Data">goark/csvdata</a> パッケージにはカラムの値を <a href="https://pkg.go.dev/database/sql" title="sql package - database/sql - pkg.go.dev"><code>sql</code></a><code>.NullByte</code> 型に変換して返す</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">r</span> <span class="o">*</span><span class="nx">Rows</span><span class="p">)</span> <span class="nf">ColumnNullByte</span><span class="p">(</span><span class="nx">s</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">res</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">r</span><span class="p">.</span><span class="nf">ColumnNullInt64</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="nx">base</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Valid</span><span class="p">:</span> <span class="kc">false</span><span class="p">},</span> <span class="nx">errs</span><span class="p">.</span><span class="nf">Wrap</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Byte</span><span class="p">:</span> <span class="nb">byte</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">Int64</span><span class="p">),</span> <span class="nx">Valid</span><span class="p">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>というメソッドがあるのだが,最後の</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Byte</span><span class="p">:</span> <span class="nb">byte</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">Int64</span><span class="p">),</span> <span class="nx">Valid</span><span class="p">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kc">nil</span>
</span></span></code></pre></div><p>で「範囲チェックなしで素のまま型変換すんな,ゴラァ(←超意訳)」と怒られてしまった。
素直な私は「なるほど」と納得して</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">r</span> <span class="o">*</span><span class="nx">Rows</span><span class="p">)</span> <span class="nf">ColumnNullByte</span><span class="p">(</span><span class="nx">s</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">base</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">res</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">r</span><span class="p">.</span><span class="nf">ColumnNullInt64</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="nx">base</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Valid</span><span class="p">:</span> <span class="kc">false</span><span class="p">},</span> <span class="nx">errs</span><span class="p">.</span><span class="nf">Wrap</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line hl"><span class="cl"> <span class="k">if</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Valid</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">Int64</span> <span class="p"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">res</span><span class="p">.</span><span class="nx">Int64</span> <span class="p">></span> <span class="nx">math</span><span class="p">.</span><span class="nx">MaxUint8</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line hl"><span class="cl"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Valid</span><span class="p">:</span> <span class="kc">false</span><span class="p">},</span> <span class="nx">errs</span><span class="p">.</span><span class="nf">Wrap</span><span class="p">(</span><span class="nx">strconv</span><span class="p">.</span><span class="nx">ErrRange</span><span class="p">)</span>
</span></span><span class="line hl"><span class="cl"> <span class="p">}</span>
</span></span><span class="line hl"><span class="cl"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullByte</span><span class="p">{</span><span class="nx">Byte</span><span class="p">:</span> <span class="nb">byte</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">Int64</span> <span class="o">&</span> <span class="mh">0xff</span><span class="p">),</span> <span class="nx">Valid</span><span class="p">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>と修正しましたとさ。
今までは何も言われなかったのに。
とほほ</p>
<h2><a href="https://github.com/golangci/golangci-lint-action" title="golangci/golangci-lint-action: Official GitHub action for golangci-lint from its authors">golangci/golangci-lint-action</a></h2>
<p><a href="https://golangci-lint.run/">golangci-lint</a> は <a href="https://go.dev/">Go</a> 用の複合 linter。
Workflow の設定例はこんな感じ。</p>
<figure lang="en">
<blockquote class="nobox"><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">golangci-lint</span><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">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><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 class="l">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pull_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">permissions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">contents</span><span class="p">:</span><span class="w"> </span><span class="l">read</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional: allow read access to pull request. Use with `only-new-issues` option.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># pull-requests: read</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">golangci</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">lint</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">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/setup-go@v3</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.17</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@v3</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">golangci-lint</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">golangci/golangci-lint-action@v3</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="c"># Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version</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">v1.29</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="c"># Optional: working directory, useful for monorepos</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># working-directory: somedir</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="c"># Optional: golangci-lint command line arguments.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># args: --issues-exit-code=0</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="c"># Optional: show only new issues if it's a pull request. The default value is `false`.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># only-new-issues: true</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="c"># Optional: if set to true then the all caching functionality will be complete disabled,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># takes precedence over all other caching options.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># skip-cache: true</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="c"># Optional: if set to true then the action don't cache or restore ~/go/pkg.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># skip-pkg-cache: true</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="c"># Optional: if set to true then the action don't cache or restore ~/.cache/go-build.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># skip-build-cache: true</span><span class="w">
</span></span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://github.com/golangci/golangci-lint-action">golangci/golangci-lint-action: Official GitHub action for golangci-lint from its authors</a></q></div></figcaption>
</figure>
<p>こっちも v3 系に上がっているが, lint は日常的に使ってる(ていうか VS Code ならリアルタイムで走るようにできる)ので特に問題なし。
よかったよかった。</p>
<h2><a href="https://github.com/sonatype-nexus-community/nancy-github-action" title="sonatype-nexus-community/nancy-github-action: Sonatype Nancy for GitHub Actions">sonatype-nexus-community/nancy-github-action</a></h2>
<p><a href="https://github.com/sonatype-nexus-community/nancy" title="sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index">Sonatype Nancy</a> は <a href="https://go.dev/">Go</a> の依存パッケージについて既知の脆弱性をチェックしてくれるツール。
こちらは特に変わってなかった。
Workflow の設定例はこんな感じ。</p>
<figure lang="en">
<blockquote class="nobox"><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">Go Nancy</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 class="p">[</span><span class="l">push]</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">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">build</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">Check out code into the Go module directory</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></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 1.x in order to write go.list file</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="l">^1.13</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">WriteGoList</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">go list -json -m all > go.list</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">name</span><span class="p">:</span><span class="w"> </span><span class="l">Nancy</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">sonatype-nexus-community/nancy-github-action@main</span><span class="w">
</span></span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://github.com/sonatype-nexus-community/nancy-github-action">sonatype-nexus-community/nancy-github-action: Sonatype Nancy for GitHub Actions</a></q></div></figcaption>
</figure>
<p>これも個人的に常用しているので無問題。</p>
<h2><a href="https://github.com/goreleaser/goreleaser-action" title="goreleaser/goreleaser-action: GitHub Action for GoReleaser">goreleaser/goreleaser-action</a></h2>
<p>みんな大好き,複数プラットフォームの実行バイナリを同時生成して GitHub のリリースページまで作ってくれる <a href="https://goreleaser.com/">GoReleaser</a> の GitHub Actions。
こちらは v3 系に上がったね(2022-08-06 修正)。</p>
<figure lang="en">
<blockquote class="nobox"><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">goreleaser</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">pull_request</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></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="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@v3</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="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@v3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </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@v3</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="c"># either 'goreleaser' (default) or 'goreleaser-pro'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">distribution</span><span class="p">:</span><span class="w"> </span><span class="l">goreleaser</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><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Your GoReleaser Pro key, if you are using the 'goreleaser-pro' distribution</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}```</span><span class="w">
</span></span></span></code></pre></div></blockquote>
<figcaption><div>via <q><a href="https://github.com/goreleaser/goreleaser-action">goreleaser/goreleaser-action: GitHub Action for GoReleaser</a></q></div></figcaption>
</figure>
<p>この記事を書くのに <a href="https://github.com/goreleaser/goreleaser-action" title="goreleaser/goreleaser-action: GitHub Action for GoReleaser">goreleaser/goreleaser-action</a> のページを眺めてて気がついたのだが, OpenPGP 電子署名も生成してくれるんだね。
Secret として隠蔽してくれるとはいえ, OpenPGP の秘密鍵やパスフレーズを GitHub 側に預託(escrow ← 言い方!)するのは抵抗があるなぁ。
まぁ,これは保留ということで。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/golang/using-golangci-lint-action/">golangci-lint を GitHub Actions で使う</a></li>
<li><a href="https://text.baldanders.info/golang/check-for-vulns-in-golang-dependencies/">Go 依存パッケージの脆弱性検査</a></li>
<li><a href="https://text.baldanders.info/golang/cross-compiling-in-github-actions-with-goreleaser/">GitHub Actions でクロス・コンパイル(GoReleaser 編)</a></li>
<li><a href="https://text.baldanders.info/remark/2020/10/github-code-scanning-with-golang/">Go のコードでも GitHub Code Scanning が使えるらしい</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 -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/B09C2XBC2F?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/31PDIZXO9tL._SL160_.jpg" width="160" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/B09C2XBC2F?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">デベロッパーゴースーパーゴラン Tシャツ</a></dt>
<dd>Geek Go Super Golang Tees</dd>
<dd>ウェア&シューズ</dd>
<dd>B09C2XBC2F (ASIN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <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="far fa-star"></i></abbr></dd>
</dl>
<p class="description">ついカッとなってポチった。反省はしない</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2022-04-10">2022-04-10</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Golang Tシャツ -->
Go のコードでも GitHub Code Scanning が使えるらしい
tag:text.Baldanders.info,2020-10-01:/remark/2020/10/github-code-scanning-with-golang/
2020-10-01T09:03:46+00:00
2022-04-24T09:34:08+00:00
うん。簡単!
Spiegel
https://baldanders.info/profile/
<p><a href="https://github.com/">GitHub</a> の Code Scanning 機能が全ユーザで有効になった。</p>
<ul>
<li><a href="https://iamninad.com/github-code-scanning/">Github Code Scanning</a></li>
<li><a href="https://github.blog/2020-09-30-code-scanning-is-now-available/">Code scanning is now available! - The GitHub Blog</a></li>
</ul>
<p>「えー。どうせ <a href="https://go.dev/">Go 言語</a>では使えないんでしょ?」と思ったが, C/C++, C#, <a href="https://go.dev/">Go</a>, Java, JavaScript/TypeScript, Python で有効らしい。
というわけで,とりあえず手持ちの <a href="https://go.dev/">Go</a> パッケージのリポジトリで試してみた。</p>
<p>Code Scanning は各リポジトリの “Security” で設定できる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./github-security-menu.png"><img src="./github-security-menu.png" srcset="./github-security-menu.png 1284w" sizes="(min-width:600px) 500px, 80vw" alt="" loading="lazy"></a></figure>
<p>一番下の “Code scanning alerts” の <code>[Set up code scanning]</code> ボタンを押す。
次に表示される以下の画面で</p>
<figure style='margin:0 auto;text-align:center;'><a href="./code-scanning-setting.png"><img src="./code-scanning-setting.png" srcset="./code-scanning-setting.png 682w" sizes="(min-width:600px) 500px, 80vw" alt="" loading="lazy"></a></figure>
<p><code>[Set up this workflow]</code> ボタンを押す。</p>
<p>すると <a href="https://github.com/">GitHub</a> Actions 用の YAML ファイル編集画面が表示される。
今回は <a href="https://go.dev/">Go</a> コードのリポジトリなので,こんな感じの内容になった。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># For most projects, this workflow file will not need changing; you simply need</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># to commit it to your repository.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># You may wish to alter this file to override the set of languages analyzed,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># or to provide custom queries or build logic.</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="s2">"CodeQL"</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">branches</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">master]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pull_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The branches below must be a subset of the branches above</span><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 class="p">[</span><span class="l">master]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">schedule</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">cron</span><span class="p">:</span><span class="w"> </span><span class="s1">'0 6 * * 4'</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">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">analyze</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">Analyze</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strategy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fail-fast</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">matrix</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Override automatic language detection by changing the below list</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">language</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'go'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Learn more...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection</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">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 repository</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="c"># We must fetch at least the immediate parents so that if this is</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a pull request then we can checkout the head.</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">2</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="c"># If this run was triggered by a pull request event, then checkout</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># the head of the pull request instead of the merge commit.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">git checkout HEAD^2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">if</span><span class="p">:</span><span class="w"> </span><span class="l">${{ github.event_name == 'pull_request' }}</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="c"># Initializes the CodeQL tools for scanning.</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">Initialize CodeQL</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">github/codeql-action/init@v1</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">languages</span><span class="p">:</span><span class="w"> </span><span class="l">${{ matrix.language }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If you wish to specify custom queries, you can do so here or in a config file.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, queries listed here will override any specified in a config file. </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prefix the list here with "+" to use these queries and those in the config file.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># queries: ./path/to/local/query, your-org/your-repo/queries@main</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="c"># Autobuild attempts to build any compiled languages (C/C++, C#, or Java).</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this step fails, then you should remove it and run the build manually (see below)</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">Autobuild</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">github/codeql-action/autobuild@v1</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="c"># ℹ️ Command-line programs to run using the OS shell.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 📚 https://git.io/JvXDl</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="c"># ✏️ If the Autobuild fails above, remove it and uncomment the following three lines</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and modify them (or add more) to build your code if your project</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># uses a compiled language</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="c">#- run: |</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># make bootstrap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># make release</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">name</span><span class="p">:</span><span class="w"> </span><span class="l">Perform CodeQL Analysis</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">github/codeql-action/analyze@v1</span><span class="w">
</span></span></span></code></pre></div><p><a href="https://go.dev/">Go</a> コードの検査だけならこのままコミットしてしまって構わない。
ちなみにコミットする場合は <code>master</code> ブランチ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> に対してではなく pull request 用のブランチを作ってそこにコミットしたほうがよい。
そうすれば PR 時に上記設定の action が走るので動作確認になるだろう。</p>
<p>うん。
簡単!</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsrun">Workflow syntax for GitHub Actions - GitHub Docs</a></p>
</li>
<li>
<p><a href="https://japan.zdnet.com/article/35160321/">GitHub、コードの脆弱性を検出する「Code Scanning」を全ユーザーに提供 - ZDNet Japan</a></p>
</li>
<li>
<p><a href="https://www.publickey1.jp/blog/20/githubgithub_code_scanning.html">GitHub、コードの脆弱性などを発見してくれる「GitHub Code Scanning」正式版が提供開始。パブリックリポジトリには無料 - Publickey</a></p>
</li>
<li>
<p><a href="https://news.mynavi.jp/article/20201002-1364892/">GitHub、開発者がセキュリティ脆弱性を発見するための支援機能「Code Scanning」 | マイナビニュース</a></p>
</li>
<li>
<p><a href="https://github.blog/2020-10-05-announcing-third-party-code-scanning-tools-static-analysis-and-developer-security-training/">Announcing third-party code scanning tools: static analysis & developer security training - The GitHub Blog</a></p>
</li>
<li>
<p><a href="https://github.blog/2020-10-27-code-scanning-a-github-repository-using-github-advanced-security-within-an-azure-devops-pipeline/">Code Scanning a GitHub Repository using GitHub Advanced Security within an Azure DevOps Pipeline - The GitHub Blog</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/check-for-vulns-in-golang-dependencies/">Go 依存パッケージの脆弱性検査</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/update-github-actions/">CI 用の GitHub Actions が諸々アップデートされていた</a></p>
</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>2020年10月から <a href="https://text.baldanders.info/remark/2020/08/renaming-default-branch-name-in-github-repositries/" title="GitHub リポジトリの既定ブランチ名が main になるらしい">GitHub の新規リポジトリの既定ブランチ名が <code>main</code> になるらしい</a>。ご注意を。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
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 -->
Go 依存パッケージの脆弱性検査
tag:text.Baldanders.info,2020-09-30:/golang/check-for-vulns-in-golang-dependencies/
2020-09-30T03:49:21+00:00
2022-04-24T09:34:08+00:00
nancy を使うのがよさげである。
Spiegel
https://baldanders.info/profile/
<p>どの言語でも同じだけど,インポートする外部パッケージが安全かどうかを調べるのはけっこう大変である。
で, <a href="https://go.dev/">Go 言語</a>の場合は <a href="https://github.com/sonatype-nexus-community/nancy" title="sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index">nancy</a> を使うのがよさげである。</p>
<ul>
<li><a href="https://github.com/sonatype-nexus-community/nancy">sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index</a></li>
</ul>
<p><a href="https://github.com/sonatype-nexus-community/nancy" title="sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index">nancy</a> は “<a href="https://ossindex.sonatype.org/">Sonatype OSS Index</a>” の情報を使って依存パッケージ/モジュールの検査をしてくれる。
ツール自体は Apache-2.0 でライセンスされている。
提供されているデータについては</p>
<figure lang="en">
<blockquote><q>OSS Index and the associated tools are and always will be free to the community. The data we gather is derived from public sources, and does not include human curated intelligence nor expert remediation guidance</q>.</blockquote>
<figcaption><div>via <q><a href="https://ossindex.sonatype.org/">Sonatype OSS Index</a></q></div></figcaption>
</figure>
<p>とあるので,オープンな場で使うなら問題ないかな。</p>
<p>使い方は簡単で,開発中のパッケージのリポジトリ上で</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go list -json -m all | nancy sleuth
</span></span></code></pre></div><p>とすればよい。
問題なければ</p>
<figure style='margin:0 auto;text-align:center;'><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go list -json -m all | nancy sleuth -n
</span></span><span class="line"><span class="cl">┏━━━━━━━━━━━━━━━┓
</span></span><span class="line"><span class="cl">┃ Summary ┃
</span></span><span class="line"><span class="cl">┣━━━━━━━━━━━━━┳━┫
</span></span><span class="line"><span class="cl">┃ Audited Dependencies ┃ 9┃
</span></span><span class="line"><span class="cl">┣━━━━━━━━━━━━━╋━┫
</span></span><span class="line"><span class="cl">┃ Vulnerable Dependencies ┃ 0┃
</span></span><span class="line"><span class="cl">┗━━━━━━━━━━━━━┻━┛
</span></span></code></pre></div></figure>
<p>みたいな感じで結果を返してくれる。
問題のあるパッケージ/モジュールを含んでると,ものすごい勢いで叱られるけど(笑)</p>
<h2><a href="https://github.com/">GitHub</a> Actions でも使える</h2>
<p><a href="https://github.com/sonatype-nexus-community/nancy" title="sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index">nancy</a> には <a href="https://github.com/">GitHub</a> Actions も用意されている。
ありがたや。</p>
<ul>
<li><a href="https://github.com/sonatype-nexus-community/nancy-github-action">sonatype-nexus-community/nancy-github-action: Sonatype Nancy for GitHub Actions</a></li>
</ul>
<p>設定は簡単。
リポジトリの <code>.github/workflows/</code> ディレクトリに YAML ファイル(例えば <code>vulns.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">vulns</span><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">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><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 class="nt">pull_request</span><span class="p">:</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">vulns</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">Vulnerability scanner</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">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">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="l">^1.13</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">WriteGoList</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">go list -json -m all > go.list</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">Nancy</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">sonatype-nexus-community/nancy-github-action@main</span><span class="w">
</span></span></span></code></pre></div><p>これで pull request 時, <code>master</code> ブランチ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> への push 時,およびバージョンタグを打った際に脆弱性検査が走る。</p>
<h2>依存の依存パッケージに脆弱性がある</h2>
<p>直接インポートするパッケージに脆弱性があるなら無害なバージョンに差し替えればいいけど,依存パッケージが依存しているパッケージに脆弱性がある場合はどうするか。</p>
<p>とりあえず,そのパッケージ宛てには issue を投げておくとして,それまでの継ぎとしては <code>go.mod</code> ファイルの <code>replace</code> ディレクティブを使って凌ぐことができそうだ。</p>
<p>たとえば,依存パッケージが <a href="https://github.com/etcd-io/etcd" title="etcd-io/etcd: Distributed reliable key-value store for the most critical data of a distributed system">github.com/coreos/etcd</a> v3.3.13 に依存してるんだけど v3.3.13 に脆弱性がある場合,</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">replace (
</span></span><span class="line"><span class="cl"> github.com/coreos/etcd v3.3.13+incompatible => github.com/coreos/etcd v3.3.25+incompatible
</span></span><span class="line"><span class="cl">)
</span></span></code></pre></div><p>などとして無害なバージョンに差し替えできる。</p>
<p><code>require</code> ディレクティブで</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">require (
</span></span><span class="line"><span class="cl"> github.com/coreos/etcd v3.3.25+incompatible
</span></span><span class="line"><span class="cl">)
</span></span></code></pre></div><p>とか書いても同じ効果があるけど,名目だけの依存関係で実際にはインポートしないパッケージは <code>go mod tidy</code> コマンドで記述が削除されちゃうのでオススメできない。</p>
<p><code>go list -m all</code> って,実際にはリンクしない名目上の依存関係も全部拾ってリストアップしちゃうので,凄い面倒くさいんだよねぇ。
実際にリンクするパッケージだけリストアップしてくれないものだろうか…</p>
<h2>【2021-02-25 追記】 <a href="https://github.com/spiegel-im-spiegel/depm" title="spiegel-im-spiegel/depm: Visualize depndency packages and modules">depm</a> との連携</h2>
<p>拙作の <a href="https://text.baldanders.info/release/dependency-graph-for-golang-modules/">Go 言語用モジュール依存関係可視化ツール</a> <a href="https://github.com/spiegel-im-spiegel/depm" title="spiegel-im-spiegel/depm: Visualize depndency packages and modules">depm</a> を使って</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ depm list --json | nancy sleuth -n
</span></span></code></pre></div><p>とすることで名目だけの依存パッケージの誤検知を回避できる。
ただ,私としては <a href="https://github.com/spiegel-im-spiegel/depm" title="spiegel-im-spiegel/depm: Visualize depndency packages and modules">depm</a> の信頼性にイマイチ確信が持てないので,ご利用は自己責任で(笑)</p>
<p><a href="https://github.com/">GitHub</a> Actions を使うのであれば</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">vulns</span><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">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><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 class="nt">pull_request</span><span class="p">:</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">vulns</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">Vulnerability scanner</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">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">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="l">^1.16</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">install depm</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">go install github.com/spiegel-im-spiegel/depm@latest</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">WriteGoList</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">depm list --json > go.list</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">Nancy</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">sonatype-nexus-community/nancy-github-action@main</span><span class="w">
</span></span></span></code></pre></div><p>などとすればOK。
<a href="https://go.dev/">Go</a> 1.16 以降で有効なのでご注意を。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://text.baldanders.info/golang/update-github-actions/">CI 用の GitHub Actions が諸々アップデートされていた</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 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>2020年10月から <a href="https://text.baldanders.info/remark/2020/08/renaming-default-branch-name-in-github-repositries/" title="GitHub リポジトリの既定ブランチ名が main になるらしい">GitHub の新規リポジトリの既定ブランチ名が <code>main</code> になるらしい</a>。ご注意を。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
golangci-lint を GitHub Actions で使う
tag:text.Baldanders.info,2020-09-29:/golang/using-golangci-lint-action/
2020-09-29T02:20:19+00:00
2022-04-24T09:34:08+00:00
これで pull request 時に golangci-lint が走る。
Spiegel
https://baldanders.info/profile/
<p><a href="https://golangci-lint.run/">golangci-lint</a> は <code>go vet</code> をはじめ複数の lint を集約して結果を表示してくれる優れものである。
かつては GolangCI.com で <a href="https://github.com/">GitHub</a> と連携できていたのだが,<a href="https://medium.com/golangci/golangci-com-is-closing-d1fc1bd30e0e" title="GolangCI.com is closing. Dear customers of GolangCI.com, | by Denis Isaev | golangci | Medium">2020年4月でサービスが停止</a>してしまい,寂しい限り。</p>
<p>と思っていたのだが,いつの間にか公式の <a href="https://github.com/">GitHub</a> Actions が用意されていた。
気付かなんだよ。
不覚。</p>
<ul>
<li><a href="https://github.com/golangci/golangci-lint-action">golangci/golangci-lint-action: Official GitHub action for golangci-lint from it’s authors</a></li>
</ul>
<p>使い方は簡単。
リポジトリの <code>.github/workflows/</code> ディレクトリに YAML ファイル(例えば <code>lint.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">golangci-lint</span><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">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><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 class="nt">pull_request</span><span class="p">:</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">golangci</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strategy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">matrix</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="p">[</span><span class="m">1.15</span><span class="l">.x]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">ubuntu-latest, macos-latest, windows-latest]</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">lint</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">${{ matrix.os }}</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">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">name</span><span class="p">:</span><span class="w"> </span><span class="l">golangci-lint</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">golangci/golangci-lint-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="c"># Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.</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">v1.31</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="c"># Optional: working directory, useful for monorepos</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># working-directory: somedir</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="c"># Optional: golangci-lint command line arguments.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># args: --issues-exit-code=0</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="c"># Optional: show only new issues if it's a pull request. The default value is `false`.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># only-new-issues: true</span><span class="w">
</span></span></span></code></pre></div><p>また,リポジトリ直下の <code>.gitattributes</code> ファイルに以下の記述を追加する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">*.go text eol=lf
</span></span></code></pre></div><p>これで pull request 時, <code>master</code> ブランチ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> への push 時,およびバージョンタグを打った際に <a href="https://golangci-lint.run/">golangci-lint</a> が走る。
<a href="https://golangci-lint.run/">golangci-lint</a> は <code>matrix</code> の組み合わせで並列処理されるようだ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./reviews-in-pr.png"><img src="./reviews-in-pr.png" srcset="./reviews-in-pr.png 867w" sizes="(min-width:600px) 500px, 80vw" alt="" loading="lazy"></a></figure>
<p>よーし,うむうむ,よーし。</p>
<p>まぁ,プラットフォーム依存のコードでもない限り <a href="https://go.dev/">Go</a> 最新バージョンの <code>ubuntu-latest</code> だけでいいと思うけどね。</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://github.com/golangci/golangci-lint">golangci/golangci-lint: Fast linters Runner for Go</a></p>
</li>
<li>
<p><a href="https://zenn.dev/ikawaha/articles/57384e8fc69c7b057f7f">reviewdog-golangci-lint を使う</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/donot-sleep-through-life/">golangci-lint に叱られる</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/update-github-actions/">CI 用の GitHub Actions が諸々アップデートされていた</a></p>
</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 -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>2020年10月から <a href="https://text.baldanders.info/remark/2020/08/renaming-default-branch-name-in-github-repositries/" title="GitHub リポジトリの既定ブランチ名が main になるらしい">GitHub の新規リポジトリの既定ブランチ名が <code>main</code> になるらしい</a>。ご注意を。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
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>