Jenkinsfile
に基づいてパラメーター化されたJenkinsパイプラインがあります。一部のパラメーターには、ジョブのビルドログに表示したくない機密性の高いパスワードが含まれています。
だから私の質問は:どういうわけかJenkinsfile
内に文字列を登録してそれを置き換えることができますか-たとえば**********
-ログ出力に表示されるときはいつでも?
withCredentials
ステップを認識していますが、資格情報がJenkins資格情報ストアに保存されていないため(実行時にパラメーターとして提供されているため)、使用できません。
私はここでこの答えを見つけました https://stackoverflow.com/a/42372859/154995 そしてこのようにそれを試しました:
def secrets = [
[password: firstPassword, var: 'SECRET'],
[password: secondPassword, var: 'SECRET'],
[password: thirdPassword, var: 'SECRET']
]
node() {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: secrets]) {
// my stages containing steps...
}
}
ここで、firstPassword
、secondPassword
、thirdPassword
は、私のパスワードを含む変数です。それでも、ログ出力にfirstPassword
...表示されたプレーンテキストのコンテンツが表示されます。
マスクパスワードプラグイン をバージョン2.12.0のJenkinsにインストールしています。
基本的に私は次のようなものを探しています: https://issues.jenkins-ci.org/browse/JENKINS-27486 -チケットは解決されましたが、最終的な実装のサンプルスニペットは提供されていません。
あなたが探していると思います JENKINS-36007 ?
あなたは見ているかもしれません https://github.com/jenkinsci/log-file-filter-plugin
このプラグインを使用すると、正規表現を使用してJenkinsのコンソール出力をフィルタリングできます。一部のパターンが一致する場合、一致した文字列は、構成内の各パターンに指定できる文字列に置き換えられます。
現在、プラグインはjenkinsfileからのフィルターパターンの追加をサポートしていませんが、Jenkinsグローバル設定からのみサポートしています。
そもそもなぜこれがうまくいかなかったのかはわかりませんが、ここに問題の解決策があります。
次のように、非表示にするシークレットを使用して配列を定義します。
_def splunkPassword = 'verySecretPa55w0rd'
def basicAuthPassword = 'my8asicAuthPa55w0rd'
def getSecrets() {
[
[password: splunkPassword, var: 'SECRET'],
[password: basicAuthPassword, var: 'SECRET']
]
}
_
免責事項:SECRET
値が重要な役割を果たしているかどうかはわかりません。スニペットからコピーして貼り付ければ、期待どおりに機能します:)
その後、次のようにスクリプトパイプラインですべての呼び出しをラップできます。
_node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: getSecrets()]) {
stage 'First Stage' { ... }
stage 'Second Stage' { ... }
}
}
_
getSecrets()
配列で提供されるすべてのパスワードは、ビルド出力で次のようにマスクされます。
_SPLUNK_PASSWORD: ********
BASIC_AUTH_ADMIN_PASSWORD: ********
_
非常に野蛮な回避策。
簡単なスクリプトを作成します。例: bashを実行し、エコーするアプローチに至るまで、パラメーターの資格情報を任意の形式のファイルにエコーします。
例えば。基本的なシェルスクリプト:
$ cat executor/obfuscate.sh
#!/bin/bash
echo "PASSWORD: ${AWX_PW}" > ./executor/credential.yml
次に、パイプラインで:
stages {
stage('Placing') {
steps {
**sh './executor/obfuscate.sh'** }
[...]
< something reading credential.yml>
}
}
結果、コンソールに何も表示されません:
ちょっとしたハックの回避策を発見しましたが、うまく機能しているようです。秘訣はwithCredentials
を使用することですが、変数をパラメーターでオーバーライドします。
environment ディレクティブのcredentials()
ヘルパーメソッドを使用して環境変数を設定し、自動的に定義される(そしてログでマスクされる)2つの追加の環境変数をオーバーライドする例を次に示します。
まず、ダミーのUsername with password
資格情報を作成します。 Username
とPassword
の値は関係ありません。プレースホルダーとして使用するには、資格情報が必要です。 dummy-credentials
などのIDを入力します。
次に、ダミーの資格情報を使用して環境変数を定義し、自動的に定義された変数をパラメーター(この例ではMYUSERNAME
およびMYPASSWORD
)でオーバーライドします。
environment {
MY_CREDS = credentials('dummy-credentials')
MY_CREDS_USR = "${params.MYUSERNAME}"
MY_CREDS_PSW = "${params.MYPASSWORD}"
}
シークレットを参照する必要がある場合は、MY_CREDS_USR
およびMY_CREDS_PSW
環境変数を使用してください。それらの内容は、コンソールログでマスクされます。
sh '''
echo "Username: ${MY_CREDS_USR}"
echo "Password: ${MY_CREDS_PSW}"
'''