[GitLab] Dependabot

2023-03-15 hit count image

GitLab에 Dependabot을 추가하여 프로젝트에서 사용하는 라이브러리 버전 업데이트를 자동화하는 방법에 대해서 설명합니다.

개요

Dependabot은 오픈소스로 GitHub 또는 GitLab 등에서 프로젝트에서 사용하는 라이브러리의 버전이 업데이트되면 새로운 버전으로 업데이트할 수 있도록 Pull request(Merge request)를 생성해 주는 도구입니다.

Dependabot은 처음에는 GitHub에서 사용하기 위해 만들어졌지만, 현재는 오픈소스로 어떤 곳에서도 사용할 수 있으며, GitLab에서도 Dependabot을 사용할 수 있도록 지원하고 있다.

하지만, GitLab에서는 Ultimate 요금제를 사용하지 않으면 GitLab이 제공하는 기본적인 Dependabot을 사용할 수 없다.

이번 블로그 포스트에서는 GitLabUltimate 요금제가 아닌 self-managed에서 Dependabot을 사용하는 방법에 대해서 알아봅시다.

GitLab에 dependabot-script 추가

GitLabDependabot을 실행하기 위해서는 Dependabot을 실행할 수 있는 환경을 구성해야 합니다. Dependabot은 간단히 Dependabot을 실행할 수 있는 환경을 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-managedGitLab을 사용한다면, 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-managedGitLabdependabot-script을 사용하여 Dependabot을 설정하고 실행하는 방법에 대해서 살펴보았습니다. 최신 버전의 라이브러리를 사용하면 보안 문제를 해결할 수 있으며, 갑작스럽게 대규모 버전 업데이트를 할 필요가 없으므로 버전 업데이트에 많은 시간을 투자할 필요가 없습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts