前言

一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间,我们可能会因为需求发生变化功能需要改进缺陷需要修复等问题要更新服务。这个过程是重复而且是复杂的,也容易出现部署、更新失误的情况。因此我们有了自动构建的需求,和CI/CD(持续构建/持续发布)差不多类似。

愿景

在这里插入图片描述
我们最后要实现的像图片中这样,可以选择要构建的分支要发布到哪一台服务器以及要更新的服务,之后点击构建,完成指定的服务构建以及发布到指定的服务器上。

Jenkins环境搭建

前提环境

  • Docker环境
  • 可以使用docker-compose,建议版本为:Docker Compose version v2.1.1,不然可能会出现docker-compose: not found的情况
  • 拉取 jenkinsci/blueocean:1.25.7-bcc31d32159f镜像
  • 拉取maven:3-alpine镜像

启动Jenkins

docker run \
  -e TZ=Asia/Shanghai \
  --network host \
  -d \
  -u root \
  --name jenkins \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$HOME":/home \
  -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose \
  jenkinsci/blueocean:1.25.7-bcc31d32159f

-v jenkins-data:/var/jenkins_home: 将jenkins容器里面的/var/jenkins_home(jenkins配置信息)映射到Docker volume,并将其命名成jenkins-data
-v /var/run/docker.sock:/var/run/docker.sock: 允许jenkins使用docker环境
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose: 允许jenkins使用docker-compose

解锁jenkins

第一次访问jenkins地址:http://ip:8080
在这里插入图片描述
密码在jenkins启动日志里
在这里插入图片描述

自定义Jenkins

在这里插入图片描述
选择安装推荐的插件
如果遇到安装部分插件失败,可以去找到系统管理——插件管理——已安装,先卸载掉失败的插件,再去可选插件中搜索并下载.
ps:卸载和下载完需要重启才能生效,但是博主经常遇到点重启,它只关闭不重启,可以手动启动。

创建第一个管理员用户

在这里插入图片描述

实例配置

在这里插入图片描述

插件下载

  • Git Parameter Plug-In,git参数化构建,构建时可以指定构建分支
  • Publish Over SSH插件,远程发布
  • Extended Choice Parameter Plugin,选择参数添加扩展功能
  • Docker,集成docker
  • Docker Pipeline,通过流水线构建和使用Docker容器
  • Docker Compose Buid Step Plugin,集成docker-compose

全局凭据配置

配置gitlab的账号密码
在这里插入图片描述

系统配置

点击系统管理——系统配置

Publish over SSH配置

在这里插入图片描述

SSH Servers新增在这里插入图片描述

创建任务

创建一个流水线任务

在这里插入图片描述

参数化构建

Git参数

在这里插入图片描述

服务器参数配置

在这里插入图片描述

服务名配置

在这里插入图片描述

流水线配置

代码仓库配置

在这里插入图片描述

关闭轻量级检出

在这里插入图片描述

示例项目内容

项目结构

在这里插入图片描述

docker-compose.dev.yml
version: "3.0"
services:
  holiday-management:
    build:
      context: holiday-management
      args:
        APP: target/holiday-management.jar
  plan-scheduler:
    build:
      context: plan-scheduler
      args:
        APP: target/plan-scheduler.jar

docker-compose.yml
version: "3.0"
services:
  holiday-management:
    restart: always
    image: holiday/management:latest
    env_file: ./config/.env
    ports:
      - 10018:10010
  plan-scheduler:
    restart: always
    image: plan/scheduler:latest
    env_file: ./config/.env
    ports:
      - 10028:10020
Jenkinsfile
pipeline {
    agent any
    environment {
        def remoteId = "${PUBLISH_SSH_SERVER}" 
        def service_names = "${SERVICE_NAMES}".replace(",", " ")
        def half_finished_images = "${service_names}".replace("-", "/").replace(" ", ":latest ")
        def images = "${half_finished_images}" + ":latest"
        def deploy = "deploy"
    }
    stages {
        stage('项目构建') {
            agent {
                docker {
                    image 'maven:3-alpine'
                    args '-v /home/.m2:/root/.m2'
                }
            }
            steps {
            	echo "打包项目"
                sh 'mvn clean install -DskipTests=true'
                echo "构建镜像"
                sh "docker-compose -f docker-compose.yml -f docker-compose.dev.yml build ${service_names}"
            }
        }
        
        stage('下载镜像') {
            agent any
            steps {
            	echo "下载镜像"
                sh "docker save ${images} -o images.tar"
            }
        }
        
        stage('发往远程'){
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '',
                        execCommand: """
                            echo '准备解压发布文件并部署'
                            cd /home/deploy/cpmc
                            #解压到当前目录,并去除一级目录
                            docker load < images.tar
                            docker-compose up -d ${service_names}
                            echo '镜像加载成功'
                        """,
                        execTimeout: 120000,
                        flatten: false,
                        makeEmptyDirs: false,
                        noDefaultExcludes: false,
                        patternSeparator: '[, ]+',
                        remoteDirectory: "cpmc",
                        remoteDirectorySDF: false,
                        removePrefix: '',
                        sourceFiles: "images.tar, config/.env, docker-compose.yml")],
                        usePromotionTimestamp: false,
                        useWorkspaceInPromotion: false,
                        verbose: true)])
            }
        }
    }
}

构建发布

在配置好以上的内容之后,在Dashboard-cpmc-Build with Parameters构建、发布远程

在这里插入图片描述

查看发布日志

点击构建历史下的最新一次构建——Console Output
在这里插入图片描述
构建成功~
ps:如果构建失败可以根据错误提示去解决。博主写这篇博客的时候也是构建了10余次才最后构建成功。。
在这里插入图片描述

最后

到这里,整一套自动构建远程发布就实现啦~欢迎留言讨论!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐