Skip to main content

GitHub Actions를 통한 Dependabot 자동화

GitHub Actions를 사용하여 일반적인 Dependabot 관련 작업을 자동화하는 방법의 예입니다.

누가 이 기능을 사용할 수 있는 있나요?

People with write permissions to a repository can configure GitHub Actions to respond to Dependabot-created pull requests.

Dependabot 및 GitHub Actions 정보

Dependabot은 종속성을 최신 상태로 유지하기 위해 끌어오기 요청을 만들고, 해당 끌어오기 요청이 생성될 때 GitHub Actions를 사용하여 자동화된 작업을 수행할 수 있습니다. 예를 들어 추가 아티팩트 가져오기, 레이블 추가, 테스트 실행 또는 끌어오기 요청 수정 등이 있습니다.

이벤트에 응답

Dependabot은 끌어오기 요청 및 댓글에서 GitHub Actions 워크플로를 트리거할 수 있지만 다른 방식으로 처리되는 이벤트도 있습니다.

Dependabot(github.actor == 'dependabot[bot]')에서 pull_request, pull_request_review``pull_request_review_comment``push``create, deployment, deployment_status 이벤트를 사용하여 시작한 워크플로에는 다음 제한 사항이 적용됩니다.

  • GITHUB_TOKEN 에는 기본적으로 읽기 권한만이 부여되어 있습니다.
  • 비밀은 Dependabot의 비밀에서 채워집니다. GitHub Actions 비밀을 사용할 수 없습니다.

Dependabot(github.actor == 'dependabot[bot]')에서 pull_request_target 이벤트를 사용하여 시작한 워크플로의 경우 끌어오기 요청의 기본 참조가 Dependabot(github.actor == 'dependabot[bot]')에 의해 만들어졌다면 GITHUB_TOKEN은 읽기 전용이며 비밀을 사용할 수 없습니다.

이러한 제한은 다른 행위자가 워크플로를 다시 실행하는 경우에도 적용됩니다.

자세한 내용은 “GitHub Actions 및 워크플로 보안 유지: pwn 요청 방지”를 참조하세요.

GITHUB_TOKEN 권한 변경

기본적으로 Dependabot로 트리거된 GitHub Actions 워크플로에는 GITHUB_TOKEN과 읽기 전용 권한이 제공됩니다. 워크플로의 permissions 키를 사용하여 토큰에 대한 액세스를 늘릴 수 있습니다.

name: CI
on: pull_request

# Set the access for individual scopes, or use permissions: write-all
permissions:
  pull-requests: write
  issues: write
  repository-projects: write
  ...

jobs:
  ...

자세한 내용은 "자동 토큰 인증"을(를) 참조하세요.

비밀에 액세스

Dependabot 이벤트가 워크플로를 트리거하는 경우 워크플로에서 사용할 수 있는 유일한 비밀은 Dependabot 비밀뿐입니다. GitHub Actions 비밀을 사용할 수 없습니다. 따라서 Dependabot 이벤트에 의해 트리거되는 워크플로에서 사용되는 비밀을 Dependabot 비밀로 저장해야 합니다. 자세한 내용은 "Dependabot에 대한 개인 레지스트리 액세스 구성"을(를) 참조하세요.

Dependabot 비밀은 secrets 컨텍스트에 추가되고 GitHub Actions에 대한 비밀과 정확히 동일한 구문을 사용하여 참조됩니다. 자세한 내용은 "GitHub Actions에서 비밀 사용"을(를) 참조하세요.

Dependabot 및 다른 행위자가 트리거하는 워크플로가 있는 경우 가장 간단한 해결 방법은 작업에 필요한 권한과 이름이 동일한 Dependabot 비밀에 토큰을 저장하는 것입니다. 그러면 워크플로는 해당 비밀에 대한 단일 호출을 포함할 수 있습니다. Dependabot의 비밀 이름이 다른 경우 조건을 사용하여 여러 작업자가 사용할 올바른 비밀을 지정합니다. 조건을 사용하는 예시는 아래의 “일반적인 자동화”를 참조하세요.

사용자 이름 및 암호를 사용하여 AWS의 프라이빗 컨테이너 레지스트리에 액세스하려면 워크플로에 usernamepassword에 대한 비밀이 포함되어 있어야 합니다. 아래 예시에서 Dependabot이 워크플로를 트리거하면 이름이 READONLY_AWS_ACCESS_KEY_ID``READONLY_AWS_ACCESS_KEY인 Dependabot 비밀이 사용됩니다. 다른 작업자가 워크플로를 트리거하는 경우 해당 이름의 작업 비밀이 사용됩니다.

name: CI
on:
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Login to private container registry for dependencies
        uses: docker/login-action@v2
        with:
          registry: https://1234567890.dkr.ecr.us-east-1.amazonaws.com
          username: ${{ secrets.READONLY_AWS_ACCESS_KEY_ID }}
          password: ${{ secrets.READONLY_AWS_ACCESS_KEY }}

      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)

수동으로 워크플로 다시 실행

Dependabot 워크플로를 수동으로 다시 실행하면 다시 실행을 시작한 사용자에게 다른 권한이 있더라도 이전과 동일한 권한으로 실행됩니다. 자세한 내용은 "워크플로 및 작업 다시 실행"을(를) 참조하세요.

일반적인 Dependabot 자동화

다음은 GitHub Actions를 사용하여 자동화할 수 있는 일반적인 시나리오입니다.

끌어오기 요청에 대한 메타데이터 가져오기

대량의 자동화를 사용하려면 끌어오기 요청의 내용에 대한 정보, 즉 종속성 이름이 무엇인지, 프로덕션 종속성인지, 주요 업데이트인지, 사소한 업데이트인지 또는 패치 업데이트인지를 알고 있어야 합니다.

dependabot/fetch-metadata 작업은 사용자에게 모든 정보를 제공합니다.

name: Dependabot fetch metadata
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      # The following properties are now available:
      #  - steps.metadata.outputs.dependency-names
      #  - steps.metadata.outputs.dependency-type
      #  - steps.metadata.outputs.update-type

자세한 내용은 dependabot/fetch-metadata 리포지토리를 참조하세요.

끌어오기 요청에 레이블 지정

GitHub 레이블을 기반으로 하는 다른 자동화 또는 심사 워크플로가 있는 경우 제공된 메타데이터에 따라 레이블을 할당하도록 작업을 구성할 수 있습니다.

예를 들어 레이블을 사용하여 모든 프로덕션 종속성 업데이트에 플래그를 지정하려는 경우:

name: Dependabot auto-label
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Add a label for all production dependencies
        if: steps.metadata.outputs.dependency-type == 'direct:production'
        run: gh pr edit "$PR_URL" --add-label "production"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}

끌어오기 요청 승인

Dependabot 끌어오기 요청을 자동으로 승인하려면 워크플로에서 GitHub CLI를 사용할 수 있습니다.

name: Dependabot auto-approve
on: pull_request

permissions:
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Approve a PR
        run: gh pr review --approve "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

끌어오기 요청에서 자동 병합 사용

유지 관리자가 자동 병합에 대한 특정 끌어오기 요청을 표시하도록 허용하려면 GitHub의 자동 병합 기능을 사용할 수 있습니다. 이를 통해 분기 보호 규칙에서 요구하는 테스트 및 승인이 성공적으로 충족될 때 끌어오기 요청을 병합할 수 있습니다. 자세한 내용은 "끌어오기 요청 자동 병합" 및 "분기 보호 규칙 관리"을(를) 참조하세요.

분기 보호 규칙 대신 규칙 집합을 만들 수 있습니다. 자세한 정보는 "규칙 세트 정보"을(를) 참조하세요.

참조: 상태 검사를 사용하여 끌어오기 요청을 테스트하는 경우 Dependabot 끌어오기 요청에 대해 대상 분기에 대해 병합하기 전에 상태 검사 필요를 사용하도록 설정해야 합니다. 이 분기 보호 규칙을 사용하면 필요한 모든 상태 검사를 통과하지 않을 경우 끌어오기 요청이 병합되지 않습니다. 자세한 내용은 "분기 보호 규칙 관리"을(를) 참조하세요.

대신 GitHub Actions 및 GitHub CLI를 사용할 수 있습니다. 다음은 my-dependency에 대한 모든 패치 업데이트를 자동으로 병합하는 예제입니다.

name: Dependabot auto-merge
on: pull_request

permissions:
  contents: write
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        if: contains(steps.metadata.outputs.dependency-names, 'my-dependency') && steps.metadata.outputs.update-type == 'version-update:semver-patch'
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

실패한 워크플로 실행 문제 해결

워크플로 실행이 실패하면 다음을 확인합니다.

  • 올바른 작업자가 워크플로를 트리거하는 경우에만 워크플로를 실행합니다.
  • pull_request에 대해 올바른 ref를 체크 아웃합니다.
  • 비밀은 GitHub Actions 비밀이 아닌 Dependabot 비밀에서 제공됩니다.
  • 올바른 권한이 있는 GITHUB_TOKEN이 있습니다.

GitHub Actions 쓰기 및 디버깅에 대한 자세한 내용은 "GitHub Actions 알아보기"을 참조하세요.