前言
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
在实际使用的过程中我们可以使用Jenkins还实现代码的快速部署,它拥有许多插件便于我们集成各种各样的工具,如代码拉取层,我们可以集成SVN、GitLab。项目构建层可以使用Maven。项目部署可以采用jar包形式或者war包的Apache Tomcat形式也可以推送远程私库,做到远程部署。另外对于时下里流行的微服务Jenkins也可以很好的实现快速构建、部署,极大的提高开发、测试效率。
本文主要将一个Springboot项目通过Git、Maven、Jenkins、Docker等技术,实现项目的自动化提交部署功能。
硬件环境
环境为阿里云的centos7
自制springboot简单项目一份。
软件环境
1)安装JDK
yum search java | grep jdk
会出现所有版本的jdk
yum install 你所需要的jdk版本全名
yum install java-1.8.0-openjdk.i686
接下来查看JDK版本
java -version
[root@iZbp1gaxhmejbai4lzftzdZ ~]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK Server VM (build 25.191-b12, mixed mode)
2) 安装Maven
yum install maven
查看maven版本
mvn -v
[root@iZbp1gaxhmejbai4lzftzdZ /]# mvn -v
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_191, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.6.3.el7.x86_64", arch: "amd64", family: "unix"
3) 安装Git
yum install git
4)安装Docker
yum install -y docker
systemctl start docker
docker version
5) 安装Jenkins
Jenkins download and deployment 到Jenkins的官网自行下载所需的war包
java -jar jenkins.war –-httpPort=8080
或者也可以把war包放在tomcat里,然后访问localhost:8080/jenkins即可
配置环境
1) GitLab配置
1. 注册GitLab
登陆GitLab官网注册账号The DevSecOps Platform | GitLab
2. 下载Git
windows中下载Git Git - Downloading Package
点击安装一路next完成安装
3. 打开GitBash生成SSHkey
命令行运行以下指令:
ssh-keygen -t rsa -C "你的邮箱地址";
先确定文件位置回车
然后输入ssh密码回车
然后确认密码回车
.ssh
4. 配置全局用户名和邮箱
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
5. GibLab载入SSHkey
然后粘贴sshkey到这个地方
6. pom文件配置
7.
Dockerfile文件
在src》main目录下新建docker文件夹,新增Dockerfile文件
#FROM openjdk:8-jdk-alpine
FROM hub.c.163.com/dwyane/openjdk:8
MAINTAINER red-eric 2505068703@qq.com
VOLUME /tmp
ADD oyster-server-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Jenkins配置
1.Jenkins安装
把window下载的Jenkins.war拷贝到阿里云服务器中
打开阿里云控制台
开放Jenkins端口9003
把window下载的Jenkins.war拷贝到阿里云服务器中
打开阿里云控制台
开放Jenkins端口9003
在Jenkins.war所在目录执行
nohup java -jar jenkins.war --httpPort=9003 >/dev/null 2>/dev/null &
还有一种简单的方法就是,下载个tomcat ,然后直接把war包放在tomcat中,然后访问xxx.xx.xx.xx:8080/jenkins就可以了
2. Jenkins初始化
复制此路径
在shell中执行
cat /root/.jenkins/secrets/initialAdminPassword
查看初始密码,然后登陆,选择建议的插件,然后重新设置用户名密码
3. 全局工具配置
之前我们已经在centos中安装了Git、Maven和Docker ,现在就开始在Jenkins中配置他们。
打开Jenkins控制面板中 系统管理》全局工具配置
4. 插件管理
新增Gitlab插件和Maven Integration插件
Gitlab插件:当gitlab有push时触发jenkins拉取代码和将构建状态发送回GitLab
Maven Integration:用来简化建造Maven工程.
安装完插件后可以重启一下,直接在网址后边拼上/restart 可以重启Jenkins
5. 全局变量设置
配置maven 的全局环境变量 系统设置》系统设置
6. GitLab配置
再Gitlab中获得APIToken
点击生成后获得一个APIToken
然后打开Jenkins
添加GitlabToken
然后点击左下角的测试
会出现success的字样。
7. 创建任务
这里可以创建自由风格的任务或者Maven任务都可以
源码管理选择Git
打开Gitlab中的测试springboot项目复制项目地址
添加授权
这里采用用户名+密码验证的方式即可
8. 构建触发器
选择当代码提交时自动构建,点击Generate 生成,获得Jenkins的Token
复制url然后打开Gitlab
复制URL和Token 到这个地方点击Add Webhook
9. 构建任务拉取代码
点击立即构建即可 拉取Gitlab上的代码到本地
前两次失败是由于Git的路径配置错误,于是用
whereis git
重新查询了下路径,重新配置全局工具
然后测试 我的Gitlab提交是否回同步代码到Jenkins
点击Test push
至此,GitLab到Jenkins已经全部打通了,接下来看Jenkins的代码如何部署。
10. Maven构建项目
点击任务详情页面的Configure
在Build中选择调用顶层Maven构建项目
添加Maven打包命令
clean install -Dmaven.test.skip=true
11. Docker脚本部署
然后添加shell脚本
# 先删除之前的容器 echo "remobe old container" cid=$(docker ps -a | grep dockerspringboot | awk '{print $1}'| xargs) if [ $cid ] then echo "aaaaaaaaaaaa" echo "ccccccccc" docker rm -f $cid # 删除之前的镜像 echo "romove old image" docker rmi dockerspringboot else echo "no container now" fi # 构建镜像 mvn docker:build # 打印当前镜像 echo "current docker images" docker images | grep dockerspringboot # 启动容器 echo "start container" docker run -p 8010:8010 -d --name myspringboot dockerspringboot # 打印当前容器 echo "current container" docker ps -a | grep dockerspringboot echo "star service success!"
在GitLab中使用push event,然后在Jenkins中可以看到项目自动进入构建状态
大功告成!
总结
1) GitLab单独Docker化
关于这套部署环境的改良,可以把GitLab安装放在单独的docker容器中,减少主服务器占用资源。
2) 远程推送私库
如果需要做到部署环境与线上环境分离,可以在pom文件中配置docker私库。同时还需要添加两台主机的sshkey。
需要先新增Maven属性
172.0.0.1:50000
然后把${docker.registry}属性作为imageName的前缀
docker.registry/{docker.registry}/{project.groupId}/project.artifactId:{project.artifactId}:{project.version}
最后执行mvn docker:build docker:push
3)Docker-Maven插件详解
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <!--imageName 用于指定Docker镜像的完整名称 groupoId为仓库名 artifactId为镜像名 version为标签名--> <imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName> <!-- 用与指定Dockerfile文件所在的位置,project.build.outputDirectory 为了读取经过Maven资源过滤后的Dockerfile文件--> <dockerDirectory>${project.build.outputDirectory}</dockerDirectory> <resources> <resource> <!--指定需要复制的根目录--> <directory>${project.build.directory}</directory> <!--用于指定需要复制的文件--> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
4) 在Jenkins容器中运行Docker命令
在Jenkins中运行docker命令有4中方式
不使用任何Jenkins镜像,直接在宿主机上安装Jenkins、Docker。本文采用的就是此种方式。
不适用官方提供的Jenkins镜像,自己构造一个带有Docker服务的Jenkins镜像。
使用Docker-in-Docker(DinD)方案在Docker容器中运行其他Docker容器。这两个Docker容器是父子关系。DockerHub中i给你提供了Jenkins的DinD镜像。
使用Docker-outside-of-Docker(DooD)方案,在Docker容器中创建宿主机上的Docker容器,这两个容器是兄弟关系。DockerHub中提过了Jenkins的DooD镜像。