如何使用声明式 Jenkinsfile 构建 docker 镜像

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

我是使用 Jenkins 的新手......

我正在尝试使用声明性 Jenkinsfile 自动生成图像(将存储在存储库中)。我发现文档很混乱(充其量)。简而言之,如何转换以下脚本示例(来自文档

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

到声明性 Jenkinsfile....

jenkins jenkins-pipeline
4个回答
37
投票

您可以在声明性管道中使用脚本化管道块作为解决方法

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()
                }
            }
        }
    }
}

8
投票

我正在使用以下方法:

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

地点:

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

1
投票

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

首先是有关 scm 步骤的详细信息:当我定义 Jenkins“来自 SCM 的管道脚本”项目时,该项目使用来自 git 的声明性管道获取 Jenkinsfile,Jenkins 将存储库克隆为管道中的第一步 即使我没有定义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 项目的管道脚本)。


0
投票

如果在构建过程中需要在容器内执行一些脚本,可以使用以下方法:

pipeline {
  environment {
    registry = 'fill_me'
    registryCredentials = 'AWS'
    awsRegion = 'us-east-1'
    dockerImage = ''
  }
  options {
    disableConcurrentBuilds()
  }
  agent none
  stages {
    stage('Build, run, push & upload') {
      agent any
      steps {
        script {
          dockerImage = docker.build registry + ":${BUILD_TAG}"
          dockerImage.inside {
            sh """
               echo ${TEST_VAR} >> file.txt
            """
          }
          docker.withRegistry("https://" + registry, "ecr:" + awsRegion + ":" + registryCredentials) {
            dockerImage.push()
          }
        }
      }
    }

需要 Docker 管道插件

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