安装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;"]