年中アイス

いろいろつらつら

リリースを自動化したら思ったより楽になった

※2020/02/22 追記 Goで作ったツールは以下のGoReleaser + GithubActionsを使う方法に置き換えました。

reiki4040.hatenablog.com

-- 追記ここまで

rnzooの0.5.0を開発していくにあたって、機能的な追加の他に、リリースの自動化を行いました。もともとビルド自体はbashスクリプトで自動化していて、dockerを使ったコンテナ上でのビルドとアーカイブファイルの作成を行っていました。

今回、devバージョンをちょこちょこ出しながら進めるために、リリースにかかる手間を減らしたくなったので、少し腰を据えて改善しました。おかげで0.5.0-devは6まで簡単に繰り返しリリースしていくことができました。

以前

実際のリリース(homebrewに反映させる)は、毎回以下をやっていました。

書くとあんまりたいしたことないですが、手作業満載で、頻繁にやらない分、あれどうしてたっけみたいな状態になっていました。

何をやったか

単純にスクリプト化しました。とりあえず動作確認できたら、tag作ってリリーススクリプト実行してリリースされるというところまで。詳細は以下プルリクを参照ください。 https://github.com/reiki4040/rnzoo/pull/20/files

hubコマンドを使って、リリースファイルをアップロード

調べてみたらhubコマンドでできるということで、インストールしてスクリプトに追加しました。

Pull Requestを自動で作成する

こっちに書いたように、関連するプルリクを自動で作成して、最後確認してマージするように。別にPullRequestにせず、masterにそのままpushでもいいんですが、応用が利きそうなので、あえてPullRequestを経由する形にしました。

未解決

テスト

今回homebrewのauditだけ入れていますが、この自動化に際して、hashが間違っていたり、対象ファイルが存在しない(url間違っていた)などを拾ってくれたので、テスト大事ですね。

CI/CDサービスとの連携

まだ自分でキックしないといけないので、自動で開始できるともっと楽になるはず。プルリク作ったら自動テスト実施とか、マージしたらリリースみたいな自然なフローをサポートしてくれる形にしたい。

まとめ

当たり前ですが、自動化すると手間とミスが減るので楽ですね。プロジェクトの最初で足回りちゃんと作るのが後で効いてくるんだなと実感しました。地味地味としたところの突っ掛かりがなくなると、集中しやすくなります。

rnzoo 0.5.0開発中

EC2関連のコマンドをGoで実装したrnzooですが、0.5.0に向けて追加実装を色々やってます。 2017/03/23時点で0.5.0-dev5をリリースしています。devバージョンを使いたい場合は、以下で入ります。

brew tap reiki4040/rnzoo
brew install --devel rnzoo

0.5.0のゴール

大きくは2つです。片手落ちだった機能の拡充と、安全面への配慮。

EC2の作成から削除までライフサイクルを一通りできるようにする

新規作成 -> 停止 -> 起動 -> 停止 -> タイプ変更 -> 起動 -> 削除みたいな流れです。これでAWSコンソール開かなくても起動したりとかの操作は一通りできます。*1

確認をつけてより安全に

使ってもらっている同僚から、確認オプションが欲しいという要望もあり、危なそうなのはデフォルト確認して、確認なしオプションを追加し、動いてもまぁいいかなというのは、デフォルト確認なし、確認するオプションを追加しました。確認もinstance idでは判断できないので、Nameタグを使うようにして、よりわかりやすくしました。

0.5.0-dev5(2017/3/23時点)のアップデート内容

機能追加

変更

  • 実行前に確認オプションの追加(デフォルトは確認なし)
  • 確認時にinstance idではなくNameタグを表示するように
  • attach-eip --movemove-eipサブコマンドとして独立
  • terminate, move-eip, detach-eipはデフォルト確認ありで確認しないオプションを追加
  • サブコマンドの名称からec2を除いた短縮名を追加

internal

  • 使用ライブラリの最新追いつき(aws-sdk-goを最新にしてIPv6対応)
  • release scriptの整備(tag打ったら、リリースして、homebrewのプルリクまで作る)
  • homebrewのdevel対応の為に、バージョン表記からvを削除

リリース予定

アップデート的にはこの辺りにして、3末あたりに0.5.0としてリリースする予定です。次は0.6.0で、SecurityGroup関連と、内部のリファクタあたりをやろうかと。SecurityGroup自体はpiculetでCodenizeするのがいいと思っているので、あくまでEC2への付与、除去と、一時的なルール変更の位置付けになる予定です。

*1:EC2新規作成時のオプションは多すぎるので自分で使うもののみ。他は必要になったら実装する予定。

rnzooにinstance type変更機能を追加しました

rnzooのdevelopバージョンにec2typeというインスタンスタイプを変更するサブコマンドを追加しました。

# すでに入れている場合はtap不要
brew tap reiki4040/rnzoo

# developバージョンの指定でインストール
brew install rnzoo —devel

AWSコンソールからやると1インスタンスずつしかタイプ変更できず、たまに複数やりたくなるので追加しました。複数選ぶときはctrl+spaceです。また、変更したらどうせ起動するというのもあり、変更後に起動させるオプションも-startとしてつけています。

rnzoo ec2typeで、停止中のインスタンスが選択でき、続けてタイプの選択ができます。未指定の場合、以下の小さめ-標準ぐらいのタイプのみが選択できます。

  • t2.nano
  • t2.micro
  • t2.small
  • t2.medium
  • t2.large
  • c4.large
  • m4.large
  • r4.large

最初全部のタイプ選択できてもいいかなと思いましたが、並び順が面倒なのと、xlargeとか高いのは使わないし、間違って起動することを防ぐために除外しました。未指定の選択肢には出てきませんが、-tオプションは自由に指定できます。起動したい場合は、-t c4.2xlargeといった形で変更できます。新しいインスタンスタイプが増えた時に、更新しなくてもとりあえず、-tで対応できるというのもあります。

起動中のインスタンスを停止して変更も考えたんですが、停止まで待つ必要があり、CLIだと数分待てないかなーというのでやめました。多分やろうと思えばec2stop呼んで、ec2listでstoppedになるまで、定期ポーリングして待つとかでできそうですが、実装はしてません。

また、今回から、次のマイナーバージョンのdevelopブランチを作って、そこに機能追加していき、適宜(自分が使いたい時に)developバージョンとしてリリースしていこうとしています。そしてまとまったら正式版?*1としてリリース予定。この辺りはgit ブランチと開発バージョンなどの練習も兼ねてます。

*1:stableとは違うからなんて表現したやら