注意项:
1. 所有可变字段全部用变量定义,方便同类型项目复用。
2. npm镜像设置,node节点上跑过一次之后,可以注释掉,节约点时间。
3. 普通vue项目也可参考此模式,略作调整即可。

pipeline {
    agent any
    environment {
       def DOCKER_REGISTER = "xxx.com"
       def DOCKER_NAMESPACE = "xxx"
       def DOCKER_IMAGE = "xxx"
       def DOCKER_TAG = "latest"
       def DOCKER_CONTAINER_NAME = "xxx"
    }
    //构建触发器,Jenkins自动构建条件
    triggers{
        //每1分钟判断一次代码是否有变化
        pollSCM('H/1 * * * *')
    }
    stages {
        stage('获取代码') {
            steps {
                checkout scmGit(branches: [[name: '*/master']], extensions: [cleanBeforeCheckout(deleteUntrackedNestedRepositories: true)], userRemoteConfigs: [[credentialsId: 'aliyun_codeup', url: 'https://xxx.git']])
            }
        }
        stage('编译代码') {
            steps {
                nodejs('node14') {
                    sh 'npm config set registry https://registry.npm.taobao.org'
                    //sh 'npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass'
                    //sh 'npm i node-sass@4.14.1 sass-loader@7.3.1 --save -dev'
                    sh 'npm install'
                    sh 'npm run build:h5'
                }
            }
        }
        stage('镜像操作') {
            steps {
                tool name: 'docker', type: 'dockerTool'
                script{
                  def dockerPath = tool 'docker' //全局配置里的docker
                  env.PATH = "${dockerPath}/bin:${env.PATH}" //添加了系统环境变量上
                }
                withCredentials([usernamePassword(credentialsId: 'aliyun_docker', passwordVariable: 'password', usernameVariable: 'username')]) {
                    sh "docker login ${DOCKER_REGISTER} -u ${username} -p ${password}"
                    sh "docker build -t ${DOCKER_REGISTER}/${DOCKER_NAMESPACE}/${DOCKER_IMAGE}:${DOCKER_TAG} -f Dockerfile . "
                    sh "docker push  ${DOCKER_REGISTER}/${DOCKER_NAMESPACE}/${DOCKER_IMAGE}:${DOCKER_TAG}"
                    sh "docker rmi ${DOCKER_REGISTER}/${DOCKER_NAMESPACE}/${DOCKER_IMAGE}:${DOCKER_TAG}"
                }
            }
        }
        stage('更新远程服务'){
            steps {
                script {

                    def remote = [:]
                    remote.name = 'labs'
                    remote.host = '127.0.0.1'
                    remote.allowAnyHosts = true     // 必须要运行所有主机
                    withCredentials([usernamePassword(credentialsId: 'labs-server', passwordVariable: 'password', usernameVariable: 'username')]) {
                        remote.user = username
                        remote.password = password
                    }
                    withCredentials([usernamePassword(credentialsId: 'aliyun_docker', passwordVariable: 'password', usernameVariable: 'username')]) {
                        sshCommand remote: remote, command: """
                                                docker rm -f ${DOCKER_CONTAINER_NAME};
                                                docker rmi ${DOCKER_REGISTER}/${DOCKER_NAMESPACE}/${DOCKER_IMAGE}:${DOCKER_TAG};
                                                docker login ${DOCKER_REGISTER} -u ${username} -p ${password}
                                                docker run -d --name ${DOCKER_CONTAINER_NAME} ${DOCKER_REGISTER}/${DOCKER_NAMESPACE}/${DOCKER_IMAGE}:${DOCKER_TAG}
                                                exit
                                            """
                    }


                }
            }

        }
    }
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐