GitHubのDependabotが作るプルリクエストで動くCI/CDで、デプロイさせたくない

GitHubのDependabotを完全に理解しました。
2022.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

GitHubには、Dependabotという便利な機能があります。 これは、利用しているライブラリに脆弱性が見つかったり、更新できる場合に、自動でプルリクエストを作ってるくれる機能です。

とてもありがたい機能なのですが、同時にプルリクエスト(のためのブランチ)が作られて、同時にCI/CDが動いて、同時に同じAWS環境にデプロイされるのは嬉しくありません。 そこで、本記事では、「Dependabotで作られたプルリクエストの場合、デプロイさせない」を試してみます。 なお、CI/CDはCircleCIを使います。

おすすめの方

  • GitHubのDependabotについて知りたい方
  • CircleCIで特定のブランチ名のときにワークフローを変えたい方

Dependabotについて、簡単におさらい

プルリクエストの作成は、2つの種類があります。それぞれ、設定方法が異なります。

テスト用のGitHubリポジトリを準備する

適当なGitHubリポジトリを作成し、脆弱性のあるライブラリを利用するようにしてみます。 ここでは、Python(pip)を利用することにして、PyYAMLrequestsの最初のバージョンを指定します。

requirements.txtを作成する

touch requirements.txt

古いバージョンのライブラリをrequirements.txtに記載する

PyYAML==3.01
requests==0.0.1

CircleCIのワークフローを作成する

mkdir .circleci
touch .circleci/config.yml

CircleCIのconfigファイル

下記としてみました。

  • lint_and_unittest
    • すべてのブランチ・タグで動作する
  • deploy
    • dependabotブランチ以外で動作する

config.yml

version: 2.1

executors:
  my_executor:
    docker:
      - image: circleci/python:3.9.9
    working_directory: ~/work

commands:
  lint_and_unittest:
    steps:
      - run:
          name: lint_and_unittest
          command: |
            echo lint and unittest

  deploy:
    steps:
      - run:
          name: deploy
          command: |
            echo deploy

jobs:
  lint_and_unittest:
    executor: my_executor
    steps:
      - checkout
      - lint_and_unittest

  deploy:
    executor: my_executor
    steps:
      - checkout
      - deploy

workflows:
  version: 2
  my_workflow:
    jobs:
      - lint_and_unittest:
          filters:
            tags:
              only: /.*/
      - deploy:
          filters:
            branches:
              ignore: /dependabot\/.+/
          requires:
            - lint_and_unittest

ここでgit pushしておきます。

CircleCIの設定をする

CircleCIにアクセスし、プロジェクトを設定します。

CircleCIでプロジェクトを設定する

初回のワークフローが動きました。

CircleCIでワークフローが動く

GitHubでDependabotの設定をする

セキュリティアラートとプルリクエスト作成を有効にする

「Settings」の「Code security and analysis」にアクセスし、下記を有効にします。

  • Dependabot alerts
  • Dependabot security updates

GitHubでDepandabotを設定する

これによって、セキュリティアラートとセキュリティアラートに関する脆弱性のプルリクエストを作成してくれます。

セキュリティアラートの通知がくる

少し待つと、セキュリティアラートの通知がきました。

GitHubでセキュリティアラートの通知がくる

プルリクエストが作成される

そして、プルリクエストも作成されました。

GitHubでセキュリティアラート対応のプルリクエストが作られる

CircleCIを確認する

CircleCIを確認すると、「lint_and_unittest」のみが実行されていました。 予定通りです。

CircleCIでワークフローが動く

プルリクエストをマージする

プルリクエストをマージすると、セキュリティアラートがCloseになりました。

セキュリティアラートがCloseになる

requirements.txtは下記に更新されました。

requirements.txt

PyYAML==5.4
requests==2.20.0

おまけ:バージョンアップデートを試す

バージョンアップデートを設定する

セキュリティアラートに関係しないプルリクエスト作成として、バージョンアップデートがあります。これは、脆弱性に関係せず、最新のバージョンに更新するプルリクエストを作成してくれます。

これは、「Insights」の「Dependency graph」の「Dependabot」で設定ファイルを作成します。

GitHubでバージョンアップデートを設定する

もしくは、.github/dependabot.ymlを作成してcommit&pushします。

dependabot.yml

# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "pip" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"

設定ファイルの中身は、下記を参考にしてください。

プルリクエストができた

少し待つと、最新バージョンへのプルリクエストが作られました。

GitHubでプルリクエストが作られる

CircleCIを確認する

予定通り、「lint_and_unittest」のみが実行されました。

CircleCIのワークフローが動く

さいごに

GitHubのDependabotが2種類あり、それぞれの役割や設定方法について理解できました。 便利な機能なので、どんどん活用していきたいです。 そして、同時にプルリクエスト(のためのブランチ)が作られてCI/CDが動く場合でも、ブランチ名によってワークフローを変更し、デプロイさせないようにしました。 もし、「デプロイして動作を確認したい」場合は、approveと組み合わせて、人間が任意のタイミングでデプロイさせると良さそうです。

参考