web-dev-qa-db-ja.com

BRANCH_NAMEおよびGIT_COMMITにアクセスするJenkinsワークフローチェックアウト

Jenkins Workflow Checkoutステップから$ GIT_COMMITと$ BRANCH_NAMEを抽出できないようです。

この情報をGradleスクリプトに送信して、静的分析などの外部ソースに渡すことができるようにしたいと思います。

現在、私はこれを実行しようとしています:

checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-49842a984201', url: 'ssh://[email protected]:repo.git']]])

そして、私は次のような何かを達成したいと思います:

// Specified variables that can be reused
def branch = ${BRANCH_NAME}
def commit = ${GIT_COMMIT}

または、これもうまくいくかもしれません:

print "BRANCH: ${BRANCH_NAME}, COMMIT: ${GIT_COMMIT}"
// or the following
print "BRANCH: ${env.BRANCH_NAME}, COMMIT: ${env.GIT_COMMIT}"

次の問題は解決されたようですが、バージョン1.15では機能しません。

https://issues.jenkins-ci.org/browse/JENKINS-30252

誰もこれを回避する方法や、私が見つけることができない変数がある場合、何かアイデアを持っていますか?

15
Oldek

まず第一に、

def branch = ${BRANCH_NAME}

有効なGroovyではない、または少なくともあなたが思うことをしていない。もしかして

def branch = "${BRANCH_NAME}"

これはばかげた書き方です

def branch = BRANCH_NAME

とにかく、現在、環境変数はPipelineのGroovy変数として直接アクセスできません(それを許可する提案があります)。 envグローバル変数を使用する必要があります。

def branch = env.BRANCH_NAME

shステップなどの外部プロセス内からは、実際の環境変数なので、

sh 'echo $BRANCH_NAME'

動作します('は、Groovyがnot変数を補間することを意味します。

現在、JENKINS-30252はマルチブランチプロジェクトを指していました。スタンドアロンPipelineジョブを作成した場合、この変数は設定されません。

とにかくあなたの場合、checkoutステップは常にmasterブランチをチェックアウトしています。実際にマルチブランチプロジェクトがある場合は、Jenkinsfileを使用する必要があります

checkout scm

これにより、正しいブランチでコミットがチェックアウトされます(常にJenkinsfile自体のリビジョンに一致します)。

コミットハッシュに関しては、保留中 JENKINS-261 これは自動的には使用できませんが、次のようなものを使用できます

sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()

アクセスします。

31
Jesse Glick

2つのJenkinsインスタンスがあります。

両方のインスタンスで、_GIT_COMMIT_および_BRANCH_NAME_環境変数は定義されていません。

checkout()呼び出しの戻り値からそれらを取得しようとすると、各インスタンスの動作が異なります。

ジェンキンスインスタンス1

Jenkinsバージョン:2.46.1

「パイプライン:SCMステップ」プラグインバージョン:2.5

checkoutdocumentation で説明されているように環境変数にアクセスしようとすると失敗します。

_def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
    49842a984201', url: 'ssh://[email protected]:repo.git']]])
def commitHash = scmVars.GIT_COMMIT
_

scmVarsはNULLを返し、_scmVars.GIT_BRANCH_へのアクセスは例外_Java.lang.NullPointerException: Cannot get property 'GIT_BRANCH' on null object_で失敗します。

そのため、ブランチを取得するために以下を実行する必要がありました。

_sh 'git name-rev --name-only HEAD > GIT_BRANCH'
sh 'cat GIT_BRANCH'
git_branch = readFile('GIT_BRANCH').trim()
env.GIT_BRANCH = git_branch
_

ジェンキンスインスタンス2

Jenkinsバージョン:2.60.2

「パイプライン:SCMステップ」プラグインバージョン:2.6

この場合、次のことを成功させることができます。

_def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
    49842a984201', url: 'ssh://[email protected]:repo.git']]])
env.GIT_COMMIT = scmVars.GIT_COMMIT
env.GIT_BRANCH = scmVars.GIT_BRANCH
_

したがって、Jenkinsインスタンスでどのアプローチが機能するかを確認して使用してください。

10
Antony

Jenkins環境変数からBRANCH_NAMEにシェルスクリプトとしてアクセスする場合は、以下のスニペットを使用します。

sh 'echo Branch Name: $BRANCH_NAME'

応答は次のようになります。

Branch Name: the_checkedout_branch

0