開発チームがお届けするブログリレーです!既に公開されている記事もありますので、こちらから他のメンバーの投稿もぜひチェックしてみてください!

はじめに

AWSが提供するGenerative AI Use Cases(通称GenU)などのパブリックなソースをカスタマイズしている場合、機能追加や修正などをキャッチアップして最新の状態に保つことは重要な作業です。本記事ではGitHub Actionsを使ってGenUリポジトリの変更を検出し、自動的にプルリクエストを発行する方法を紹介します。今回は変更内容を確認してから手動でマージするようにしましたので、安全に更新を取り込むことができます。

ワークフローの概要

作成したワークフローは以下の機能を持っています。

  • 毎週月曜日の深夜0時(日本時間)に自動実行
  • 手動実行も可能
  • GenUリポジトリの変更を検出してプルリクエストを発行
  • 変更内容の確認と手動マージによる安全な更新

ワークフローファイルの解説

スケジュール設定

on:
  schedule:
    # 毎週月曜の深夜0時(JST 0:00 = UTC 15:00 日曜日)に実行
    - cron: '0 15 * * 0'
  # 手動実行も可能にする
  workflow_dispatch:

cronの構文で実行スケジュールを指定しています。GitHub Actionsでは時刻はUTC基準なので、日本時間との変換が必要です。

権限設定

permissions:
  contents: write
  pull-requests: write

ワークフローがリポジトリの内容変更とプルリクエスト作成に必要な権限を明示的に設定しています。

ジョブの実行

jobs:
  sync:
    runs-on: ubuntu-latest

ubuntu-latestランナーでジョブを実行します。

主要なステップ

リポジトリのチェックアウト

- name: Checkout repository
  uses: actions/checkout@v4
  with:
    fetch-depth: 0
    token: ${{ secrets.PAT_TOKEN }}
    ref: main

Git設定

- name: Configure Git
  run: |
    git config user.name "GitHub Actions"
    git config user.email "actions@github.com"

GenUリポジトリの追加

- name: Add upstream remote
  run: |
    git remote add upstream https://github.com/aws-samples/generative-ai-use-cases.git
    git fetch upstream

変更の検出

- name: Merge upstream changes
  run: |
    git merge upstream/main --allow-unrelated-histories

    # 競合が発生した場合はワークフローを失敗させる
    if [ $? -ne 0 ]; then
      echo "マージ競合が発生しました。手動で解決してください。"
      exit 1
    fi

プルリクエスト作成

- name: Create Pull Request
  uses: peter-evans/create-pull-request@v5
  with:
    token: ${{ secrets.PAT_TOKEN }}
    commit-message: "Sync upstream repository changes"
    branch: sync-upstream
    title: "GenUリポジトリの変更を同期"

完成したyamlファイル

name: Sync Upstream Repository

on:
  schedule:
    # 毎週月曜の深夜0時(JST 0:00 = UTC 15:00 日曜日)に実行
    - cron: '0 15 * * 0'
  # 手動実行も可能にする
  workflow_dispatch:

# 必要な権限を明示的に設定
permissions:
  contents: write
  pull-requests: write

jobs:
  sync:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          # PATを使用(すでにSecretsに登録済み)
          token: ${{ secrets.PAT_TOKEN }}
          # mainブランチをチェックアウト
          ref: main

      - name: Configure Git
        run: |
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"

      - name: Add upstream remote
        run: |
          git remote add upstream https://github.com/aws-samples/generative-ai-use-cases.git
          git fetch upstream

      - name: Merge upstream changes
        run: |
          # upstreamの変更をローカルにマージ(pushはしない)
          git merge upstream/main --allow-unrelated-histories

          # 競合が発生した場合はワークフローを失敗させる
          if [ $? -ne 0 ]; then
            echo "マージ競合が発生しました。手動で解決してください。"
            exit 1
          fi

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v5
        with:
          token: ${{ secrets.PAT_TOKEN }}
          commit-message: "Sync upstream repository changes"
          committer: GitHub Actions <actions@github.com>
          author: GitHub Actions <actions@github.com>
          branch: sync-upstream
          delete-branch: false
          base: main
          title: "アップストリームリポジトリの変更を同期"
          body: |
            このPRは、aws-samples/generative-ai-use-casesリポジトリからの最新の変更を同期しています。

            ## 同期内容
            - aws-samples/generative-ai-use-casesのmainブランチの最新変更を取り込み
            - 自動生成されたPRです

            変更内容を確認し、問題なければマージしてください。
          labels: |
            automated-pr
            sync-upstream 

注意点

  • このワークフローではPersonal Access Token(PAT)を使用しています。PAT_TOKENとしてGitHubのSecretsに登録する必要があります。
  • GitHub Actionsのcronジョブは結構時間がずれるので厳密な時間指定はできないものと思ったほうがいいと思います。私の体感では20~30分は当たり前です。

変更内容の確認と手動マージ

このワークフローの重要なポイントは、GenUリポジトリの変更を自動的に同期するのではなく、プルリクエストとして発行することです。これにより、以下のメリットがあります。

  • 変更内容を確認してからマージできる
  • 問題がある場合はプルリクエストを拒否できる
  • コードレビューや必要に応じた追加修正が可能

プルリクエストが作成されたら、変更内容を慎重に確認し、問題がなければ手動でマージします。

まとめ

GitHub Actionsを活用することで、GenUリポジトリの変更を自動的に検出し、プルリクエストとして発行することができます。これにより、変更内容を確認してから手動でマージするという安全な更新プロセスを実現できます。定期的なプルリクエスト発行を自動化することで、手作業による負担を軽減しつつ、適切な品質管理を維持することが可能になります。