使用场景: 公司目前的服务都是采用SpringBoot Jar包的形式进行发布的,每次都要本地打包然后推送到服务器上进行发布,步骤繁琐且每次都是重复工作,利用Jenkins搭建一个点击一下就能发布的自动化系统。
  1. 这里我们选择使用docker版本的Jenkins进行构建,原因是因为安装简单,并且不干扰宿主机环境
1. linux上安装docker		
		1.1. lsb_release -a    # 先确定是Ubuntu 还是 CentO S
		1.2. Ubuntu安装Docker方式如下
				安装命令如下:
					curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
				也可以使用国内 daocloud 一键安装命令:
					curl -sSL https://get.daocloud.io/docker | sh
		1.3. CentOS安装Docker方式如下
				yum install -y docker
	2. 安装一波Maven,因为Jar使用Maven构建,如果是其它工具,请自备
		2.1. mkdir -p /home/jenkins_docker_data  # 创建这个目录,用于宿主机和docker镜像内部共享文件
		2.2. cd /home/jenkins_docker_data  
		2.3. wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
		2.4. unzip apache-maven-3.6.3-bin.zip # 这时候maven下载下来并解压后,可以去进行设置自己的仓库jar包地址和仓库代理等等
	3. 下载docker版Jenkins
		3.1. docker pull jenkinsci/blueocean # 下载jenkins镜像
		3.2. docker run -u root --restart=always --name=jenkins -d -p 8091:8080 -p 50000:50000 -v /home/jenkins_home:/var/jenkins_home -v /home/jenkins_docker_data:/home/jenkins_docker_data   -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean #  启动容器,并映射出端口和挂在目录
		3.3. docker logs -f jenkins容器id ,这时候日志里会有一串uuid就是等下需要访问的初始密码
		3.4. 使用浏览器访问http://ip:8091, 等待输入初始密码界面,把刚刚的密码输入进去,一直下一步直到完成,到了安装插件那一步记得选择啥都不安装,因为我们暂时用不到,安装会浪费时间。
  1. 以上咱们把环境装好了,接下来我们开始编写自己项目中的Jenkinsfile,供Jenkins构建时使用
pipeline {
    agent any

	// 构建前出现的提示,name代表后面要用到的变量
    parameters {
        choice(
            description: '是否需要重新编译 ?',
            name: 'confirm',
            choices: ['是', '否']
        )
        choice(
            description: 'Choose a jar',
            name: 'version',
			// 定义需要发布的jar列表
            choices: ['activity.jar','admin.jar','gate-gateway.jar','auth-server.jar']
        )
    }

	// 这里的定义就相当于把我们人工的打包编译、传包、杀进程、重新发布,写成一个固定脚本让程序跑了
    stages {
        stage('Test') {
            steps {
                  script {
					// 是否需要mvn编译一波
                    if(confirm.equals('是')) {
					    // 这里用到的就是我们之前在宿主机上下载的maven,如果选择了需要编译就进行这一步操作
						// 至于为什么会有否?因为例如我们要发布1、2、3、4,四个服务,打包的时候肯定只需要 1 编译一次,就把所有的项目目录都编译了,所以后面的发布选择否就行了
                        sh '/home/jenkins_docker_data/apache-maven-3.6.3/bin/mvn clean package -Dmaven.test.skip=true'
                    }
                    if(version.equals('auth-server.jar')) {
						// 某个特殊的服务所在jar目录不同
                        sh "scp auth/${version.replace('.jar','')}/target/${version} root@服务器地址:/home/project/path"
                    } else if(version.equals('gate-gateway.jar')) {
                        // 某个特殊的服务所在jar目录不同
						sh "scp gate/${version.replace('.jar','')}/target/${version} root@服务器地址:/home/project/path"
                    } else {
						// 其他的都到modules里寻找
                        sh "scp modules/${version.replace('.jar','')}/target/${version} root@服务器地址:/home/project/path"
                    }
					// 找到本次要发布的服务名在之前运行时的pid,并进行杀死操作
                    def pid = sh returnStdout: true ,script: "ssh root@服务器地址 ps -ef | grep \"${version}\" | grep -v \"grep\" | awk '{print \$2}'"
                    if(pid) {
                        def killPid = ''
                        def pidArray = pid.split("\n")
                        for(def temp : pidArray) {
                            killPid += 'kill -9 ' + temp + ';'
                        }
                        sh "ssh root@服务器地址 '${killPid}'"
						// kill之后,休眠5秒,给进程关闭时间
                        sleep 5
                    }
					// 进行重新发布操作
                    sh "ssh root@服务器地址 '(cd /home/project/path ; chmod 777 ./${version} ; nohup java -Dfile.encoding=UTF-8 -XX:MetaspaceSize=64m -Xms512m -Xmx512m -verbose:gc -XX:+PrintGCDetails -Xloggc:/home/project/logs/gc_${version.replace('','').replace('.jar','')}.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/project/logs/outofmemory_${version.replace('','').replace('.jar','')}.hprof -jar /home/project/path/${version} --spring.profiles.active=sit >/dev/null 2>&1 &)'"
                  }
            }
        }
    }
}

docker 搭建jenkins集群 jenkins构建docker傻瓜_Jenkins


Jenkinsfile就放在项目根目录下。

注意 这Jenkinsfile要求Jenkins所在的机器和需要发布的主机有ssh免密登录权限才可以使用,例如脚本里的ssh登录,和scp传输文件,
怎样ssh免密参考我的另一篇博客:

使用前记得 docker exec -it jenkins容器id /bin/bash , 到jenkins所在容器里操作
  1. 到Jenkins中指定代码仓库所在位置,并进行运行自动化构建操作

docker 搭建jenkins集群 jenkins构建docker傻瓜_docker 搭建jenkins集群_02


首先进入Jenkins系统中点击New Item,新建一个任务。

docker 搭建jenkins集群 jenkins构建docker傻瓜_jar_03

输入你定义的名字,可以写成项目名,然后选择多分支流水线,最后点击OK,这时候会出现下一个页面。

docker 搭建jenkins集群 jenkins构建docker傻瓜_jar_04


在这里选择你的代码托管仓库,是git还是其他,再输入你的账号或其他可以访问这个仓库的凭证,这时候点击save保存,回到Jenkins首页,就会出现你刚刚添加的项目。

docker 搭建jenkins集群 jenkins构建docker傻瓜_docker 搭建jenkins集群_05

然后点击项目名字进入到下一个页面,点击 Scan 多分支流水线 Now 右边就会出现你添加了Jenkinsfile的分支。

docker 搭建jenkins集群 jenkins构建docker傻瓜_Jenkins_06

这时候点击右边需要进行构建的分支名称,进入下一个页面。

docker 搭建jenkins集群 jenkins构建docker傻瓜_Jenkins_07

然后点击打开 Blue Ocean,出现下面的页面,点击红框框里的按钮

docker 搭建jenkins集群 jenkins构建docker傻瓜_Jenkins_08

docker 搭建jenkins集群 jenkins构建docker傻瓜_docker_09

这时候就出现了选择jar包,点击run以后,就会按照你之前定义的脚本执行啦!

到此结束 有问题留言,谢谢!