【问题标题】:How to build docker images using a Declarative Jenkinsfile如何使用声明式 Jenkinsfile 构建 docker 镜像
【发布时间】:2018-04-26 12:15:12
【问题描述】:

我刚开始使用 Jenkins....

我正在尝试使用声明性 Jenkinsfile 自动生成图像(存储在存储库中)。我发现文档令人困惑(充其量)。简单来说,如何转换下面的脚本示例(来自the docs

node {
    checkout scm
    def customImage = docker.build("my-image:${env.BUILD_ID}")
    customImage.push()
}

到一个声明性的 Jenkinsfile....

【问题讨论】:

  • 问题当然是更通用问题的一个具体示例 - 如何从声明性 Jenkinsfile 中使用 Docker Pipeline 功能?

标签: jenkins jenkins-pipeline


【解决方案1】:

您可以use scripted pipeline blocks in a declarative pipeline 作为解决方法

pipeline {
    agent any
    stages {
        stage('Build image') {
            steps {
                echo 'Starting to build docker image'

                script {
                    def customImage = docker.build("my-image:${env.BUILD_ID}")
                    customImage.push()
                }
            }
        }
    }
}

【讨论】:

  • 我到处搜寻我能想到的(包括您引用的链接)。文档状态“对于大多数用例,在声明性管道中脚本步骤应该是不必要的,但它可以提供有用的“逃生舱口”。所以我一直在寻找。至少对我来说,首选方式似乎很奇怪(声明性)省略了这样的功能。
  • 使用这种方法我只会得到“docker: not found”。
  • 你肯定需要安装docker cli
  • 请解释将旧脚本语法包装在新的声明性语法中的好处。
  • 当 OP 询问如何从他的声明性管道中调用 docker 时,他已经有了脚本化的管道示例。
【解决方案2】:

我正在使用以下方法:

steps {
   withDockerRegistry([ credentialsId: "<CREDENTIALS_ID>", url: "<PRIVATE_REGISTRY_URL>" ]) {
      // following commands will be executed within logged docker registry
      sh 'docker push <image>'
   }
}

地点:

  • CREDENTIALS_ID 代表 Jenkins 中的密钥,您可以在该密钥下将凭据存储到 docker 注册表。
  • PRIVATE_REGISTRY_URL 代表您的私有 Docker 注册表的 url。如果您使用的是 docker hub,那么它应该是空的。

【讨论】:

    【解决方案3】:

    我不能推荐用于构建 Docker 映像的声明性语法,因为似乎每个重要步骤都需要回退到旧的脚本语法。但如果您必须这样做,混合方法似乎可行。

    首先是关于 scm 步骤的详细信息:当我定义 Jenkins“来自 SCM 的管道脚本”项目时,该项目使用来自 git 的声明性管道获取我的 Jenkinsfile,Jenkins 将 repo 克隆为管道中的第一步 即使如此我没有定义 scm 步骤

    对于构建和推送步骤,我只能找到在新式声明性语法中混合旧式脚本管道步骤的解决方案。例如,请参阅 gustavoapolinario 在 Medium 上的工作:

    https://medium.com/@gustavo.guss/jenkins-building-docker-image-and-sending-to-registry-64b84ea45ee9

    具有这种混合管道定义:

    pipeline {
      environment {
        registry = "gustavoapolinario/docker-test"
        registryCredential = 'dockerhub'
        dockerImage = ''
      }
      agent any
      stages {
        stage('Cloning Git') {
          steps {
            git 'https://github.com/gustavoapolinario/microservices-node-example-todo-frontend.git'
          }
        }
        stage('Building image') {
          steps{
            script {
              dockerImage = docker.build registry + ":$BUILD_NUMBER"
            }
          }
        }
        stage('Deploy Image') {
          steps{
            script {
              docker.withRegistry( '', registryCredential ) {
                dockerImage.push()
              }
            }
          }
        }
        stage('Remove Unused docker image') {
          steps{
            sh "docker rmi $registry:$BUILD_NUMBER"
          }
        }
      }
    }
    

    因为这里的第一步是克隆,所以我认为他将这个示例构建为 Jenkins 中的一个独立管道项目(不是来自 SCM 项目的管道脚本)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多