はてなの金次郎

とあるエンジニアの技術系ブログ

Dependencies.ioによるGitLabプロジェクトのマニフェスト自動アップデート

はじめに

GitLab Advent Calendar 2018の15日目の記事です。

qiita.com

みなさんマニフェストpackage.json, composer.json, requirements.txt, etc.)のアップデートはどうされていますか?

気まぐれなタイミングで行なっていたり、手作業で行なっていたりしないでしょうか?

通常運用中のシステムに人手が必要なら、それはバグだ。

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

5章の「トイル(労苦)の撲滅」での一節です。

  • 手作業であること
  • 繰り返されること
  • 自動化できること
  • 戦術的であること
  • 長期的な価値を持たないこと
  • サービスの成長に対して O(n) であること

上記の項目に当てはまるようなタスクは可能な限り自動化していこうというのがSREの考え方です。
マニフェストのアップデートはまさにこれに当てはまるのではないかと思います。

本記事は、GitLabプロジェクトにおけるマニフェストのアップデートというトイルを Dependencies.io というサービスを利用して撲滅していこうという内容です。

www.dependencies.io

導入方法

導入はお手軽2ステップです。とても簡単に導入することができます。

  1. dependencies.ymlリポジトリに追加する
  2. 対象リポジトリDependencies.io に追加する

だけです。

実践

下記の requirements.txt のアップデートの設定をしてみます。

requests==2.20.0
Django==2.1

アップデートのMRが作成されることを確認するためにわざと最新ではないバージョンを指定しています。

1. dependencies.ymlをリポジトリに追加する

f:id:gyuuuutan:20181219022459p:plain

2. GitLabのPersonal Access Tokenを発行する

スコープは api, read_repository を選択します。

f:id:gyuuuutan:20181219021222p:plain

3. GitLabプロジェクトを選択する

f:id:gyuuuutan:20181219021048p:plain

4. 対象リポジトリのURLと発行したPersonal Access Tokenを入力する

f:id:gyuuuutan:20181219021627p:plain

上記で設定は完了です。GitLabのMRを確認してみると...

f:id:gyuuuutan:20181219022757p:plain

確かにアップデートのMRが自動生成されています!

ちなみにDependencies.ioのプロジェクトページはこんな感じです。

f:id:gyuuuutan:20181219022741p:plain

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を利用する場合は有料プランに加入する必要がありますが、それにしても無料でここまでできてしまうのはなかなかのものではないでしょうか。

導入前の調査でGreenkeeperDependabot, Renovateなどの類似サービスも候補に上がっていたのですが、GitLabに対応していることがホームページのトップで確認できたのがDependencies.ioだけだったので今回はDependencies.ioを試してみました。

www.slideshare.net

記事を書いたあとにTeppei SatoさんのSlideShareをみてRenovateがGitLabに対応しているらしいことを知り、確認してみたところ確かにGitLabに対応していました。 オートマージなど、機能的にはRenovateの方が充実してそうな印象を持ったのでこちらもいつか試してみたいです。

GitLabに関する機能や豆知識を7つ厳選してみました。
もしよろしければのぞいてみてください。

qiita.com