Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@KEINOS

GitHub Actions で Fork 元に自動追随する(Cron で自動的に Upstream を Rebase & Merge するスケジュールを組む)

GitHub Actions の schedule + cron で本家に追随したい

GitHub で fork したリポジトリで、フォーク元に変更があった場合にフォーク先も自動で追随させたい。しかもローカルの cron 実行や、外部サーバーに依存させないで GitHub だけで完結させたい

つまり、フォーク元である upstream/master の変更を、ローカルの masterrebase してから merge したものを、リモート先の origin/master に反映させてフォーク元に追随させたいのです。

この時、外部の CI サービスなどを使わずに GitHub Actionsschedule イベントで cron を使って変更をマージさせたいのです。

TL; DR

./.github/workflows/scheduled_sync.yml
# Follow Changes of Forked/Upstream Repository.
#
# This workflow rebase-marge changes from upstream's master to origin's master. 
# - Ref:
#   - https://stackoverflow.com/a/61574295/12102603 by N1ngu @ StackOverflow (EN)
#   - https://qiita.com/KEINOS/items/3bcaa6cea853f6b63475 by KEINOS @ Qiita (JA)

name: Merge upstream branches

# Triggers the action as scheduled
on:
  # Runs on 10 minutes past every hour
  schedule:
    # Ref: 
    #   - https://help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule
    #   - https://crontab.guru/examples.html
    # Cron format:
    #         ┌───────────── minute (0 - 59)
    #         │ ┌───────────── hour (0 - 23)
    #         │ │ ┌───────────── day of the month (1 - 31)
    #         │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
    #         │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
    #         │ │ │ │ │                                   
    #         │ │ │ │ │
    #         │ │ │ │ │
    #         * * * * *
    - cron:  '10 */1 * * *'

jobs:
  merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Merge upstream
        run: |
          git config --global user.name ${NAME}
          git config --global user.email ${EMAIL}

          # Pass the --rebase-merges option to git rebase by default
          git config --global pull.rebase merges

          # "git checkout master" is unnecessary, already here by default
          git pull --unshallow  # this option is very important, you would get
                                # complains about unrelated histories without it.
                                # (but actions/checkout@v2 can also be instructed
                                # to fetch all git depth right from the start)

          # Add the repo which you forked to the remote and name it as "upstream"
          git remote add upstream ${REPO_FORK}

          # Fetch the upstream branches to local
          git fetch upstream

          # Merge changes
          git checkout master
          git merge --no-edit upstream/master
          git push origin master
        # Change the below to your settings
        env:
          NAME: KEINOS
          EMAIL: github+fork-qiita-news@keinos.com
          REPO_FORK: https://github.com/yyano/Qiita-News.git
  • 🐒   注意点: 自分の masterorigin/master) をいじりすぎてフォーク元と異なる場合、かなり高い頻度でコンフリクトを起こします。そのため「./.github/workflows/ の YAML ファイルの有無くらいの差」といった、フォーク元と、ほぼ同じ状態で利用するリポジトリ向きです。
    また、当然ですが、自分の masterorigin/master) からブランチを切ると、ワークフロー(YAML ファイル)も一緒に付いてきます。この状態でフォーク元(upstream/master)に PR をするとワークフローも一緒に PR してしまいます。相手がよくわからないでマージすると、勝手にアクションが実行されエラーになるので、相手に迷惑をかけないように注意します。
  • GitHub Actions で無料で使える実行時間は約 33 時間/月です。これを越えると、翌月まで使えなくなります。

動作サンプル・リポジトリ

GitHub App

GitHub Actions でなく、サードパーティーが提供している GitHub Apps を使うなら wei/pull も簡単。

TS; DR

設定方法

  1. リポジトリをフォークして、フォーク元のリポジトリ URL(HTTPS.git 付き URL)をコピーしておきます。
  2. フォークしたリポジトリの GitHub 上にある "Actions" タブから "set up a workflow yourself" を選び、上記(TL; DR)の YAML の内容を設置(コピペ)します。ファイル名は、わかりやすければ何でも構いませんが、拡張子は .yml である必要があります。
  3. cron を実行するタイミング/ユーザー/メールアドレス/フォーク元のリポジトリ URL を変更します。
  4. Start commitCommt new file でコミットします。

フォークしたリポジトリの ./.github/workflows ディレクトリにワークフローが追加され、cron で指定したタイミングで同期が始まるので、GitHub の Action タブで成功しているか確認します。

YAML ファイルの設定内容

ワークフローの名前
name: Merge upstream branches

on:
(以下略)
scheduleイベントにcronの実行タイミングを指定する
name: Merge upstream branches

on:
  schedule:
    # cron の設定: https://crontab.guru/examples.html
    # GitHub にはユーザーごとに実行可能な時間の制限があります。合計時間が制限を
    # 超えないように必要最低限のインターバルで実行するようにします。
    - cron:  '10 */1 * * *'

jobs:
(以下略)
mergeジョブをubuntu上で実行する
name: Merge upstream branches

on:
  schedule:
    - cron:  '10 */1 * * *'

jobs:
  merge:
    runs-on: ubuntu-latest
    steps:
      - (以下略)
checkoutアクションを使ってリポジトリのclone/checkoutを行う
name: Merge upstream branches

on:
  schedule:
    - cron:  '10 */1 * * *'

jobs:
  merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: (以下略)
同期処理(pull,rebase,mergeからのpush)
name: Merge upstream branches

on:
  schedule:
    - cron:  '10 */1 * * *'

jobs:
  merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Merge upstream
        run: |
      # コミット/マージの実行ユーザー情報
      # NAME、EMAIL は下記 env 項目で設定。
      # なお、GitHub のパスワード/トークンは checkout アクションで設定済み。
          git config --global user.name ${NAME}
          git config --global user.email ${EMAIL}

      # デフォルトで git rebase の --rebase-merges を付加
          git config --global pull.rebase merges

      # "git checkout master" は checkout アクションで実行済みなので不要。

      # unshallow オプションで更新情報のみを pull してくる。これを設定しないと、
      # アップストリーム(Fork 元)から pull するときにも、すべてのブランチデータを
      # 持ってきてしまう。
          git pull --unshallow

      # フォーク元のリポジトリの URL をリモート先として登録し、"upstream" と名付ける。
      # REPO_FORK は env で設定。
          git remote add upstream ${REPO_FORK}

      # アップストリームのブランチ情報を取得
          git fetch upstream

      # upstream/master の変更をマージして origin/master にプッシュ
          git checkout master
          git merge --no-edit upstream/master
          git push origin master
        env:
          # コミット/マージを行うユーザー情報とフォーク元の git リポジトリの URL(要変更)
          NAME: KEINOS
          EMAIL: github+fork-qiita-news@keinos.com
          REPO_FORK: https://github.com/yyano/Qiita-News.git

参考文献

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
KEINOS
A Japanese made in Mexico with Mexican quality ;-) Who monkey around the jungle of codes. 記事の日本語がおかしかったら遠慮なく編集リクください。また、記事に「LGTM」が付くたび、やる気に比例して見直して何かしら加筆・修正してブラッシュアップしています。基本的に変更通知はお送りしません。
qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?