创建视图
建议将一个项目的任务归于一个视图并添加描述。
创建任务-传统方式构建项目Docker镜像
传统Maven风格项目,固定URL及命令。
- 创建任务
- 公用设置
- 源码设置
- 构建
- 打包镜像
添加post-build step:
执行SHELL,生成Dockerfile:
cat > Dockerfile << EOF FROM baseimg-jdk8:c8 COPY target/demo-0.0.1-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["/app/start-jar.sh"] EOF
- 测试执行
Tips:我这里修改、执行了多次。
创建任务-Pipeline构建项目Docker镜像
使用Pipeline,参数化构建Docker镜像:
- 创建流水线任务
- 公共配置
- Pipeline脚本
在pipeline script中填写:
node{ String HarborUrl='nw-harbor.xxx.cc' String HarborUser='admin' String HarborPasswd='Nw-Harbor123' properties([ parameters([ string(name: 'GIT_URL', defaultValue: 'http://git.zongsheng.tech/all/demo.git', description: '填写Gitlab地址', trim: false), string(name: 'GIT_BRANCH', defaultValue: 'master', description: '填写Git分支地址', trim: false), string(name: 'Group', defaultValue: 'zongs-nw', description: '填写项目组名称,推送至此Harbor项目组', trim: false), string(name: 'Project_name', defaultValue: 'demo', description: '填写项目名称', trim: false), string(name: 'Pom_path', defaultValue: 'pom.xml', description: '填写POM文件', trim: false), string(name: 'Target_name', defaultValue: 'target/demo-0.0.1-SNAPSHOT.jar', description: '项目生成的jar包路径名称', trim: false), string(name: 'JVM_XMS', defaultValue: '256m', description: 'JAVA选项Xms', trim: false), string(name: 'JVM_XMX', defaultValue: '512m', description: 'JAVA选项Xmx', trim: false), string(name: 'TIME_ZONE', defaultValue: 'Asia/Shanghai', description: '生成项目Docker镜像的时区', trim: false) ]) ]) if(!Project_name){ error "项目名为空" } dir("${env.WORKSPACE}/${Project_name}"){ stage('Git阶段'){ echo "1. 开始拉取代码" git branch: params.GIT_BRANCH, credentialsId: 'nw-gitlab', url: params.GIT_URL } stage('Maven阶段'){ echo "2. 开始Maven编译" sh "/usr/local/maven-3.6.3/bin/mvn clean install -Dmaven.test.skip=true -f ${Pom_path}" if(!fileExists("${Target_name}")){ error "编译生成的目标文件${Target_name}不存在" } } stage('Docker阶段'){ echo "3. 开始执行Docker编译、推送、删除" echo "--生成 Dockerfile" sh "echo 'FROM ${HarborUrl}/library/baseimg-jdk8:c8' > Dockerfile" sh "echo 'ENV JVM_XMS=${JVM_XMS} JVM_XMX=${JVM_XMX}' >> Dockerfile" sh "echo 'RUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime' >> Dockerfile" sh "echo 'COPY ${Target_name} /app/app.jar' >> Dockerfile" sh "echo 'ENTRYPOINT [\"/app/start-jar.sh\"]' >> Dockerfile" echo "--构建并推送 Docker 镜像" step([$class: 'DockerBuilderPublisher', dockerFileDirectory: "${env.WORKSPACE}/${Project_name}", cloud: 'docker_w1', tagsString: "${HarborUrl}/${Group}/${Project_name}:nw-${env.BUILD_NUMBER}", cleanImages: true, cleanupWithJenkinsJobDelete: false, pushCredentialsId: 'nw-harbor', pushOnSuccess: true]) } } }
Tips:若打包在同机上执行,可将后面改为:
sh "docker build -t ${HarborUrl}/${Group}/${Project_name}:nw-${env.BUILD_NUMBER} ." sh "docker login ${HarborUrl} -u ${HarborUser} -p ${HarborPasswd}" sh "docker push ${HarborUrl}/${Group}/${Project_name}:nw-${env.BUILD_NUMBER}" sh "docker rmi ${HarborUrl}/${Group}/${Project_name}:nw-${env.BUILD_NUMBER}"
Docker插件官方写有,但未用配置:
withDockerServer('tcp://172.16.220.143:2375'){ def customImage = docker.build("${HarborUrl}/${Group}/${Project_name}:nw-${env.BUILD_NUMBER}") docker.withRegistry("${HarborUrl}", 'nw-harbor'){ customImage.push() } customImage.clean() }
Tips: Docker镜像默认为UTC时区。
- 测试执行
带有properties的配置,需要先执行一次,让系统认到,之后执行即有需要提供的变量出来。
结果:
Tips:传统方式也可以使用“构建化参数”来达到同样的效果。
测试生成的项目镜像(可选)
docker pull nw-harbor.xxx.cc/zongs-nw/demo:nw-2 docker run --name=demo -p 8080:8080 -d nw-harbor.xxx.cc/zongs-nw/demo:nw-2 docker ps
docker exec -it demo /bin/bash
关闭运行的Docker容器并清理镜像:
docker container kill demo docker container rm demo docker rmi nw-harbor.xxx.cc/zongs-nw/demo:nw-2 docker images