Jenkins が git リポジトリ内で新しく作成されたタグを自動的に検出して構築することは可能ですか?
質問
Github リポジトリでタグが作成されるときに、Jenkins CI サーバーがタグを自動的に検出、デプロイ、構築できると便利です。
これは可能でしょうか?
解決
次の構成を使用すると、ジョブですべてのタグを構築できます。
- ジョブがブランチであるかのようにタグを取得するようにします。リポジトリ URL の下にある [詳細設定] ボタンをクリックし、Refspec を入力します。
+refs/tags/*:refs/remotes/origin/tags/*
- ブランチ指定子を使用してすべてのタグ「ブランチ」を構築します。
*/tags/*
- SCM ポーリングを有効にして、ジョブが新しいタグを検出できるようにします。
このアプローチには 1 つの欠点があります。仕事は構築されます 全て 新しく追加されたタグだけではありません。したがって、ジョブを作成すると、既存のタグごとに 1 回トリガーされます。したがって、最初はジョブに何も実行させず、既存のタグがすべて処理されるまで待機し、その後で新しいタグごとに実行するビルド ステップを構成することをお勧めします。
git ではタグは変更されないため、ジョブは新しいタグごとに 1 回だけトリガーされます。
他のヒント
すべてのタグがビルドされるという@oberliesの答えの欠点を克服するために、代わりに特別なトリガービルドを使用しています。トリガービルドは、メインビルドと同じgitリポジトリとブランチを使用し、次の(ポスト)ビルドステップを使用します。
ビルド - >シェルを実行する:
# Get the most recent release tag.
PATTERN="release-tag-[0-9][0-9]-[0-9][0-9][0-9][0-9]"
TAG=$(git log --tags=$PATTERN --no-walk --pretty="format:%d" | grep -m 1 -o $PATTERN)
# Due to a Jenkins limitation (https://issues.jenkins-ci.org/browse/JENKINS-8952)
# when passing environment variables we have to write the tag to a file and
# inject it later again.
mv release.properties release-old.properties || true
echo "TAG = $TAG" > release.properties
# Fail the build if the most recent release tag did not change.
! diff release.properties release-old.properties
ビルド - > 環境変数を注入します:
Properties File Path: release.properties
ビルド後のアクション - >: 他のプロジェクトにパラメーター化されたトリガーパラメーター化されています
Projects to build: <your main project>
Trigger when build is: Stable
Parameters: TAG=$TAG
最後に、メインビルドでは、次の文字列パラメーターを使用して「このビルドがパラメーター化されています」というチェック
Name: TAG
Default Value: <your release branch>
「ソースコード管理」セクションでは、「ブランチ」に「$タグ」を使用してフィールドを構築します。
レシーブ後のフックをインストールできます。これは、タグがコミットされたかどうかをチェックし、ジェンキンスにビルドを作成します。
フックは次のように見えることができます[*]:
#!/usr/bin/env python
import sys
from subprocess import Popen, PIPE, check_call
def call_git(command, args):
return Popen(['git', command] + args, stdout=PIPE).communicate()[0]
JENKINS = 'http://localhost:8002/jenkins'
TOKEN = 'asdf8saffwedssdf'
jobname = 'project-tag'
def handle_ref(old, new, ref):
print 'handle_ref(%s, %s, %s)' % (old, new, ref)
if not ref.startswith('refs/tags/'):
return
url = '%s/job/%s/buildWithParameters?token=%s&branch=%s' % (
JENKINS, jobname, TOKEN, new)
print "queueing jenkins job " + jobname + " for " + new
check_call(["wget", "-O/dev/null", "--quiet", url])
if __name__ == '__main__':
for line in sys.stdin:
handle_ref(*line.split())
*]注:これは、わずかに異なるスクリプトからの迅速な変換であるため、ここにいくつかの小さなバグがある可能性が非常に高いです。これは主にアイデアを示すためです。
ジェンキンス側では、パラメータ化されたジョブを構成する必要があります。唯一のパラメーターは「ブランチ」です。
- 「このビルドがパラメーター化されている」を確認し、パラメーターを追加します
- 'ソースコード管理 - > branches foring' put '$ branch'
これにより、かなり安全で堅牢な構築方法が得られます。テストするには、Webインターフェイスを介してビルドを実行すると、パラメーターの値を要求します。
モダン(?)マルチブランチパイプラインの世界では、ビルディングタグが次のように機能します。
- 「動作」を追加してタグを発見します。
- プラグインを使用します 基本的なブランチビルド戦略 タグに「ビルド戦略」を追加するには:
ブランチのビルド戦略も追加することを忘れないでください。プラグインはデフォルトを完全に無効にします!
あなたは、 gitプラグイン ビルド/展開が成功した後にタグを作成します。