我尝试了各种方法,但似乎没有任何效果。这是我的詹金文件。
def ZIP_NODE
def CODE_VERSION
pipeline{
/*A declarative pipeline*/
agent {
/*Agent section*/
// where would you like to run the code
label 'ubuntu'
}
options{
timestamps()
}
parameters {
choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')
choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')
string(defaultValue: "", description: '', name: 'APP_VERSION')
}
stages{
/*stages section*/
stage('Initialize the variables') {
// Each stage is made up of steps
steps{
script{
CODE_VERSION='${BUILD_NUMBER}-${ENV}'
ZIP_NODE='abcdefgh-0.0.${CODE_VERSION}.zip'
}
}
}
stage ('code - Checkout') {
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]])
}
}
stage ('code - Build'){
steps{
sh '''
echo ${JOB_NAME}
pwd
echo ${ZIP_NODE}
echo 'remove alraedy existing zip files'
rm -rf *.zip
zip -r ${ZIP_NODE} .
chmod 777 $ZIP_NODE
'''
}
}
stage('Deploy on Beanstalk'){
steps{
build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]
}
}
}
}
阶段脚本的输出(“初始化变量”)没有任何作用,不是设置全局变量ZIP_NODE的值:
[Pipeline] stage
[Pipeline] { (Initialize the variables)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
然后我们进入阶段(代码-生成),我们没有获得ZIP_NODE的值。请参阅22:34:17的echo声明
[Pipeline] stage
[Pipeline] { (code - Build)
[Pipeline] sh
22:34:16 [abcdefgh-ci-dev-pipeline] Running shell script
22:34:17 + echo abcdefgh-ci-dev-pipeline
22:34:17 abcdefgh-ci-dev-pipeline
22:34:17 + pwd
22:34:17 /home/advisor/Jenkins/workspace/abcdefgh-ci-dev-pipeline
22:34:17 + echo
22:34:17
22:34:17 + echo remove alraedy existing zip files
由于@awefsome,我有一些观察,我想补充一下: 当我使用以下代码时,我会得到所需的输出,即ZIP_NODE的正确值:
stage ('code - Build'){
steps{
sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"
}
}
但是当我使用下面的代码时,我没有得到ZIP_NODE的值:
stage ('code - Build'){
steps{
sh '''
echo ${ZIP_NODE}
echo ${JOB_NAME}
pwd
echo ${ZIP_NODE}
echo ${CODE_VERSION}
#rm -rf .ebextensions
echo 'remove alraedy existing zip files'
rm -rf *.zip
zip -r ${ZIP_NODE} .
chmod 777 $ZIP_NODE
'''
}
}
答案 0 :(得分:9)
sh '''
'''
应该是
sh """
"""
用单引号引起来的变量将不被处理。
答案 1 :(得分:5)
尝试以下操作,看看它如何运行:
def ZIP_NODE
def CODE_VERSION
pipeline{
/*A declarative pipeline*/
agent {
/*Agent section*/
// where would you like to run the code
label 'master'
}
options{
timestamps()
}
parameters {
choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')
choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')
string(defaultValue: "", description: '', name: 'APP_VERSION')
}
stages{
/*stages section*/
stage('Initialize the variables') {
// Each stage is made up of steps
steps{
script{
CODE_VERSION="${BUILD_NUMBER}-${ENV}"
ZIP_NODE="abcdefgh-0.0.${CODE_VERSION}.zip"
}
}
}
stage ('code - Checkout') {
steps{
println "checkout skipped"
//checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]])
}
}
stage ('code - Build'){
steps{
sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"
}
}
stage('Deploy on Beanstalk'){
steps{
println "build job skipped"
//build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]
}
}
}
}
我得到以下输出:
Started by user jenkins
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/test
[Pipeline] {
[Pipeline] timestamps
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Initialize the variables)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (code - Checkout)
[Pipeline] echo
21:19:06 checkout skipped
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (code - Build)
[Pipeline] sh
21:19:06 [test] Running shell script
21:19:06 + echo test
21:19:06 test
21:19:06 + pwd
21:19:06 /Users/Shared/Jenkins/Home/workspace/test
21:19:06 + echo abcdefgh-0.0.17-dev.zip
21:19:06 abcdefgh-0.0.17-dev.zip
21:19:06 + echo 'remove alraedy existing zip files'
21:19:06 remove alraedy existing zip files
21:19:06 + rm -rf '*.zip'
21:19:06 + zip -r abcdefgh-0.0.17-dev.zip .
21:19:06
21:19:06 zip error: Nothing to do! (try: zip -r abcdefgh-0.0.17-dev.zip . -i .)
[Pipeline] }
[Pipeline] // stage
答案 2 :(得分:0)
詹金斯上的全局环境应该在管道之外,可以在脚本内部进行初始化/使用,当然,管道内的所有作用域都可以知道:
示例:
def internal_ip
pipeline {
agent { node { label "test" } }
stages {
stage('init') {
steps {
script {
def x
if(env.onHold.toBoolean() == true){
x=1
}else{
x=2
}
internal_ip = sh (
script: "echo 192.168.0.${x}",
returnStdout: true
).trim()
}
}
}
stage('test') {
steps {
script {
echo "my internal ip is: ${internal_ip}"
}
}
}
}
}
}
答案 3 :(得分:0)
我在 groovy shellscript 中使用全局变量的经验是将它们声明为全局变量,然后使用 stage 环境变量。看起来shell脚本只能访问这个私有环境变量而不是全局变量。作为示例:
environment{
COMMIT_ID = "foo"
}
stages{
stage('Build'){
environment {
commitId = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
}
steps {
script {
COMMIT_ID = commitId
}
}
}
stage ('Build-Win-Container'){
environment {
commitId = "${COMMIT_ID}"
}
steps{
sh label: 'build/push container', script: '''
echo "With Windows commitId: ${commitId}"
'''
}
}
}
我也从 stackoverflow 尝试了多种方法,但没有一种方法可以访问 shell 脚本中的变量。我认为这是因为 shell 脚本是一个步骤中的私有实例,并且只能访问此步骤中的变量(我的意见) 所以我设置了一个全局环境变量 用脚本在第 1 步中填写此内容 在下一步中设置一个环境变量并在那里填写。 最后它在 shell 脚本中可用。没有其他方法对我有用。