私は現在、Jenkinsワークフロースクリプトからリポにタグを付けようとしています。 sh
ステップを使用しようとしましたが、資格情報が設定されていないために問題が発生します。
fatal: could not read Username for 'https://<repo>': Device not configured
リポジトリにタグを付ける、または資格情報の問題を回避するために使用できる既存のステップはありますか?
資格情報バインディングプラグインによって提供される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")
}
リモートの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が引数としてヘルパーに渡すコマンドが、パスワードと同じ行にならないようにするためのものです。
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")
}
_
独自の パーソナルAPIトークン ( OAuth )を作成して、通常の資格情報を使用する場合と同じように使用できます(アドレス:/settings/tokens
)。例えば:
git tag -a some_tag -m 'Jenkins'
git Push https://[email protected]/foo/bar
だから私は@ 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")
}