jenkins使用docker方式编译项目
来源:原创
时间:2025-05-27
作者:脚本小站
分类:Jenkins
安装docker插件:
宿主机安装docker:
apt install docker.io -y
安装docker插件:
Docker plugin Docker Pipeline Docker API Plugin
pipeline流水线
构建java项目:
pipeline { agent none stages { stage('Build Code') { agent { docker { image 'maven:3.8.4-openjdk-17' args '-v $HOME/.m2:/root/.m2' label 'java' } } steps { sh 'cd mall-admin && mvn clean package' } post { success { stash name: 'mall-admin-target', includes: 'mall-admin/target/*.jar' } } } stage('Build Docker Image') { agent { docker { image 'docker:dind' // 构建镜像阶段使用 Docker 镜像 args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字 label 'java' } } steps { unstash 'target' // 恢复暂存的编译产物 script { env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7) } sh 'ls -al && ls -al target/' sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID} ." sh "docker login --username admin --password Harbor12345 http://harbor.k8s.local" sh "docker images" sh "docker push harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID}" } } } }
方法二介绍:单 Agent 多容器(高效但复杂度高)在全局 Agent 中启动多个容器,通过 docker run 手动控制。
pipeline { agent any stages { stage('Build Code') { steps { docker.image('maven:3.8.6-jdk-11').inside('-v $HOME/.m2:/root/.m2') { sh 'mvn clean package' } } } stage('Build Docker Image') { steps { withDockerRegistry([url: "https://my-registry", credentialsId: "docker-creds"]) { docker.withTool('docker') { // 使用 Jenkins 配置的 Docker 工具 sh ''' docker build -t my-app:${BUILD_ID} . docker push my-app:${BUILD_ID} ''' } } } } } }
构建npm项目:
pipeline { agent none // 全局不指定,各阶段独立定义 stages { stage('Docker Build') { agent { docker { image 'node:18-alpine' // 使用官方Node镜像 args '-v $WORKSPACE:/app -w /app' // 挂载工作目录 label 'java' } } steps { sh 'npm install --registry=https://registry.npmmirror.com' // 安装依赖 sh 'npm run build' // 构建项目 sh 'ls -al' // 查看当前目录 // archiveArtifacts artifacts: 'dist/**' // 打包并上传构建产物 } post { success { stash name: 'dist', includes: 'dist/**' // 打包成功后,将构建产物保存到stash中 } } } stage('Build Docker Image') { agent { docker { image 'docker:dind' // 构建镜像阶段使用 Docker 镜像 args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字 label 'java' } } steps { unstash 'dist' // 从stash中恢复构建产物 script { env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7) } sh 'ls -al' // 查看当前目录 sh 'ls -al dist' sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID} ." sh "docker login --username admin --password Harbor12345 http://harbor.k8s.local" sh "docker images" sh "docker push harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID}" } } } }
Dockerfile:
FROM nginx:stable-alpine # 复制构建产物到 Nginx 目录 COPY dist/ /usr/share/nginx/html # 暴露端口 EXPOSE 80 # 启动 Nginx CMD ["nginx", "-g", "daemon off;"]