问题
我必须在Jenkins (和DockerHub作为CD目标)的帮助下,为Git存储库的数量配置CI/CD。我在Docker多阶段构建的帮助下做到了这一点(请参阅注意事项)。我不敢误解/使一个简单的想法过于复杂。
Jenkins + Docker多阶段构建=最佳/良好实践吗?我是不是以正确的方式应用了这个想法?
注意事项
从这份报告来看,我认为在Jenkins内部使用Docker是个好主意。在阅读了一篇文章使用多阶段构建简化和标准化构建过程之后,Docker多阶段构建看起来是使用Jenkins + Docker的下一步。
对相似问题的回答还说,码头多阶段是有意义的,但没有提供一个实现的例子。
实现
Jenkins从SCM存储库创建管道。
Git存储库
Dockerfile
Jenkinsfile
project-folder
|-src
|-pom.xml
Dockerfile
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
来获得更多的粒度。
#!/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}"
}
}
}
}
发布于 2021-07-30 07:53:14
在塔莱奥多的回答之后,我建议下一篇文章:
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}"
}
}
}
}
https://stackoverflow.com/questions/68582970
复制相似问题