0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

featureブランチに最新のdevelopが取り込まれているかチェックする方法

Last updated at Posted at 2024-05-20

はじめに

こちらの記事では、Git コマンドを使って feature ブランチに最新の develop ブランチの変更が取り込まれているかチェックする方法を図解入りで書きます。

背景

関わっていたプロジェクトで CloudBuild を使った CICD を構成していました。開発フローは develop ブランチ から feature ブランチを切って開発を進めています。

そこで、staging 環境上で QA をするために、feature ブランチを指定してデプロイすることがありました。
しかし、最新の develop ブランチの内容を feature ブランチに取り込んでいないと、予期せぬ不具合が起きることがあります。
つまり、feature ブランチはデプロイする際には、最新の develop ブランチを取り込んでいる(=Update branch)必要がありました。

GitHub 上では、develop ブランチに保護ルールを設定することで、feature ブランチが最新の develop ブランチの変更を取り込んでいないと develop ブランチにマージできないように設定することはできます。しかし、ブランチ指定デプロイをする場合は、CloudBuild 内の処理でそれと同様の内容を実現する必要があります。

処理

以下の cloudbuild.yaml のステップを使用して、feature ブランチが最新の develop ブランチの変更を取り込んでいるかを確認します。

cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/git'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    git remote set-url origin https://$$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/organization/project.git
    git fetch --unshallow
    if [ $(git rev-parse origin/develop) != $(git merge-base origin/$BRANCH_NAME origin/develop) ]; then
      echo "最新のdevelopがブランチに取り込まれていません。Update branchしてください。"
      exit 1
    fi
  secretEnv: ['GITHUB_PERSONAL_ACCESS_TOKEN']
  dir: '$_REPO_NAME'

それぞれのコードの説明です。
まずは、リモートリポジトリの URL を設定します。認証には個人アクセストークンを使用しています。
git remote set-url origin https://$$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/organization/project.git

次に、リポジトリの履歴を全て取得します。
git fetch --unshallow

時間がかかる場合は、以下のように履歴の長さを指定することもできます。
git fetch --depth=100
筆者が関わったプロジェクトでは、--unshallowでは 30s、--depth=100で 10s くらいの処理時間がかかっていました。

リモートリポジトリの develop ブランチの最新コミットハッシュを取得します。
git rev-parse origin/develop

CloudBuild 実行時に指定したリモートリポジトリの $BRANCH_NAME ブランチと develop ブランチの共通の祖先のコミットハッシュを取得します。
git merge-base origin/$BRANCH_NAME origin/develop

この両者が一致していなければ最新の develop が feature ブランチに取り込まれていないと判断されるわけですが、図解すると以下のようになります。

一つ目は一致していないパターンです。
不一致パターン.png

develop ブランチから feature ブランチが切られ、開発が進んでいます。feature ブランチは develop の古いコミットから分岐していますね。
最新の develop ブランチのコミットが feature ブランチには取り込まれていないのでビルドを中止します。

二つ目は一致しているパターンです。
一致パターン.png

develop ブランチから feature ブランチへのマージコミット(=Update branch)が追加されています。develop ブランチの最新コミットが feature ブランチとの分岐点となっています。
つまり、最新の develop ブランチが feature ブランチに取り込まれていることを表すのでビルドを続けます。

このような処理を追加することで、最新の develop ブランチが feature ブランチに取り込まれているかどうかを判定することができます。

まとめ

この記事では、Git コマンドを使って最新の develop ブランチが feature ブランチに取り込まれているかどうかを判定する方法を書きました。

皆さんのお役に立てれば幸いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?