【问题标题】:Jenkinsfile agent "dockerfile" parameterized 'dir' argumentJenkinsfile 代理“dockerfile”参数化“dir”参数
【发布时间】:2021-02-23 22:24:50
【问题描述】:

我在 Jenkins 2.280 中使用具有顺序阶段的声明式管道。

dockerfiledir参数应该从${params}获取:

pipeline {
  agent none
  parameters {
    choice(name: PLATFORM, choices: ['dir1', 'dir2', ...], description: '')
    string(name: FOO, defaultValue: 1001, description: 'Interesting number')
  }
  stages {
    stage('Top') {
      agent {
        dockerfile {
          filename 'Dockerfile'
          dir 'platforms/${params.PLATFORM}'   // <-- HERE
          label 'master'
          additionalBuildArgs '--build-arg FOO=${params.FOO}'
          args '--mount type=bind,source=/opt/tools,target=/tools,readonly'
        }
      }  // agent
      stages {
        stage('Checkout') {
          steps { checkout scm }
        }
        stage('Build') {
          sh """
            // call cmake
            // call ninja
          """
        }
        ...
      } // stages
    } // Top
  } // stages
} // pipeline

这似乎总是导致 Java NoSuchFileException:

java.nio.file.NoSuchFileException: /var/jenkins_home/workspace/<ws_name>/platforms/${params.PLATFORM}/Dockerfile
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)

如果我将dir 参数硬编码到一个有效的目录名称,那么我会遇到FOO 的问题:

[Pipeline] withEnv
[Pipeline] {
[Pipeline] isUnix
[Pipeline] readFile
[Pipeline] sh
14:18:02  /var/jenkins_home/workspace/<ws_name>@tmp/durable-5884cc09/script.sh: 1: /var/jenkins_home/workspace/<ws_name>@tmp/durable-5884cc09/script.sh: Bad substitution

这两件事怎么办?

有更好的方法吗?

更新:我的问题是管道项目名称中的“空格”。

【问题讨论】:

    标签: jenkins dockerfile jenkins-pipeline


    【解决方案1】:

    我试图创建一个与您类似的示例。请看一下如何在声明式管道中使用 Docker 文件和 dockerfile 代理

    Dockerfile

    FROM alpine
    ARG PACKAGE
    RUN apk add ${PACKAGE}
    

    Jenkinsfile

    pipeline {
      agent {
         dockerfile {
            filename 'Dockerfile'
            dir "${params.DOCKERFILE_PATH}"
            additionalBuildArgs  "--build-arg PACKAGE=${params.PACKAGE}"
            args '-v /tmp:/tmp'
         }
       }
       parameters {
            string(name: 'DOCKERFILE_PATH', defaultValue: 'src01', description: 'Pick Dockerfile from a folder')
            text(name: 'PACKAGE', defaultValue: 'curl', description: 'Package To Be Installed')
       }
       stages {
         stage('build'){
            steps {
              sh 'git version'
            }
         } 
       }
    }
    
    

    groovy 必须插入你的运行时参数,为此,你必须用"" 包装它。 '' 不起作用

    在你的情况下,它将是

    dockerfile {
        filename 'Dockerfile'
        dir "platforms/${params.PLATFORM}"
        label 'master'
        additionalBuildArgs "--build-arg FOO=${params.FOO}"
        args '--mount type=bind,source=/opt/tools,target=/tools,readonly'
    }
    

    【讨论】:

    • 感谢您的帮助@samit-kumar-patel。我正在找时间回去测试它!
    • 嗨@samit-kumar-patel,在整个替换双引号之后,然后在替换变量的值,删除所有脚本,删除cmets等之后,它被完全剥离了......我仍然打同样的错误。我将项目从“Foo Bar”重命名为“Foo_Bar”,它成功了!您的回答并没有解决我的问题,但我仍然会“接受”,因为您帮助了我!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2018-09-28
    相关资源
    最近更新 更多