「Kubernetesで実践するクラウドネイティブDevOps」のレビューをした

2020年2月19日に「Kubernetesで実践するクラウドネイティブDevOps」という書籍が発売されるのだが、レビュアーとしてお手伝いした。レビューとはいえ、雑誌ではない商業誌に関わったのは初めてなのでいい経験ができたと思う。ぜひ読んでみてください。

Kubernetesで実践するクラウドネイティブDevOps
John Arundel Justin Domingus
オライリージャパン
売り上げランキング: 1,870

GolandのSplitterをキーボードからリサイズする

Goland、というかJetbrainsIDEはデフォルトだとSplitterのリサイズをするにはマウスを使うしかない。しかし、Tab Shifter というプラグインを使うとSplitterのリサイズをキーボードからできるようになる。

僕はキーマップを以下のように変更していて、Tmuxのresize-paneと揃えている。これによりTmuxを使っている時とGolandを使っている時で同じ体験を得ることができる。

Stretch Splitter Down⌥ z
Stretch Splitter Left⌥ ,
Stretch Splitter Right⌥ .
Stretch Splitter Up⌥ a

なお、このキーマップは https://github.com/ssh0/dotfiles/blob/master/tmux/tmux.conf を参考にした。

沖縄に行ってきた

沖縄県の名護でHerdening2020BOというイベントが開催されるので行ってきた。イベントの内容については所属している会社のブログに書くので、ここでは綺麗な景色や行った場所について書いていく。

イベント会場が万国津梁館でリゾート地なので宿泊場所もそれっぽくなり、今回泊まった部屋は窓から海が見えるというロケーションだった。テラスでビール飲みながらダラダラしたかった…

会場の万国津梁館に向かうとこんな感じ。周囲にはロッジが点在していて、いい雰囲気。

なんでもない長椅子から見える景色がいい。ずるい。

Herdening競技が8時間あるのでどうなるかわからなかったけど、なんとか夕日を見ることができた。ここは朝日も夕日もみえてよいね。

チームメンバーとペンションで交流していたところに猫が。ペンションの客からご飯もらってるのかなあ。iPhoneのポートレートモードで撮ったけど、ブログとかに載せるなら十分だねえ。

2日目もいい天気で、ホテルから歩いて会場まで向かう。30分弱、のんびり移動。昼休みが長めだったので1日目にはできなかった付近の散策をする。これはブセナテラスホテル。良い場所にあるなあ。

海底展望台なるものがあるらしく、こんな感じで橋で灯台みたいなところまで歩いて行ける。しかし水の色が綺麗。今日は少し濁っていたらしいけどそれでこれか。

自動車で移動していたので沖縄に来てからお酒は飲んでなかったのだけど、2日目は徒歩移動したのでパーティではビールなどをいただいた。ヘリオス酒造のクラフトビール。泡盛もめちゃ美味しかった。

これはホテルに戻ってから食べたアイス。

Herdeningの翌日は日曜だったので、せっかくということで美ら海水族館へ。天気が下り坂で曇ってしまった。

屋内なら関係ないぜ、と満喫。大水槽すごすぎる…

やー、名護いいね。この季節だと泳ぐのは厳しいと思うけど、のんびりするのにはむしろちょうど良いかもしれない。次来るときは完全にオフで来たいなあ。

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

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

CIでテストを実行する

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

---
 name: CI
 on: [push]
 jobs:
 
   run_test:
     name: Go Test
     runs-on: ubuntu-latest
     steps:
 
       - name: Set up Go 1.13
         uses: actions/setup-go@v1
         with:
           go-version: 1.13
         id: go
 
       - name: Check out code into the Go module directory
         uses: actions/checkout@v1
 
       - name: Run Test
         run: |
           make test

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

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

 ---
 name: Release
 on:
   create:
     tags:
       - v*.*.*
     branches:
       - master
 
 jobs:
   release:
     name: Release on GitHub
     runs-on: ubuntu-latest
     steps:
       - name: Check out code
         uses: actions/checkout@v1
 
       - name: Validates GO releaser config
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: check
 
       - name: Create release on GitHub
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: release
         env:
           GITHUB_TOKEN: ${{secrets.GORELEASER_TOKEN}}

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

 # This is an example goreleaser.yaml file with some sane defaults.
 # Make sure to check the documentation at http://goreleaser.com
 before:
   hooks:
     # you may remove this if you don't use vgo
     - go mod download
     # you may remove this if you don't need go generate
     - go generate ./...
 builds:
   - env:
       - CGO_ENABLED=0
     ldflags:
       -X github.com/takaishi/kelm/config.Version={{.Version}}
 archive:
   replacements:
     darwin: Darwin
     linux: Linux
     windows: Windows
     amd64: x86_64
 checksum:
   name_template: 'checksums.txt'
 snapshot:
   name_template: "{{ .Tag }}-next"
 changelog:
   sort: asc
   filters:
     exclude:
       - '^docs:'
       - '^test:'
 brew:
   github:
     owner: takaishi
     name: homebrew-fomulas
   commit_author:
     name: goreleaserbot
     email: goreleaser@carlosbecker.com
   description: "CLI tool to Generate and insert markdown's table of contents"
   homepage: "https://github.com/takaishi/kelm"
   install: |
     bin.install Dir['kelm']
   test: |
     system "#{bin}/kelm"

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

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

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

 ---
 name: Docker Image CI
 on:
   push:
     tags:
       - v*.*.*
 env:
   DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN}}
 jobs:
   build:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v1
       - name: Build the Docker image
         run: |
           tag=$(echo ${{ github.ref }} | sed 's/refs\/tags\///g' | tr -d '\n')
           docker login -u rtakaishi -p $DOCKER_HUB_TOKEN
           docker build . --file Dockerfile --tag rtakaishi/openstack-sg-controller:${tag}
           docker push rtakaishi/openstack-sg-controller:${tag}

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

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

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

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

OpenPolicyAgentを使ってSecurityGroupを検査する

OpenStackのSecurityGroupで危なそうなものをチェックしてSlackに通知する https://github.com/takaishi/sg_inspector というツールを以前作ったのだが、最近チェックする条件を増やしたくなったのでOpenPolicyAgentを使ってチェック条件を記述できるようにしてみた。OPAを使うことでポリシーをツールの外に出すことができ、より汎用的に実装できるのが利点。しかし、ポリシーの記述にRegoという言語を使う必要があり、学習コストが必要という課題もあった。Rego自体でテストの記述も可能なので、検査ロジックとデータ、テストをツールの外に出せるのは良いですね。

コードは https://github.com/takaishi/sg_inspector/blob/v0.0.7/openstack.go#L98-L116 あたり。ひとまず、Goでポリシーファイルなどを読み込んで検査するあたりの書き方はわかったので今後活かせそうなものがあれば取り組んでいきたい。