質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

バージョン管理

バージョン管理はコンピューター上にファイルとして格納されているドキュメント・プログラム・その他の情報の変更履歴等を管理するものです

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

Gitlab CE

GitLabのオープンソース版で、Community Editionのこと。 deb、rpmパッケージで提供されており、比較的簡単にインストールすることができます。

Gitlab EE

GitLab 6.0からリリースされたGitLabの有償版。商用向けで、大規模に適したバージョンとなっています。 LDAPグループとGitLabグループの同期が可能です。

Q&A

解決済

1回答

1546閲覧

gitlab タグを作成できるブランチを制限したい

mickey10895

総合スコア1

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

バージョン管理

バージョン管理はコンピューター上にファイルとして格納されているドキュメント・プログラム・その他の情報の変更履歴等を管理するものです

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

Gitlab CE

GitLabのオープンソース版で、Community Editionのこと。 deb、rpmパッケージで提供されており、比較的簡単にインストールすることができます。

Gitlab EE

GitLab 6.0からリリースされたGitLabの有償版。商用向けで、大規模に適したバージョンとなっています。 LDAPグループとGitLabグループの同期が可能です。

0グッド

1クリップ

投稿2021/11/18 01:30

gitlabを用いてバージョン管理をしています。

developブランチで開発を行い、コミットにバージョンタグを振ってバージョンを管理しています。

リリースの際はバージョンタグとは別にリリースタグを作成してリリースしています。

間違えてmasterブランチでバージョンタグを作成してしまうことで思わぬデグレが起きぬよう、バージョンタグはdevelopブランチからしか作成できないように制限したいです。

何か解決方法をご存じの方いらっしゃいましたらご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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,コミット時刻,コミット時のメッセージを一覧で表示するという例です。
なお,jqJSON文字列を整形して表示するコマンドのようで,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

ujimushi_sradjp

総合スコア2091

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問