release-request
The release-request is a cli tool for Pull Request driven deployment.
demo
何が出来るか
- deployのPull Requestを自動作成してくれる
- マージされたPull Requestをリスト化してくれる
- 特定のラベルが付けられたPull Requestをリスト化してくれる
- 差分を外部プログラムに渡してテンプレートから手順書を入れたり抜いたり出来る
先行するOSS
- https://github.com/motemen/git-pr-release
- Mackerel::Release https://metacpan.org/pod/Mackerel::ReleaseUtils
先行するOSSと比べて優位な点
- ワンコマンドで完結
- 外部プログラムは言語に依存しない
- デフォルトでもある程度機能する
挙動
- 実行すると
- 既に指定ブランチから指定ブランチへのPull RequestがあればDescriptionを上書きする
- 無ければ新しく作る
- 弊社ではwebhookが来ると外部コマンドを実行するtkuchiki/ghooks-cmd-runnerと組み合わせてmasterブランチへのpushをトリガーに走るようにしている
工夫
- 設定が必要であるが、テンプレートを吐いてくれる
設定ファイル
- config.yml
- githubのtokenとかブランチとかトラッキングするラベルとか
- release.md
- Pull Requestのテンプレート
外部プログラムの例
calls:
- name: deploy_timing
command: |
perl -MTime::Piece -E '
my $now = Time::Piece->new;
for my $hms (qw/16:30:00 19:45:00 23:45:00/) {
next if $now->hms gt $hms;
say $now->ymd . " " . $hms;
last;
}'
外部プログラムをMarkdownから使う
上記のプログラムを組み合わせてデプロイウィンドウの明記を手順書に盛り込んでいる
# Release
Estimated time of deploying: {{ .Call "deploy_timing" }}
DDLの差分があったら反映の手順書を入れる
- name: has_ddl
command: |
perl -MJSON -E '
my $json = do { local $/; <STDIN> };
my $releaser = JSON::decode_json($json);
my $files = $releaser->{comparison}->{files};
my @assets = grep { $_->{name} =~ m!^sql/master.sql.*$! } @$files;
@assets > 0 ? exit 0 : exit 1;
'
DDLの差分があったら反映の手順書を入れる
{{ with .CallIf "has_ddl" -}}
- [ ] migrate ddl
$ git_ddl_migrater sql/master.sql
{{ end }}
解決する問題
- デプロイするものを整理してデプロイ前の把握と、デプロイした後の記録にしたい
- しかし言うてもその手間がしんどい
- 手順書のクオリティを一定にしたい
と言う感じで使ってくれ!!!
あとOSS紹介Advent Calendarやってます
登録してくれ!!!