gitlabを用いてバージョン管理をしています。
developブランチで開発を行い、コミットにバージョンタグを振ってバージョンを管理しています。
リリースの際はバージョンタグとは別にリリースタグを作成してリリースしています。
間違えてmasterブランチでバージョンタグを作成してしまうことで思わぬデグレが起きぬよう、バージョンタグはdevelopブランチからしか作成できないように制限したいです。
何か解決方法をご存じの方いらっしゃいましたらご教示お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
自分も「できたらいいな」と思ったので調べて(というか試して)みました。
gitlab(というかgitの機能)の場合,
- pushできるユーザーをブランチ毎に制限する
- タグを作成できるユーザーを制限する
というのはproject毎の設定「レポジトリの設定」からできます。
例えば「レポジトリの設定」の「Protect Tags」で
タグ名を「v*
」,作成許可を「Maintainers」のみに設定すると,「Maintainers」に登録されている
ユーザー以外は「v1.1.1
」「v0.2
」等のタグが作成できなくなります。
「release-*
」も重ねて追加すると,「release-0.3.2
」,「realease-1
」等のタグも同様となります。
ただ, 「レポジトリ毎に作成可能なtag名を制限する」というのはgitlab本体の機能としてはない ようです。
では,運用でどうするかですが,gitlab apiを利用して簡単なツールを作り,
そこからしかtagを設定しないようにする方法が考えられます。
次のシェルスクリプトは最初の引数にブランチ名を指定すると,
短い方のコミットID,コミット時刻,コミット時のメッセージを一覧で表示するという例です。
なお,jq
はJSON
文字列を整形して表示するコマンドのようで,ubuntuなら
sudo apt install jq
でインストールできます。
bash
1#!/bin/bash 2 3# ./commits_list_at_branch.sh 「ブランチ名」 4# 5# ブランチ名のコミットID一覧を表示する 6# あらかじめ chmod -x commits_list_at_branch.sh 等で実行権限をつけておくこと 7 8# サーバーのURL 9MY_URI=http://gitlab.example.com 10 11# プロジェクトのID。 プロジェクトの番号が分かっているなら数字でもよし 12# 下の例は 「user/test」 で示すプロジェクト(/は%2Fと設定する) 13PROJECT_ID=user%2Ftest 14 15# プロジェクトの設定→トークンからアクセス用トークンを作成できる。 16# 作成直後しか文字列が表示されないのですぐにコピペをしておくよう注意が必要。 17MY_TOKEN=this-is-example-token 18 19curl -s --header "PRIVATE-TOKEN: $MY_TOKEN" \ 20 "$MY_URI/api/v4/projects/$PROJECT_ID/repository/commits?ref_name=$1" \ 21 |jq -r '.[]|[.short_id, .committed_date, .title]|@csv'
これを利用して,バージョンタグを設定するシェルスクリプトを作ってみます。(create_version_tag.sh
)
bash
1#!/bin/bash 2 3# ./create_version_tag.sh id version 4# 5# 「develop」ブランチの「コミットID(id。短い方)」に 6# 「v+version」の名前でタグを追加する 7 8# 上のスクリプトのコメントと同じなので省略 9MY_URI=http://gitlab.example.com 10PROJECT_ID=user%2Ftest 11MY_TOKEN=this-is-example-token 12 13# developブランチにあるコミットID一覧を取得して「引数1」があるかどうか調べる 14curl -s --header "PRIVATE-TOKEN: $MY_TOKEN" \ 15 "$MY_URI/api/v4/projects/$PROJECT_ID/repository/commits?ref_name=develop" \ 16 |jq -r '.[].short_id' \ 17 |grep $1 18 19# grepに引っかかった(developブランチの)時のみtag名追加の処理。 20# 「tag_name=v$2」というところがタグ名を指定しているところ 21# $1はコミットID 22case $? in 23 0 ) curl -s --request POST --header "PRIVATE-TOKEN: $MY_TOKEN" \ 24 "$MY_URI/api/v4/projects/$PROJECT_ID/repository/tags?tag_name=v$2&ref=$1" \ 25 |jq -r .message;; 26 * ) echo "id \"$1\" is not in develop branch";; 27esac 28
続いてリリースタグ。(create_release_tag.sh
)
bash
1#!/bin/bash 2 3# ./create_release_tag.sh id version 4# 5# 「master」ブランチの「コミットID(id。短い方)」に 6# 「rerease-+version」の名前でタグを追加する 7 8# 上のスクリプトのコメントと同じなので省略 9MY_URI=http://gitlab.example.com 10PROJECT_ID=user%2Ftest 11MY_TOKEN=this-is-example-token 12 13# masterブランチにあるコミットID一覧を取得して「引数1」があるかどうか調べる 14curl -s --header "PRIVATE-TOKEN: $MY_TOKEN" \ 15 "$MY_URI/api/v4/projects/$PROJECT_ID/repository/commits?ref_name=master" \ 16 |jq -r '.[].short_id' \ 17 |grep $1 18 19# grepに引っかかった(masterの)時のみtag名追加の処理。 20# 「tag_name=v$2」というところがタグ名を指定しているところ 21# $1はコミットID 22case $? in 23 0 ) curl -s --request POST --header "PRIVATE-TOKEN: $MY_TOKEN" \ 24 "$MY_URI/api/v4/projects/$PROJECT_ID/repository/tags?tag_name=release-$2&ref=$1" \ 25 |jq -r .message;; 26 * ) echo "id \"$1\" is not in master branch";; 27esac 28
以上のようなスクリプトでしかタグを作らないルールにしておくと,
意図したブランチのコミットIDしかタグ作成が成功しないので,
とりあえずの対策になるかなと思います。
なおこの例でのバージョンタグ,リリースタグはあくまで仮なので,運用形態によって適宜変更して利用ください。
投稿2021/11/27 12:36
総合スコア2152
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。