2021年 11月の読書記録
なんだか調子が悪かったので更新が遅くなっちゃいました。
加えて今月(12月)は全然読めてなくて、このまま年越しになりそうです。
- その英語、本当にあってる? ネイティブならこう答えます
- 人体600万年史(上):科学が明かす進化・健康・疾病
- 人体600万年史(下):科学が明かす進化・健康・疾病
- 世界平和は一家団欒のあとに
- 阪急電車
- 星の王子さま
続きを読む
2021年 9月の読書記録
今月はペルソナ5 ザ・ロイヤルがセールしていてそればっかりしてたので全然読めなかった。
けど数冊読みはしたので残しておきます。
- 一度読んだら絶対に忘れない世界史の教科書
- 創作する遺伝子 僕が愛したMEMEたち
- Kubernetes完全ガイド
続きを読む
CKADに合格したので、対策したことをまとめます
2021年9月26日にCKADを受験して、無事合格しました。
試験内容の改訂前に合格できて助かった〜。受験料を出してくれた弊社に感謝です。
CKAD結果こない〜って言ってたらきた!
— じょん (@johnmanjiro13) 2021年9月27日
無事合格してました pic.twitter.com/nob9hyKJEB
備忘録として自分がした対策をまとめていこうと思います。
- 注意点
- あくまで自分の対策なので、これをやれば合格できることを保証するものではありません。
- 2021年9月28日から試験内容が変わっています。この記事は改訂前に受験したものです。
- 時系列
- 自分の状況
- 試験対策
- Kubernetes完全ガイド
- CKAD-exercise
- Killer Shell
- ChromeにCKAD用のProfileを作った
- 2021-09-29追記:Katacoda
- 試験当日
- 結果
- まとめ
続きを読む
リポジトリのtagをbumpするgh extensionを作った
先日GitHub CLI 2.0が公開され、拡張機能を公開することができるようになりました。
最近自分でCLIを書いていてタグを手で打つのが面倒だなぁと思っていたので、いい機会だと思い簡単にリリースをbumpできるgh extensionを作成しました。
リポジトリはこちら。
作ったCLI
実行するとタグの一覧を取得・表示し、bumpするバージョンを選択するプロンプトを表示します。 patch、minor、majorから次のバージョンを選択することで、新しくリリースを作成することができます。
内部的にはghコマンドを実行しており、gh release createコマンド同様に -R オプションを使って特定のリポジトリを直接指定することができます。 また認証に関してもghコマンドに移譲しているので、普段ghコマンドを使っている感覚で使用することが可能です。
コマンド自体はGoで実装していて、シェルスクリプトからビルドしたバイナリを呼び出すようにしています。 これはgh-contributeを参考にしました。
まとめ
gh extensionは gh-
プレフィックスをつけたリポジトリにシェルスクリプトを置くだけで公開できるので、気軽に作成することができていいですね。
また何かこういうのあったら便利だなぁというものがあれば作ってみようと思います。
outputsだけを追加してtarraform planするとtfnotifyがパースエラーになる
Terraform を触っていて若干面倒になった部分があったのでメモ。
現状としては、「outputsだけを追加してterraform planするとtfnotifyがパースエラーで落ちる」というものです。
tfnotifyとは
tfnotifyはメルカリが開発しているTerraformの実行結果を通知してくれるCLIです。
GitHubやSlackなどに結果を投げられます。
tfnotifyのexit code判定
tfnotifyは下記の正規表現によってterraform planが成功したかどうかを判定しています。
リソースが変更されれば Plan: \d
にマッチして、なにも追加されていなければ No changes.
にマッチするというわけですね。
// NewPlanParser is PlanParser initialized with its Regexp func NewPlanParser() *PlanParser { return &PlanParser{ Pass: regexp.MustCompile(`(?m)^(Plan: \d|No changes.)`), // ここ Fail: regexp.MustCompile(`(?m)^(Error: )`), // "0 to destroy" should be treated as "no destroy" HasDestroy: regexp.MustCompile(`(?m)([1-9][0-9]* to destroy.)`), HasNoChanges: regexp.MustCompile(`(?m)^(No changes. Infrastructure is up-to-date.)`), } }
https://github.com/mercari/tfnotify/blob/master/terraform/parser.go#L61-L70
また、exit codeは下記のswitch文で判定しています。
PassとFailの正規表現両方にマッチしなかったものはパースエラーとして処理されます。
var exitCode int switch { case p.Pass.MatchString(body): exitCode = ExitPass case p.Fail.MatchString(body): exitCode = ExitFail default: return ParseResult{ Result: "", ExitCode: ExitFail, Error: fmt.Errorf("cannot parse plan result"), } }
https://github.com/mercari/tfnotify/blob/master/terraform/parser.go#L101-L113
outputsだけを追加したときの出力
しかし、リソースを変更せずにoutputsだけを追加した場合、下記のような出力になります。
pagerduty_schedule.secondary: Refreshing state... pagerduty_schedule.primary: Refreshing state... pagerduty_team_membership.team[0]: Refreshing state... pagerduty_team_membership.team[1]: Refreshing state... pagerduty_escalation_policy.team: Refreshing state... pagerduty_service.team: Refreshing state... pagerduty_service_integration.datadog: Refreshing state... ------------------------------------------------------------------------ Changes to Outputs: + my_another_project_name = "my-another-project" ------------------------------------------------------------------------
outputsの変更のみが出力されていますね。
リソースの変更がないため Plan: は出力されません。さらに、まったく変更がない(outputsを変更している)ため、No changes. も出力されません。
その結果、tfnotifyの正規表現にマッチせず、パースエラーとしてterraform planは成功するけれどtfnotifyで失敗するということになります。
対応策
今回のoutputsはremote stateから読み込んで外部で使いたいものだったので、outputsとそれを使うリソース定義を同時に行うということができませんでした。
また、terraform planとtfnotifyをCIで実行していたので無理やりマージするのは抵抗があり、雑ですがサービスに影響しない変更を加え、無理やりPlanが結果に出るようにしました。
基本的にはoutputsはリソースの定義と一緒に追加してしまうのがいいかもしれません。
まとめ
下記のことが原因で、outputsだけを追加してterraform planするとtfnotifyがパースエラーになってしまうということが起きました。 1. tfnotifyは正規表現でパースしている 2. outputsだけを追加したterraform planの出力は正規表現にマッチしない 3. パースエラーとして処理される
対応としては、極力outputsはリソースの変更と一緒に追加したほうがよさそうです。
また、issueを投げてみました。時間があるときにPRを投げられるといいなと思います。 github.com