技業LOG
背景
ライブラリの自動アップデートでセキュリティ向上
昨今、ソフトウェアのセキュリティ問題が話題に上がります。OSやミドルウェア周りのアップデートに目がいきがちになり、アプリケーション開発で利用しているライブラリのアップデートがおろそかになっている場合があります。ある特定の人のみがアップデート対応を行っている場合や、不定期でアップデート対応を行う場合も修正箇所が多く、新規機能開発に注力できない状態に陥ることがあります。定期的にアップデートを行うにしても、アップデート作業を出来るだけ最小化して開発に注力したいかと思います。
そこで今回は、Renovateというツールについて紹介したいと思います。Renovateを用いることにより、ライブラリのアップデート作業を自動化して、開発に注力できる環境を作ることができます。
Renovateとは
Renovateは2017年にリリースされた、ライブラリを自動アップデートするツールです。似たようなツールにDependabotがあるかと思います。JavaScriptやGolang、Pythonなど様々な言語をサポートしています。Renovateの使用方法としては、次の方法があります。
- npm/YarnからRenovateのCLIコマンドをインストールして用いる
- Docker Hubから配布されているDocker Imageを用いる
- (GitHub.comのみ)GitHub Appを用いる
アップデート手順
導入
今回は、Renovateを用いて自動でプルリクエストをあげるように設定していきたいと思います。
前提
プラットフォームとしてはBitbucketを用います。また、ライブラリはPythonのPipenvで管理されているとします。npm/YarnでRenovateのCLIをインストールすることも可能ですが、今回は配布されているDocker Imageを用います。
Bitbucketのアプリパスワード取得
プルリクエストを作成する権限を付与するために、Bitbucketのアプリパスワードを取得します。権限としては、プルリクエストの読み取りと書き込み権限を追加します。トークンは1度しか表示されないため、後で確認できるように控えておきましょう。
GitHubのトークン取得
GitHub以外のプラットフォームを使用する場合、GitHubの個人アクセストークンを使用することが推奨されています。これは、ライブラリのリリースノートを取得する際に、1時間あたりのAPIリクエスト制限を増やすために使用されます。権限としては、Repoを追加します。
Bitbucketのアプリパスワードと同様に、トークンは1度しか表示されないため、後で確認できるように控えておきましょう。
Renovateの設定
Renovateは柔軟に設定をカスタマイズすることができます。
今回は、次の4点を満たした設定にしたいと思います。
- ライブラリのMajorバージョンとMinorバージョンの更新は、別々のプルリクエストとして扱うこと
- ライブラリのMinorバージョンとPatchバージョンの更新は、1つのプルリクエストにまとめること
- CircleCIのorbsとDockerのBase Imageも更新対象に含めること
- プルリクエストのデフォルトレビュアーを設定しておくこと
上記を満たすように設定ファイルを作成すると次のようになります。
# renovate.json { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "baseBranches": ["develop"], "extends": [ "config:base", ":semanticCommitTypeAll(chore)", ], "minor": { "groupName": "all" }, "pipenv": { "enabled": true }, "constraints": { "python": "3.8" }, "enabledManagers": [ "circleci", "dockerfile", "docker-compose", "pipenv" ], "reviewers": ["default_reviewer1", "default_reviewer2"], "platform": "bitbucket" }
Dockerfileの設定
リポジトリに応じて、使用しているプログラミング言語のバージョンが異なることが多いかと思います。renovate/renovate:23ではPyhton 3.9.0がインストールされています。今回は、Pyhton3.8.6を使用しているため、Python3.8.6と開発パッケージのインストールを行ったDocker Imageを作成します。このDocker Imageは、CircleCIで用いるためDockerレジストリにあげておきましょう。Dockerfileは次のようになります。
# Dockerfile
FROM renovate/renovate:23
ENV PYTHON_VERSION 3.8.6
USER root
RUN apt-get update && apt-get install -y ¥ make build-essential libssl-dev zlib1g-dev libbz2-dev ¥ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev ¥ libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev ¥ libmysqlclient-dev python-dev
USER ubuntu
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv && ¥ ~/.pyenv/bin/pyenv install ${PYTHON_VERSION} && ¥ ~/.pyenv/bin/pyenv global ${PYTHON_VERSION}
CircleCIの設定
定期的にプルリクエストをあげるために、CirlcieCIの定期ジョブを用いたいと思います。
上記で作成したDocker Imageを用いて、次のコマンドを定期ジョブとして実行するようにします。
# .circleci/config.yml
GITHUB_TOKEN=<github_token> docker-entrypoint.sh renovate ¥ --platform=bitbucket --username=<bitbucket_username> ¥ --password==<bitbucket_app_password> <bitbucket_repository>
結果
次のように、ライブラリのRelease Notesが記述されたプルリクエストが上がります。
まとめ
今回はRenovateについて紹介しました。RenovateとCircleCIを用いて、Pythonライブラリを定期的にアップデートするように設定しました。RenovateではAutoMergeなど様々な設定を行うことができますので、一度ドキュメントを見てみることをお勧めします。
セキュリティ周りの強化もそうですが、技術的な負債を抱えないためにも定期的にライブラリのアップデートを行っていきましょう。
技業LOG