Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

2021年 11月の読書記録

なんだか調子が悪かったので更新が遅くなっちゃいました。

加えて今月(12月)は全然読めてなくて、このまま年越しになりそうです。


続きを読む

2021年10月の読書記録

今月から図書館に通い始めて、結構読めた気がする。

ちなみにこの感想は読書メーターに書いたものをコピペしてます。

bookmeter.com


続きを読む

2021年 9月の読書記録

今月はペルソナ5 ザ・ロイヤルがセールしていてそればっかりしてたので全然読めなかった。

けど数冊読みはしたので残しておきます。

  • 一度読んだら絶対に忘れない世界史の教科書
  • 創作する遺伝子 僕が愛したMEMEたち
  • Kubernetes完全ガイド

続きを読む

CKADに合格したので、対策したことをまとめます

2021年9月26日にCKADを受験して、無事合格しました。

試験内容の改訂前に合格できて助かった〜。受験料を出してくれた弊社に感謝です。

備忘録として自分がした対策をまとめていこうと思います。

  • 注意点
    • あくまで自分の対策なので、これをやれば合格できることを保証するものではありません。
    • 2021年9月28日から試験内容が変わっています。この記事は改訂前に受験したものです。
  • 時系列
  • 自分の状況
  • 試験対策
    • Kubernetes完全ガイド
    • CKAD-exercise
    • Killer Shell
    • ChromeにCKAD用のProfileを作った
    • 2021-09-29追記:Katacoda
  • 試験当日
  • 結果
  • まとめ

続きを読む

リポジトリのtagをbumpするgh extensionを作った

先日GitHub CLI 2.0が公開され、拡張機能を公開することができるようになりました。

github.blog

最近自分でCLIを書いていてタグを手で打つのが面倒だなぁと思っていたので、いい機会だと思い簡単にリリースをbumpできるgh extensionを作成しました。

リポジトリはこちら。

github.com

作ったCLI

f:id:johnmanjiro13:20210902181837g:plain
動作イメージ

実行するとタグの一覧を取得・表示し、bumpするバージョンを選択するプロンプトを表示します。 patch、minor、majorから次のバージョンを選択することで、新しくリリースを作成することができます。

内部的にはghコマンドを実行しており、gh release createコマンド同様に -R オプションを使って特定のリポジトリを直接指定することができます。 また認証に関してもghコマンドに移譲しているので、普段ghコマンドを使っている感覚で使用することが可能です。

コマンド自体はGoで実装していて、シェルスクリプトからビルドしたバイナリを呼び出すようにしています。 これはgh-contributeを参考にしました。

まとめ

gh extensionは gh- プレフィックスをつけたリポジトリシェルスクリプトを置くだけで公開できるので、気軽に作成することができていいですね。

また何かこういうのあったら便利だなぁというものがあれば作ってみようと思います。

8月の読書記録

  • 「幸せをお金で買う」5つの授業
  • 混沌を泳ぐ -PROGRESS STORY-(1)
  • 一九八四年
  • Clean Architecture 達人に学ぶソフトウェアの構造と設計
  • チェンソーマン

続きを読む

outputsだけを追加してtarraform planするとtfnotifyがパースエラーになる

Terraform を触っていて若干面倒になった部分があったのでメモ。

現状としては、「outputsだけを追加してterraform planするとtfnotifyがパースエラーで落ちる」というものです。

tfnotifyとは

tfnotifyはメルカリが開発しているTerraformの実行結果を通知してくれるCLIです。

GitHubやSlackなどに結果を投げられます。

github.com

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