发布
社区首页 >问答首页 >詹金斯管道和码头多阶段建设操作

詹金斯管道和码头多阶段建设操作
EN

Stack Overflow用户
提问于 2021-07-29 21:29:00
回答 1查看 3.7K关注 0票数 1

问题

我必须在Jenkins (和DockerHub作为CD目标)的帮助下,为Git存储库的数量配置CI/CD。我在Docker多阶段构建的帮助下做到了这一点(请参阅注意事项)。我不敢误解/使一个简单的想法过于复杂。

Jenkins + Docker多阶段构建=最佳/良好实践吗?我是不是以正确的方式应用了这个想法?

注意事项

这份报告来看,我认为在Jenkins内部使用Docker是个好主意。在阅读了一篇文章使用多阶段构建简化和标准化构建过程之后,Docker多阶段构建看起来是使用Jenkins + Docker的下一步。

相似问题的回答还说,码头多阶段是有意义的,但没有提供一个实现的例子。

实现

Jenkins从SCM存储库创建管道。

Git存储库

代码语言:javascript
代码运行次数:0
复制
Dockerfile
Jenkinsfile
project-folder
  |-src
  |-pom.xml

Dockerfile

代码语言:javascript
代码运行次数:0
复制
FROM alpine as source
RUN apk --update --no-cache add git
COPY project-folder repo

FROM maven:3.6.3-jdk-8 as test
COPY --from=source repo repo
WORKDIR repo
RUN mvn clean test

FROM maven:3.6.3-jdk-8 as build
COPY --from=test repo repo
WORKDIR repo
RUN mvn clean package

FROM openjdk:8 as final
MAINTEINER xxx <xxx@gmail.com>
LABEL owner="xxx"
COPY --from=build repo/target/some-lib-1.8.jar /usr/local/some-lib.jar
ENTRYPOINT ["java", "-jar", "/usr/local/some-lib.jar"]

Jenkinsfile

我在Jenkins上使用docker build --target来获得更多的粒度。

代码语言:javascript
代码运行次数:0
复制
#!/usr/bin/env groovy

def imageId = "use-name/image-name:1.$BUILD_NUMBER"

pipeline {

    agent {
        label 'docker'  # separate agent (launched as JAR on host machine) to avoid running docker inside docker
    }
    stages {
        stage('Test') {
            steps {
                script {
                    sh "docker build --no-cache --target test -t ${imageId} ."
                }
            }
        }
        stage('Build') {
            steps {
                script {
                    sh "docker build --target build -t ${imageId} ."
                }
            }
        }
        stage('Image') {
            steps {
                script {
                    sh "docker build --target final -t ${imageId} ."
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    docker.withRegistry('' , 'dockerhub') {
                        dockerImage = docker.build("${imageId}")
                        dockerImage.push()
                    }
                }
            }
        }
        stage('Clean') {
          steps{
            sh "docker rmi ${imageId}"
          }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-30 07:53:14

在塔莱奥多的回答之后,我建议下一篇文章:

代码语言:javascript
代码运行次数:0
复制
pipeline {
  agent {
    label 'docker'  # separate agent (launched as JAR on host machine) to avoid running docker inside docker
  }
  environment {
    imageId = 'use-name/image-name:1.$BUILD_NUMBER'
    docker_registry = 'your_docker_registry'
    docker_creds = credentials('your_docker_registry_creds')
  }
  stages {
    stage('Docker build') {
      steps {
        sh "docker build --no-cache --force-rm -t ${imageId} ."
      }
    }
    stage('Docker push') {
      steps {
        sh'''
          docker login $docker_registry --username $docker_creds_USR --password $docker_creds_PSW
          docker push $imageId
          docker logout
        '''
      }
    }
    stage('Clean') {
      steps{
        sh "docker rmi ${imageId}"
      }
    }
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68582970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档