Неопределенные переменные среды для агента верхнего уровня - PullRequest
0 голосов
/ 08 мая 2020

По-видимому, переменные среды недоступны агенту верхнего уровня в декларативном конвейере Jenkins.

Например, при использовании следующего Jenkinfile:

#!/usr/bin/env groovy

pipeline {
    environment {
        USER_ID = sh(script: 'id -u jenkins', returnStdout: true).trim()
        GROUP_ID = sh(script: 'id -g maven', returnStdout: true).trim()
    }

    agent any

    stages{
        stage('Maven'){
            agent{
                docker{
                    image 'maven:3-alpine'
                    args('''
                        -v /dati/maven/.m2:/root/.m2:z
                        -v /etc/group:/etc/group:ro
                        -v /etc/passwd:/etc/passwd:ro
                        -v /etc/shadow:/etc/shadow:ro
                        -e MAVEN_OPTS=-Duser.home=/dati/maven
                        -u $USER_ID:$GROUP_ID
                        ''')
                }
            }
            steps{
                sh("echo $USER_ID")
                sh("echo $GROUP_ID")
                sh("id")
            }
        }
    }
}

Как бы то ни было, все работает:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /dati/jenkins/workspace/Common Java
[Pipeline] {
[Pipeline] sh
[Common Java] Running shell script
+ id -u jenkins
[Pipeline] sh
[Common Java] Running shell script
+ id -g maven
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Maven)
[Pipeline] node
Running on Jenkins in /dati/jenkins/workspace/Common Java@2
[Pipeline] {
[Pipeline] sh
[Common Java@2] Running shell script
+ docker inspect -f . maven:3-alpine
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 989:985 -v /dati/maven/.m2:/root/.m2:z -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -e MAVEN_OPTS=-Duser.home=/dati/maven -u $USER_ID:$GROUP_ID -w "/dati/jenkins/workspace/Common Java@2" -v "/dati/jenkins/workspace/Common Java@2:/dati/jenkins/workspace/Common Java@2:rw,z" -v "/dati/jenkins/workspace/Common Java@2@tmp:/dati/jenkins/workspace/Common Java@2@tmp:rw,z" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** maven:3-alpine cat
$ docker top 76bdc59bcb80932c9957f7a743beeea826272c16ccd65ecd17f047c94e6371b5 -eo pid,comm
[Pipeline] {
[Pipeline] sh
[Common Java@2] Running shell script
+ echo 989
989
[Pipeline] sh
[Common Java@2] Running shell script
+ echo 1000
1000
[Pipeline] sh
[Common Java@2] Running shell script
+ id
uid=989(jenkins) gid=1000(maven)
[Pipeline] }
$ docker stop --time=1 76bdc59bcb80932c9957f7a743beeea826272c16ccd65ecd17f047c94e6371b5
$ docker rm -f 76bdc59bcb80932c9957f7a743beeea826272c16ccd65ecd17f047c94e6371b5
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Однако, если я попытаюсь использовать переменные среды в агенте верхнего уровня, он сломается:

#!/usr/bin/env groovy

pipeline {
    environment {
        USER_ID = sh(script: 'id -u jenkins', returnStdout: true).trim()
        GROUP_ID = sh(script: 'id -g maven', returnStdout: true).trim()
    }

    agent{
        docker{
            image 'maven:3-alpine'
            args('''
                -v /dati/maven/.m2:/root/.m2:z
                -v /etc/group:/etc/group:ro
                -v /etc/passwd:/etc/passwd:ro
                -v /etc/shadow:/etc/shadow:ro
                -e MAVEN_OPTS=-Duser.home=/dati/maven
                -u $USER_ID:$GROUP_ID
                ''')
        }
    }

    stages{
        stage('Maven'){
            steps{
                sh("echo $USER_ID")
                sh("echo $GROUP_ID")
                sh("id")
            }
        }
    }
}

, что приведет к следующей ошибке, как если бы переменные среды не были определены или возможно без экранирования:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /dati/jenkins/workspace/Common Java
[Pipeline] {
[Pipeline] sh
[Common Java] Running shell script
+ docker inspect -f . maven:3-alpine
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 989:985 -v /dati/maven/.m2:/root/.m2:z -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -e MAVEN_OPTS=-Duser.home=/dati/maven -u $USER_ID:$GROUP_ID -w "/dati/jenkins/workspace/Common Java" -v "/dati/jenkins/workspace/Common Java:/dati/jenkins/workspace/Common Java:rw,z" -v "/dati/jenkins/workspace/Common Java@tmp:/dati/jenkins/workspace/Common Java@tmp:rw,z" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** maven:3-alpine cat
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: Failed to run image 'maven:3-alpine'. Error: docker: Error response from daemon: linux spec user: unable to find user $USER_ID: no matching entries in passwd file.
    at org.jenkinsci.plugins.docker.workflow.client.DockerClient.run(DockerClient.java:133)
    at org.jenkinsci.plugins.docker.workflow.WithContainerStep$Execution.start(WithContainerStep.java:184)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:229)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:153)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
    at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/dati/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:135)
    at org.jenkinsci.plugins.docker.workflow.Docker.node(jar:file:/dati/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:66)
    at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/dati/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:123)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.DockerPipelineScript.runImage(jar:file:/dati/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/impl/DockerPipelineScript.groovy:57)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.AbstractDockerPipelineScript.configureRegistry(jar:file:/dati/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/impl/AbstractDockerPipelineScript.groovy:74)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.AbstractDockerPipelineScript.run(jar:file:/dati/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/impl/AbstractDockerPipelineScript.groovy:52)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.CheckoutScript.checkoutAndRun(jar:file:/dati/jenkins/plugins/pipeline-model-extensions/WEB-INF/lib/pipeline-model-extensions.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/CheckoutScript.groovy:66)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.CheckoutScript.doCheckout(jar:file:/dati/jenkins/plugins/pipeline-model-extensions/WEB-INF/lib/pipeline-model-extensions.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/CheckoutScript.groovy:42)
    at org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.LabelScript.run(jar:file:/dati/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/agent/impl/LabelScript.groovy:44)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
    at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:46)
    at com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$101(SandboxContinuable.java:34)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.java:59)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:58)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

Могу ли я использовать такие выходные данные команды ID для аргументов агента верхнего уровня, возможно, даже встроенные без определения переменных среды?

Другие неудачные встроенные попытки :

-u ${'id -u jenkins'}:${'id -g maven'}

-u $"{'id -u jenkins'}":$"{'id -g maven'}"

-u "${id -u jenkins}":"${id -g maven}"

-u "${id -u jenkins}:${id -g maven}"

-u ${id -u jenkins}:${id -g maven}

-u ${id -u jenkins}:${id --group maven}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...