Jenkins+Docker+Maven+gitlab实现自动构建、远程发布

前言

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

愿景

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第1张图片
我们最后要实现的像图片中这样,可以选择要构建的分支要发布到哪一台服务器以及要更新的服务,之后点击构建,完成指定的服务构建以及发布到指定的服务器上。

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+Docker+Maven+gitlab实现自动构建、远程发布_第2张图片
密码在jenkins启动日志里
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第3张图片

自定义Jenkins

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第4张图片
选择安装推荐的插件
如果遇到安装部分插件失败,可以去找到系统管理——插件管理——已安装,先卸载掉失败的插件,再去可选插件中搜索并下载.
ps:卸载和下载完需要重启才能生效,但是博主经常遇到点重启,它只关闭不重启,可以手动启动。

创建第一个管理员用户

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第5张图片

实例配置

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第6张图片

插件下载

  • 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的账号密码
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第7张图片

系统配置

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

Publish over SSH配置

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第8张图片

SSH Servers新增Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第9张图片

创建任务

创建一个流水线任务

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第10张图片

参数化构建

Git参数

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第11张图片

服务器参数配置

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第12张图片

服务名配置

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第13张图片

流水线配置

代码仓库配置

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第14张图片

关闭轻量级检出

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第15张图片

示例项目内容

项目结构

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第16张图片

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构建、发布远程

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第17张图片

查看发布日志

点击构建历史下的最新一次构建——Console Output
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第18张图片
构建成功~
ps:如果构建失败可以根据错误提示去解决。博主写这篇博客的时候也是构建了10余次才最后构建成功。。
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布_第19张图片

最后

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

你可能感兴趣的:(Docker,Linux,jenkins,docker,maven)