web-dev-qa-db-ja.com

Jenkinsワークフロースクリプトからリポジトリにタグを付ける

私は現在、Jenkinsワークフロースクリプトからリポにタグを付けようとしています。 shステップを使用しようとしましたが、資格情報が設定されていないために問題が発生します。

fatal: could not read Username for 'https://<repo>': Device not configured

リポジトリにタグを付ける、または資格情報の問題を回避するために使用できる既存のステップはありますか?

15
user3617723

資格情報バインディングプラグインによって提供されるwithCredentialsステップを使用して、これをうまく機能させることができました。

URLですべてを指定する必要があったため、すばらしいことではありませんが、これらの値はコンソール出力でマスクされます。

withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {

    sh("git tag -a some_tag -m 'Jenkins'")
    sh("git Push https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@<REPO> --tags")
}
18
user3617723

リモートのURLを知る必要がない代替方法を次に示します。

try {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {
    sh("${git} config credential.username ${env.GIT_USERNAME}")
    sh("${git} config credential.helper '!echo password=\$GIT_PASSWORD; echo'")
    sh("GIT_ASKPASS=true ${git} Push Origin --tags")
  }
} finally {
    sh("${git} config --unset credential.username")
    sh("${git} config --unset credential.helper")
}

これはgitに設定からユーザー名を読み取らせ、資格情報ヘルパーにパスワードのみを提供させることで機能します。末尾の追加のechoは、gitが引数としてヘルパーに渡すコマンドが、パスワードと同じ行にならないようにするためのものです。

13
Magnus Reftel

Gitパスワードに「%」、「:」、「@」、「/」などの特殊文字が含まれている場合、_${env.GIT_PASSWORD}_をgit urlの一部として渡すこと、つまり_https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@<REPO>_をエンコードせずに渡すことが考えられます_Invalid username or password_エラーが発生します。

インラインcredential.helperを使用して手間を節約するのがより良い方法ですが、_!echo password=\$GIT_PASSWORD; echo'_の提案は、ビルドログ_warning: invalid credential line: get_に警告を表示します。必要な操作(取得、保存、消去)。この場合、資格情報ヘルパーはget操作を資格情報入力として解釈しようとしています。有効な入力は、プロトコル、ホスト、パス、ユーザー名、パスワード、URLです。 https://git-scm.com/docs/git-credential#IOFMT を参照してください

より良いインラインcredential.helperは!f() { echo password=\$GIT_PASSWORD; }; fです。このように、credential.helper操作getは無視されます。

完全な例:

_try {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {
    sh("${git} config credential.username ${env.GIT_USERNAME}")
    sh("${git} config credential.helper '!f() { echo password=\$GIT_PASSWORD; }; f'")
    sh("GIT_ASKPASS=true ${git} Push Origin --tags")    
  }
} finally {
    sh("${git} config --unset credential.username")
    sh("${git} config --unset credential.helper")
}
_
6
Evan McLean

独自の パーソナルAPIトークンOAuth )を作成して、通常の資格情報を使用する場合と同じように使用できます(アドレス:/settings/tokens)。例えば:

git tag -a some_tag -m 'Jenkins'
git Push https://[email protected]/foo/bar
1
kenorb

だから私は@ user3617723の解決策を試しましたが、何らかの理由で何かが欠けていました。しばらくして、問題が見つかりました。 git repoをプルして、ワークスペースが異なるワークフロースクリプトでパイプラインジョブをトリガーする責任がある上位のジョブがあります。

//use the jenkins global credential id and create the env parametrs of GIT_PASSWORD and GIT_PASSWORD
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cred-github', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {

//change directory to the work dir with the ".git" files and create tags
sh("cd ${MANAGER_WORKSPACE} ; git tag -a v-${props.'VERSION_NUMBER'} -m ${BUILD_URL}")

//get only the url after the https
giturl_Push = GIT_URL.split("//")[1]

// change directory to the work dir with the ".git" files and Push the tags to the repo
sh("cd ${MANAGER_WORKSPACE} ; git Push https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@${giturl_Push} --tags")




}
0
dsaydon