Ich habe eine Jenkins-Pipeline mit mehreren Stufen, die alle dieselben Umgebungsvariablen erfordern. Ich führe das so aus:
script {
withCredentials([usernamePassword(credentialsId: 'COMPOSER_REPO_MAGENTO', passwordVariable: 'MAGE_REPO_PASS', usernameVariable: 'MAGE_REPO_USER')]) {
def composerAuth = """{
"http-basic": {
"repo.magento.com": {
"username": "${MAGE_REPO_USER}",
"password": "${MAGE_REPO_PASS}"
}
}
}""";
// do some stuff here that uses composerAuth
}
}
Ich möchte nicht jedes Mal composerAuth
erneut deklarieren müssen. Daher möchte ich die Anmeldeinformationen in einer globalen Variablen speichern, sodass ich Folgendes tun kann:
script {
// do some stuff here that uses global set composerAuth
}
Ich habe versucht, es in den Umgebungsabschnitt zu stellen:
environment {
DOCKER_IMAGE_NAME = "magento2_website_sibo"
withCredentials([usernamePassword(credentialsId: 'COMPOSER_REPO_MAGENTO', passwordVariable: 'MAGE_REPO_PASS', usernameVariable: 'MAGE_REPO_USER')]) {
COMPOSER_AUTH = """{
"http-basic": {
"repo.magento.com": {
"username": "${MAGE_REPO_USER}",
"password": "${MAGE_REPO_PASS}"
}
}
}""";
}
}
Aber (grooviger Noob wie ich bin) funktioniert nicht. Was ist also der beste Ansatz, um eine global zugreifbare Variable mit Berechtigungsnachweisen festzulegen, die jedoch nur einmal angegeben werden muss?
Sie können die Hilfsmethode credentials
des Abschnitts environment
verwenden. Für die Berechtigungsnachweise "Username and passwrd" werden zwei zusätzliche Umgebungsvariablen zugewiesen. Beispiel:
environment {
MAGE_REPO_CREDENTIALS = credentials('COMPOSER_REPO_MAGENTO')
COMPOSER_AUTH = """{
"http-basic": {
"repo.magento.com": {
"username": "${env.MAGE_REPO_CREDENTIALS_USR}",
"password": "${env.MAGE_REPO_CREDENTIALS_PSW}"
}
}
}"""
}
So können Sie das erreichen
pipeline {
agent any
stages {
stage('first') {
steps {
script {
withCredentials([usernamePassword(credentialsId: 'COMPOSER_REPO_MAGENTO', passwordVariable: 'MAGE_REPO_PASS', usernameVariable: 'MAGE_REPO_USER')]) {
def user = env.MAGE_REPO_USER
def password = env.MAGE_REPO_PASS
//Initializing a global variable. Notice there is no def here
composerAuth = """{
"http-basic": {
"repo.magento.com": {
"username": "${user}",
"password": "${password}"
}
}
}"""
}
}
}
}
stage('second') {
steps {
script {
println composerAuth
}
}
}
}
}
Nach langem Suchen (und Mühen) habe ich eine einfache Lösung gefunden:
Wie in den jenkins-Dokumenten für mgang mit Anmeldeinformationen erläutert, geben Sie beim Einfügen eines usernamePassword Anmeldeinformationen in eine Umgebungsvariable mit dem Namen VAR_NAME jenkins ein generiert automatisch zwei weitere Variablen, die mit _ USR und _ PSW bzw. für BenutzernameVariable und KennwortVariable enden = Parameter.
Was ich tat, war, meine Variablen mit den Werten von neuen Variablen USR und PSW einzuspritzen.
Bei @Giel Berkers sollte es ungefähr so aussehen:
environment {
DOCKER_IMAGE_NAME = "magento2_website_sibo"
COMPOSER_REPO_MAGENTO_CREDENTIAL = credentials('COMPOSER_REPO_MAGENTO')
COMPOSER_AUTH = """{
"http-basic": {
"repo.magento.com": {
"username": "${COMPOSER_REPO_MAGENTO_CREDENTIAL_USR}",
"password": "${COMPOSER_REPO_MAGENTO_CREDENTIAL_PSW}"
}
}
}""";
}
Ich fand das und es ist hilfreich: Quelle: https://wiki.jenkins.io/display/JENKINS/Credentials+Binding+Plugin
// Basic example
withCredentials([usernamePassword(credentialsId: 'Amazon',
usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
//available as an env variable, but will be masked if you try to print it out any which way
sh 'echo $PASSWORD'
echo "${env.USERNAME}"
}
// You can also request multiple credentials in a single call
withCredentials([usernamePassword(credentialsId: 'Amazon',
usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'),
string(credentialsId: 'slack-url',
variable: 'SLACK_URL'),]) {
sh 'echo $PASSWORD'
echo "${env.SLACK_URL}"
}
// Older code might not use the new syntax (usernamePassword, string, ...) yet, and directly call the class:
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'Amazon',
usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
//available as an env variable, but will be masked if you try to print it out any which way
sh 'echo $PASSWORD'
echo "${env.USERNAME}"
}