CodeCommitで「ブランチの条件付きポリシー」を設定し適用範囲を確認しました
いわさです。
CodeCommitを使ってGitHubのブランチ保護相当の設定を行うシーンがありましたので手順・確認結果を記します。
masterブランチ・developブランチでのプッシュと削除を制限し、プルリクエストでのみ更新する運用を想定しています。
CodeCommitでは、これを「ブランチの条件付きポリシー」を設定することで実現します。
リポジトリの作成
マネジメントコンソール、CodeCommit内のメニューから「リポジトリを作成」を押下しリポジトリを作成します。
その後任意のファイルをアップロードし、ブランチメニューからdevelopブランチを作成します。
デフォルト管理ポリシーの挙動確認
ローカルgitクライアントでプルを行うため、認証用のユーザーを作成します。
この記事内では、masOS + gitクライアントを使い、HTTPS通信で使用します。
IAMユーザー作成
マネジメントコンソール、IAMより任意のユーザーを作成して、管理ポリシー「AWSCodeCommitPowerUser」をアタッチします。
直接プッシュ
今回はgitクライアントからHTTPSで接続します。
IAMの "ユーザー" -> "認証情報タブ" -> "AWS CodeCommit の HTTPS Git 認証情報" より 認証情報を生成します。
マネジメントコンソールのリポジトリ設定より HTTPS用の接続先を取得します。
git clone <HTTPS接続先> git checkout develop
クローン後、ファイルを編集し、変更のコミット&プッシュをします。
git add . git commit -m "add develop branch." git push
マネジメントコンソール上に反映されていることを確認しました。
この時点ではdevelopブランチへの直接プッシュが可能です。
条件付きポリシーの設定・動作確認
リモートブランチへの操作の制限を行います。
マネジメントコンソールからIAMポリシーの作成を行います。
今回はビジュアルエディターで設定してみました。
設定項目 | 値 |
---|---|
サービス | CodeCommit |
モード | 拒否モード |
アクション | GitPush, DeleteBranch |
リポジトリARN | 作成したリポジトリのもの |
リポジトリARNはCodeCommitの各リポジトリの設定画面で確認できます。
ひとつ注意点があって、以下を参考にNullステートメントを追加してください。
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html
Git のブランチは、ヘッドコミットの SHA-1 値へのポインタ (リファレンス) です。そのため、条件では References が使用されます。効果が Deny で、GitPush がアクションの 1 つであるポリシーでは、Null ステートメントが必要です。これは、ローカルリポジトリから CodeCommit に変更をプッシュするときに、Git と git-receive-pack がどのように動作するかによって必要となります。
Nullステートメントがない場合、プッシュ時に全てのブランチで認証エラーが起きるようになります。
iwasa.takahito@HL00780 repo_iwasa % git push fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa/': The requested URL returned error: 403
ポリシーを作成後、IAMユーザー(orグループ)へアタッチします。
リモートブランチを削除してみます。
削除に失敗することが確認出来ました。
次に、gitクライアントからdevelopブランチへプッシュしてみます。
iwasa.takahito@HL00780 repo_iwasa % git push Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 532 bytes | 532.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa ! [remote rejected] develop -> develop (You don't have permission to push changes to this branch.) error: failed to push some refs to 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa'
直接プッシュに失敗することが確認出来ました。
featureブランチのプッシュと、プルリクエストの動作確認
リモートブランチの直接更新・削除が出来ないことが確認できたので、featureブランチからプルリクエストで更新出来ることを確認します。
まず、リモートブランチを作成します。
ローカルでチェックアウトします。
iwasa.takahito@HL00780 repo_iwasa % git fetch --prune From https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa * [new branch] feature/add_readme -> origin/feature/add_readme iwasa.takahito@HL00780 repo_iwasa % git branch -r origin/develop origin/feature/add_readme origin/master iwasa.takahito@HL00780 repo_iwasa % git checkout feature/add_readme Branch 'feature/add_readme' set up to track remote branch 'feature/add_readme' from 'origin'. Switched to a new branch 'feature/add_readme'
編集してプッシュすると成功します。 featureブランチではリモートプッシュできることを確認出来ました。
iwasa.takahito@HL00780 repo_iwasa % vi README.md iwasa.takahito@HL00780 repo_iwasa % git add . iwasa.takahito@HL00780 repo_iwasa % git commit -m "push feature branch" [feature/add_readme bc92621] push feature branch 1 file changed, 1 insertion(+) iwasa.takahito@HL00780 repo_iwasa % git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Writing objects: 100% (3/3), 283 bytes | 283.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa 2a8d334..bc92621 feature/add_readme -> feature/add_readme
featureブランチからdevelopブランチへのプルリクエストを作成し、マージしてみます。
マージに成功しました。
developブランチからmasterブランチへのプルリクエストを作成し、マージしてみます。
マージ後のブランチ自動削除オプションを有効した場合、失敗します。
削除オプションを無効化すると今度は成功しました。
これで期待どおり、featureでの変更内容がmasterまで反映されました。
タグ作成の確認
ブランチの直接プッシュは出来ませんでした。
最後に、タグ付けが出来るか確認してみます。
iwasa.takahito@HL00780 repo_iwasa % git checkout develop iwasa.takahito@HL00780 repo_iwasa % git tag hoge-tag iwasa.takahito@HL00780 repo_iwasa % git push origin --tags Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 532 bytes | 532.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa * [new tag] hoge-tag -> hoge-tag
タグ作成が出来ていることを確認しました。
最後に
他にも様々な項目の制御が可能です。
以下のリファレンスを参照してください。
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html