如何执行 bash 命令作为 Jenkinsfile 中变量替换的一部分

问题描述 投票:0回答:1

我正在 Docker 代理中执行 Jenkins 构建。我需要为 docker run 命令提供额外的参数,其中之一是

--group-add
。我的 Jenkinsfile 的代理部分如下所示:

agent {
    docker {
        image "maven"
        args "-v /var/run/docker.sock:/var/run/docker.sock --group-add 999"
    }
}

问题是组 ID 是硬编码在 Jenkinsfile 中的,我更希望在运行时提取它。即我想做这样的事情:

agent {
    docker {
        image "maven"
        args "-v /var/run/docker.sock:/var/run/docker.sock --group-add $(getent group docker | cut --delimiter ':' --field 3)"
    }
}

但是这个扩展不起作用。我认为设置环境变量没有帮助,因为它发生得太晚了。

我是否坚持对组 id 值进行硬编码?

docker jenkins groovy
1个回答
0
投票

仅供参考,Jenkins 自动将

-u uid:gid
传递给每个容器运行,因此主要组已为您设置。

然后,要设置辅助组,您必须确保它确实存在于容器中。因此,如果您不想在 Jenkinsfiles 中硬编码其值,则必须从容器本身而不是从主机中提取它 - 否则,即使我存在该组,组 ID 也可能不匹配。

回到变量替换——显然,它们在这种情况下不起作用。但是您可以利用 Jenkinsfile 中的不同阶段 - 第一次运行容器,提取组 ID,保存到 s 变量,然后第二次运行:

def groupId

pipeline {
  agent {
    label 'some-label'
  }
  stages {
    stage('Detect the group ID') {
      agent {
        docker {
          image "maven"
          reuseNode true
        }
      }
      steps {
        script {
          groupId = sh script: 'getent group docker | cut --delimiter ':' --field 3)',
            returnStdout: true,
            label: 'Extract the secondary group'
      }
    }
    stage('Run Maven goals') {
      agent {
        docker {
          image "maven"
          args "-v /var/run/docker.sock:/var/run/docker.sock --group-add ${groupId}"
          reuseNode true
        }
      }
      steps {
        sh 'mvn --version'
      }
    }
  }
}

请注意使用

reuseNode true
,它允许您在同一代理上运行各个阶段。我还为其添加了一个明确的标签,因为默认情况下 Jenkins 假设任何代理都能够运行 Docker ,这可能不是真的。

© www.soinside.com 2019 - 2024. All rights reserved.