Dependencies.ioによるGitLabプロジェクトのマニフェスト自動アップデート
はじめに
GitLab Advent Calendar 2018の15日目の記事です。
みなさんマニフェスト( package.json
, composer.json
, requirements.txt
, etc.)のアップデートはどうされていますか?
気まぐれなタイミングで行なっていたり、手作業で行なっていたりしないでしょうか?
通常運用中のシステムに人手が必要なら、それはバグだ。
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム
- 発売日: 2017/08/12
- メディア: 単行本(ソフトカバー)
5章の「トイル(労苦)の撲滅」での一節です。
- 手作業であること
- 繰り返されること
- 自動化できること
- 戦術的であること
- 長期的な価値を持たないこと
- サービスの成長に対して O(n) であること
上記の項目に当てはまるようなタスクは可能な限り自動化していこうというのがSREの考え方です。
マニフェストのアップデートはまさにこれに当てはまるのではないかと思います。
本記事は、GitLabプロジェクトにおけるマニフェストのアップデートというトイルを Dependencies.io というサービスを利用して撲滅していこうという内容です。
導入方法
導入はお手軽2ステップです。とても簡単に導入することができます。
dependencies.yml
をリポジトリに追加する- 対象リポジトリを Dependencies.io に追加する
だけです。
実践
下記の requirements.txt
のアップデートの設定をしてみます。
requests==2.20.0 Django==2.1
アップデートのMRが作成されることを確認するためにわざと最新ではないバージョンを指定しています。
1. dependencies.ymlをリポジトリに追加する
2. GitLabのPersonal Access Tokenを発行する
スコープは api
, read_repository
を選択します。
3. GitLabプロジェクトを選択する
4. 対象リポジトリのURLと発行したPersonal Access Tokenを入力する
上記で設定は完了です。GitLabのMRを確認してみると...
確かにアップデートのMRが自動生成されています!
ちなみにDependencies.ioのプロジェクトページはこんな感じです。
Dependencies.ioの何がいいのか
Dependencies.ioの特徴をまとめてみました。
ワークフローにあったアップデート
複数言語のアップデートが可能
1つのリポジトリで複数の開発言語を利用しているケースがあるかもしれません。そういった場合でも1つの言語だけでなく、複数の開発言語をアップデートするように設定することができます。2018年12月時点で JavaScript
, Python
, PHP
, Docker
, Git
に対応しており, Ruby
, Java
, Go
, Rust
, iOS
, Android
, .NET
に関しても順次追加予定らしいです。
カスタムスクリプト実行後のアップデートが可能
リポジトリによってはカスタムスクリプトやあるコマンドを実行した後にパッケージのアップデートを行いたいといったケースがあるかもしれません。そういった場合でもアップデート前に任意のコマンドを実行するように設定することができます。
上記のように様々なワークフローに対応することができます。
アップデートのカスタマイズ
パッケージ管理ファイルの場所に依存しない
パッケージ管理ファイルのパスを指定できるため、必ずしもトップディレクトリに配置する必要はありません。
バージョンのフィルタリングが可能
フィルタリングという機能を利用すると、必要な更新と依存関係を正確に指定することができます。これにより、いくつかの依存関係をパッチやバグ修正だけに制限することができます。例えば、 L.Y.Y
と指定するとマイナーとパッチのバージョンだけ受け入れられて、メジャーバージョンはロックされます。また、 バージョンといってもセマンティックバージョンが全てではありません。正規表現に対応しているため nighly
のように指定することも可能です。
パイプラインが自動で走る
GitLab CI/CDのパイプラインを実行してくれるため、テストジョブが設定されている場合、アップデートされたバージョンで確かにテストが通ったことを確認することができます。
ロックファイルの自動アップデート
マニフェストだけではなく、ロックファイルの依存関係もアップデートするように設定することが可能です。
スケジューリング
アップデートの頻度・時間帯の指定が可能
毎日、毎週、毎月のスケジュールオプションにより、プロジェクトや開発チームにあったタイミングでアップデートを受け取ることができます。時間帯の指定も可能です。
おわりに
Freeプランはパブリックリポジトリのみなので、プライベートリポジトリでDependencies.ioを利用する場合は有料プランに加入する必要がありますが、それにしても無料でここまでできてしまうのはなかなかのものではないでしょうか。
導入前の調査でGreenkeeperやDependabot, Renovateなどの類似サービスも候補に上がっていたのですが、GitLabに対応していることがホームページのトップで確認できたのがDependencies.ioだけだったので今回はDependencies.ioを試してみました。
www.slideshare.net
記事を書いたあとにTeppei SatoさんのSlideShareをみてRenovateがGitLabに対応しているらしいことを知り、確認してみたところ確かにGitLabに対応していました。 オートマージなど、機能的にはRenovateの方が充実してそうな印象を持ったのでこちらもいつか試してみたいです。
GitLabに関する機能や豆知識を7つ厳選してみました。
もしよろしければのぞいてみてください。