[GitLab] Dependabot

2023-03-15 hit count image

GitLabにDependabotを追加してプロジェクトで使ってるライブラリのバージョンアップデートを自動化する方法について説明します。

概要

DependabotはオープンソースでGitHubまたはGitLabなどでプロジェクトで使ってるライブラリのバージョンがアップデータおされたら新しいバージョンにアップデートできるようにPull request(Merge request)を生成してくれるツールです。

Dependabotは最初GitHubで使うため作られましたが、現在はオープンソースでどこでも使うことができますので、GitLabDependabotを使えるようにサポートしてます。

しかし、GitLabではUltimateプランを使わないとGitLabが提供する基本的なDependabotを使うことができません。

今回のブログポストではGitLabUltimateプランではないself-managedDependabotを使う方法について説明します。

GitLabへdependabot-script追加

GitLabDependabotを実行するためにはDependabotを実行できる環境を作る必要があります。DependabotDependabotを簡単に実行できる環境をdependabot-scriptリポジトリで提供してます。

次の順番でGitLabdependabot-scriptリポジトリを追加します。

  1. GitLabにアクセス
  2. New Project
  3. Import project
  4. Repository by URL

そしてRepository URLdependabot-scriptのリポジトリURLを入力して追加します。

  • Repository URL: https://github.com/dependabot/dependabot-script

GitLab token生成

dependabot-scriptリポジトリで他のリポジトリのライブラリのバージョンを検査して、新しいバージョンがある場合 Merge requestを自動で作ります。したがって、他のリポジトリにアクセスしてMerge requestを作るため、Personal Access Tokensが必要です。

GitLab Dependabot - personal access tokens

apiの権限を持つPersonal Access Tokenを生成します。

GitHub token生成

dependabot-scriptリポジトリはGitHubAPIを使ってライブラリのバージョンを検査します。したがって、GitHubAPIを使うためGitHubPersonal access tokenを生成する必要があります。

GitHubでログインをした後、右上のプロフィールイメージを選択します。その後、Settingsを選択して設定画面に移動します。

設定画面で左メニューリストの一番下のDeveloper settingsを選択します。その後、Personal access tokens > Token (classic)を押してToken生成画面に移動します。

GitLab Dependabot - GitHub personal access tokens

Tokenrepopublic_repo権限を設定した後、生成します。

CI/CDの変数設定

このように生成したPersonal Access Tokendependabot-scriptCI/CD変数に設定する必要があります。

GitLab Dependabot - add token to CI/CD variables

dependabot-scriptリポジトリでSettings > CI/CD > VariablesExpandをクリックします。

そして上で作ったGitLabPersonal Access TokenGITLAB_ACCESS_TOKENkeyにして追加します。

  • Key: GITLAB_ACCESS_TOKEN
  • Value: token

また、GitHubPersonal Access TokenGITHUB_ACCESS_TOKENkeyにして追加します。

  • Key: GITHUB_ACCESS_TOKEN
  • Value: token

もし、selfd-managedであるGitLabを使う場合、GITLAB_HOSTNAMEを一緒に設定する必要があります。

  • Key: GITLAB_HOSTNAME
  • Value: gitlab.dev-yakuza.com

.gitlab-ci.ymlファイル

dependabot-scriptのリポジトリを見ると.gitlab-ci.example.ymlファイルがあります。このファイルの名前を.gitlab-ci.ymlに変更します。

GitLab Dependabot - rename .gitlab-ci.example.yml to .gitlab-ci.yml

Schedule生成

次はDependabotを一定周期で実行して特定プロジェクトで使ってるライブラリのバージョンを確認して、新しいバージョンがある場合Merge requestを生成するように作る必要があります。

そしたら、次のようにdependabot-scriptリポジトリに新しいScheduleを追加します。

GitLab Dependabot - create a new schedule of pipeline

この時、Variablesに特定プロジェクトのPathとそのプロジェクトで使ってるPackage managerを設定する必要があります。

  • PROJECT_PATH: / (ex> dev-yakuza/deku-nextjs-boilerplate)
  • PACKAGE_MANAGER_SET: project manager (ex> npm_and_yarn)

dependabot-scriptで設定できるPackage managerのリストは次のリンクで確認できます。

使えるPacakge managerは次のようです。

  • bundler
  • cargo
  • composer
  • dep
  • docker
  • elm
  • go_modules
  • gradle
  • hex
  • maven
  • npm_and_yarn
  • nuget
  • pip (includes pipenv)
  • submodules
  • terraform

Scheduleの実行

このように作ったScheduleを実行して実際Dependabotがうまく機能できるか確認します。

GitLab Dependabot - create a new schedule of pipeline

問題なければ、PROJECT_PATHに設定されたリポジトリに次のようにMerge requestが生成されたことが確認できます。

GitLab Dependabot - merge request

ERROR: Job failed: failed to pull image dependabot/dependabot-script

基本的に.gitlab-ci.ymlファイルの内容は変更する必要はないです。しかし、GitLabのサーバの設定によって次のようなエラーが発生する場合があります。

ERROR: Job failed: failed to pull image "dependabot/dependabot-script" with specified policies [always]: Error response from daemon: pull acces s denied for dependabot/dependabot-script, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go: 237:2s)

この場合、.gitlab-ci.ymlファイルを次のように修正します。

# build-image:
#   tags:
#     - shell
#   stage: build
#   script:
#     - docker build -t "dependabot/dependabot-script" -f Dockerfile .

.dependabot:
  tags:
    - docker
  image: dependabot/dependabot-core
  before_script:
    - bundle install -j $(nproc) --path vendor
  variables:
    PACKAGE_MANAGER: $CI_JOB_NAME
  script:
    - bundle exec ruby ./generic-update-script.rb
  only:
    - schedules

このように修正してScheduleを実行すると問題なくMerge requestが生成されることが確認できます。

完了

これでUltimateプランではないself-managed用のGitLabdependabot-scriptを使ってDependabotを設定して、実行する方法について見てみました。最新バージョンのライブラリを使うとセキュリティの問題を解決することができるし、急に大規模のバージョンアップデートをする必要がなくなるので、大規模のバージョンアップデートの手間がなくなります。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts