写在前头,入职公司不久,发现公司都是用的Jenkins来实现自动化项目部署,十分方便,但作为底层开发人员,接触的不是很多,所以特地来详细的学习一下,扩充一下自己的技术栈!
以下内容需要拥有docker的基础知识,大家也可以多看看我之前的博客,都很详细。
我这里采用的是Docker容器化技术来安装的,方便,简单,环境如下:
# 搜索gitlab镜像
[root@pihao /]# docker search gitlab --filter=STARS=500
NAME DESCRIPTION STARS
gitlab/gitlab-ce GitLab Community Edition docker image based … 2935
sameersbn/gitlab Dockerfile to build a GitLab image for the D… 1152
gitlab/gitlab-runner GitLab CI Multi Runner used to fetch and run… 615
# 我这里选择的是 gitlab/gitlab-ce最新版的镜像
[root@pihao /]# docker pull gitlab/gitlab-ce
Using default tag: latest
latest: Pulling from gitlab/gitlab-ce
e92ed755c008: Already exists
713c8b67b945: Pull complete
Digest: sha256:381c96323b10847583133ab6177feb8e6d69fd38a55d9d1c3872fa7b18025c2e
Status: Downloaded newer image for gitlab/gitlab-ce:latest
docker.io/gitlab/gitlab-ce:latest
# 拉取成功
[root@pihao /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce latest 2b9ac1a40dd1 2 days ago 1.81GB
# -p 端口映射(80端口是gitlab内部绑定的端口)
# -v 数据文件挂载 将文件都挂到我本机的/home目录下面
# --name 取别名
[root@pihao home]# docker run -d -p 8443:443 -p 8090:80 -p 222:22 --name gitlab -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
f33cab7b2854e0131c388b6bf8b5bd609da9a4ea166226c9c8301b2c9673a8f5
# 查看容器是否启动成功
[root@pihao home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
f33cab7b2854 gitlab/gitlab-ce "/assets/wrapper" 5 seconds ago Up 4 seconds (health: starting) 22/tcp, 0.0.0.0:8090->80/tcp, 0.0.0.0:8443->443/tcp gitlab
[root@pihao home]# 启动成功
修改gitlab.rb配置文件
[root@pihao /]# vim /home/gitlab/config/gitlab.rb
# 找到 external_url 这个属性配置,把注释去掉并且把它设置为你主机的地址注意,这里主机地址的后面不能加端口(这是一个坑),加了端口之后不能访问gitlab的页面!!! 如: external_url 'http://112.74.167.52'
# 再将配置文件中以下的两个注释打开
[root@pihao /]# gitlab_rails['gitlab_shell_ssh_port'] = 22
[root@pihao /]# gitlab_rails['gitlab_shell_git_timeout'] = 800
修改gitlab.yml文件
[root@pihao /]# vim /home/gitlab/data/gitlab-rails/etc/gitlab.yml
# 这里只需要设置你的主机ip以及端口;这里会显示在github的克隆地址!!!
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 112.74.167.52 # 宿主机的ip地址
port: 8090 #
https: false
OK,配置到这里,Gitlab页面就能正常访问了,http://112.74.167.52:8090,一般来说,第一次访问页面的时候可能会报502错误。莫慌!!!这是因为gitlab刚刚启动,很多功能还没启动起来,稍等一分钟即可正常访问!
访问如下:
使用方才设置的密码,然后使用root账号登入
进入的页面如下:
点击create a project,创建如下工程:
OK,现在我们已经搭建好gitlab服务器,并且创建了一个名叫upload-test-01的工程,那么接下来将往该工程中提交代码
复制工程的URL
复制URL,使用Eclipse或者IDEA将代码推送到仓库
推送成功
Gitlab服务器已经搭建完毕,现在开始搭建Jenkins服务器
写在前头,不要使用jenkins官方最新的那个镜像,那个已经不推荐使用了,很多的插件不支持安装,网上浏览了很多的博客,发现大家用的最多的是这个镜像 jenkins/jenkins:lts,而这些jenkins容器默认都是已经装好了jdk的环境的,由于我们后面需要整合maven对项目进行打包,那么我们还要在这个镜像中搭建好maven的环境。
# 镜像搜索jenkins
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker search jenkins --filter=STARS=500
NAME DESCRIPTION STARS
jenkins Official Jenkins Docker image 4806
jenkins/jenkins The leading open source automation server 2084
jenkinsci/blueocean https://jenkins.io/projects/blueocean 527
# 拉取jenkins/jenkins:lts镜像
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker pull jenkins/jenkins:lts
lts: Pulling from jenkins/jenkins
3192219afd04: Pull complete
Digest: sha256:83df661d1a2ad921323868ca48f432b175b039bb9e16be0209c0253f3186f25e
Status: Downloaded newer image for jenkins/jenkins:lts
docker.io/jenkins/jenkins:lts
# 拉取成功
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins lts 5d1103b93f92 2 weeks ago 656MB
# 查看该镜像的环境变量
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker inspect 5d1103b93f92
发现上述镜像默认安装jdk1.8,并且配置好了PATH,但是没有安装maven,为了方便我们后面,我们在这个镜像中添加maven的环境,那么就需要我们在这个镜像的基础上再去创建一个我们自己的jenkins镜像,而这个镜像是有maven环境的!!!那么如何开始呢??
maven安装包下载地址:http://maven.apache.org/download.cgi
# 我把这个maven的安装包放到了 /home目录下
[root@iZwz9eq1jai7e87n6vw5liZ home]# ls
apache-maven-3.6.3-bin.tar.gz readme.txt #(这个readme.txt只是一个镜像使用的说明文件,随便自己定义内容)
[root@iZwz9eq1jai7e87n6vw5liZ home]#
说明,我们自定义构建镜像就是根据这个Dockerfile文件来进行的!
# 创建Dockerfile文件
[root@iZwz9eq1jai7e87n6vw5liZ home]# vim Dockerfile (注意:官方推荐命名,D是大写的)
# 输入以下内容: (不包括 # 后面的注释的内容)
FROM jenkins/jenkins:lts # 以哪个基础镜像开始构建
MAINTAINER pihao<[email protected]> # 镜像作者的信息
COPY readme.txt /var/jenkins_home/readme.txt # 复制方才的使用说明文件到镜像内部
ADD apache-maven-3.6.3-bin.tar.gz /var/jenkins_home/ # 添加需要的整合的内容,会自动解压
ENV MYPATH /var/jenkins_home/ # 添加环境
WORKDIR $MYPATH # 容器启动后就切换到的目录
ENV MAVEN_HOME /var/jenkins_home/apache-maven-3.6.3 # 添加maven的环境变量,就跟安装jdk差不多
ENV PATH $PATH:$MAVEN_HOME/bin # 将maven的变量加到总的PATH当中
[root@iZwz9eq1jai7e87n6vw5liZ home]# ls
apache-maven-3.6.3-bin.tar.gz Dockerfile jdk-8u251-linux-x64.tar.gz readme.txt
# docker build 命令构建镜像(注意后面的 . 一定要加上,这里会自动寻找到Dockerfile文件,所以不用指定名字)
[root@iZwz9eq1jai7e87n6vw5liZ home]# docker build -t myjenkins .
Sending build context to Docker daemon 204.6MB
Step 1/8 : FROM jenkins/jenkins:lts
---> 5d1103b93f92
Step 2/8 : MAINTAINER pihao<[email protected]>
---> Running in 9edb275b5e76
Removing intermediate container 9edb275b5e76
---> 6e2357116d49
Step 3/8 : COPY readme.txt /var/jenkins_home/readme.txt
---> f76bcbf77b93
Step 4/8 : ADD apache-maven-3.6.3-bin.tar.gz /var/jenkins_home/
---> 44f6f2cf3182
Step 5/8 : ENV MYPATH /var/jenkins_home/
---> Running in 44e048cbe299
Removing intermediate container 44e048cbe299
---> e792ce76fb54
Step 6/8 : WORKDIR $MYPATH
---> Running in 2fa21e5f5860
Removing intermediate container 2fa21e5f5860
---> 4d0194703fca
Step 7/8 : ENV MAVEN_HOME /var/jenkins_home/apache-maven-3.6.3
---> Running in 0f12c7d8844d
Removing intermediate container 0f12c7d8844d
---> c067e3490a5b
Step 8/8 : ENV PATH $PATH:$MAVEN_HOME/bin
---> Running in da8739ed9fd2
Removing intermediate container da8739ed9fd2
---> 02556376487f
Successfully built 02556376487f
Successfully tagged myjenkins:latest # 说明构建成功
# 查看我们自己构建的镜像
[root@iZwz9eq1jai7e87n6vw5liZ home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjenkins latest 02556376487f 2 minutes ago 667MB
jenkins/jenkins lts 5d1103b93f92 2 weeks ago 656MB
[root@iZwz9eq1jai7e87n6vw5liZ home]#
这里我们再增加一步,那就是配置maven 本地仓库以及更换maven里面的镜像,我们更换成阿里云的镜像
# 编辑 maven的settings.xml配置文件
[root@iZwz9eq1jai7e87n6vw5liZ /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@iZwz9eq1jai7e87n6vw5liZ /]# cd var/lib/docker/volumes/myjenkins/_data/
# 创建maven的本地仓库
[root@iZwz9eq1jai7e87n6vw5liZ /]# mkdir maven_repo
[root@iZwz9eq1jai7e87n6vw5liZ /]# cd apache-maven-3.6.3/conf/
[root@iZwz9eq1jai7e87n6vw5liZ conf]# ls
logging settings.xml toolchains.xml
[root@iZwz9eq1jai7e87n6vw5liZ conf]# vim settings.xml
添加阿里的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
OK
好,现在带有maven环境的jenkins镜像已经构建完毕,接下来应该运行这个镜像 run
# 运行容器
[root@iZwz9eq1jai7e87n6vw5liZ myjenkins]# docker run -d -p 8088:8080 -p 50000:50000 -v myjenkins:/var/jenkins_home --name myjenkins myjenkins
591fe973fd4b9095c904b36cc333bf4d385b3e9958e8cfa995d833a18da52e44
# 查看运行的容器
[root@iZwz9eq1jai7e87n6vw5liZ myjenkins]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
591fe973fd4b myjenkins "/sbin/tini -- /usr/…" 34 seconds ago Up 33 seconds 0.0.0.0:50000->50000/tcp, 0.0.0.0:8088->8080/tcp myjenkins
[root@iZwz9eq1jai7e87n6vw5liZ myjenkins]#
容器运行到这里其实已经可以访问jenkins的页面了,但为了确保我们运行的容器环境无误,我们先进入容器内部确认一下 jdk,maven,以及相应的PATH
# 进入容器内容
[root@iZwz9eq1jai7e87n6vw5liZ myjenkins]# docker exec -it myjenkins /bin/bash
# 查看jdk版本
jenkins@591fe973fd4b:~$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
# 查看maven版本
jenkins@591fe973fd4b:~$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /var/jenkins_home/apache-maven-3.6.3
Java version: 1.8.0_242, vendor: Oracle Corporation, runtime: /usr/local/openjdk-8/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1062.18.1.el7.x86_64", arch: "amd64", family: "unix"
# 确认完毕,jenkins的环境无误!!!,如果不能正确显示相应的版本,那就有问题了,赶紧检查一下。
# 接下来我们就能放心访问jenkins的页面了
jenkins默认的登入端口是8080,由于我们用8088做了映射,所以可以访问 http://IP:8088
第一次访问如下图:
稍等几分钟后
进入容器内容,根据页面提示获取到加密串
# 进入容器获取加密串
[root@iZwz9eq1jai7e87n6vw5liZ updates]# docker exec -it myjenkins /bin/bash
# cat
jenkins@591fe973fd4b:~$ cat /var/jenkins_home/secrets/initialAdminPassword
f0da74842a5d4daa8465f14baff3b5f7 # 将这个加密串粘贴到页面上
jenkins@591fe973fd4b:~$
登入后的页面如下:
刚开始我们点击 选择插件来安装
创建第一个管理员账户,完毕之后点击保存然后确认开始jenkins
点击Availavle,等到页面完全加载完毕之后(一点要等到页面全部在加载之后)
然后进入我们的挂载文件目录 /var/lib/docker/volume/myjenkins/_data/updates目录修改default.json文件
执行如下命令:
[root@iZwz9eq1jai7e87n6vw5liZ updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
[root@iZwz9eq1jai7e87n6vw5liZ updates]# 下载地址已经替换完毕,不相信的我们可以来查看一下
[root@iZwz9eq1jai7e87n6vw5liZ updates]# vim default.json
# 我们发现已经换成了 百度的地址了
default.json修改完毕之后我们再回来前端页面上:
将上面Update Site 输入框内容替换成如下:清华大学更新地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
点击summit,完毕之后重启页面 restart,然后从新输入账号密码完成登入操作!
至此,Jenkins加速的操作配置完成。
加速的配置我们已经完毕,接下来就是安装一些插件。在这里,我们先安装几个必须的插件
完毕后重启界面
汉化后界面
安装完毕之后设置权限策略:
安装后效果:
好,现在必要的插件也都安装完毕,接下来我们从Gitlab拉取代码到Jenkins,那这里就要介绍一下凭据的用处了!
之前我们已经上传过一个最基本的Springboot项目到Gitlab,现在我们把它拉取到 Jenkins
先添加一个凭据用于等下拉取代码
构建一个自由风格的项目
查看构建信息
至此,项目已经构建完毕,也就是说已经从Gitlab获取到了源码!!!
接下来我们再来看另一种凭据的使用 SSH,要想使用SSH的方式,那我们需要先 生成公钥和私钥,公钥需要保存到Gitlab上,私钥需要保存到 Jenkins上,很多小伙伴有疑问了,这个密钥到底在哪生成呢?是在宿主机上还是docker的容器内部呢?简单分析一下,jenkins拉取代码肯定是从容器内容用Git拉取的,这里说了说了,之前只说了Jenkins默认安装了jdk的环境,其实,jenkins还默认安装了Git ,所以这个密钥是需要在容器内部生成的。
在容器内部生成公钥和私钥
# 进入jenkins容器
[root@iZwz9eq1jai7e87n6vw5liZ ~]# docker exec -it myjenkins /bin/bash
# ssh-keygen -t rsa
jenkins@591fe973fd4b:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): # 直接回车(存放目录)
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hRu7ogjttrYBVOvI/RgjkGOhtICyAZQtdzkB7+Wc/7M jenkins@591fe973fd4b
The key's randomart image is:
+---[RSA 2048]----+
|*+oo..o |
|B++oo+ . |
|**o.....o . |
|*.+ . + .= |
|.+ = . +S |
| o. = .. |
|. o. .. .. |
| ooo . . .. |
| o=o. Eo |
+----[SHA256]-----+ # 出现这个图像说明密钥已经生成完毕
# 切换到密钥存放目录
jenkins@591fe973fd4b:~$ cd .ssh/
jenkins@591fe973fd4b:~/.ssh$ ls
id_rsa(私钥) id_rsa.pub(公钥)
# 查看公钥内容
jenkins@591fe973fd4b:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt34S7j5/wxW13xfJOqseQSlf3FPPxky0zMfhlefMltJOfD01iBS1dzosZk6fz/y5K4qMS1JSba8prZkzgHnrYpWqQX19+Ybur8cDPWxxqKORBD/LYv6F/FFBU298aKz/GFil19Q4LtD8GwJxfj/jQvPkcUQOafrRQbZXRXsvR9h4sM/f5ZAwR51uKVMs/4gt/HLBNNRMVrenUiR6lmHkR+D4DnygtAgaEFTE6Zahj2S8YupHgrVMMz2dUlePZ4CByeanIFUvSCmZwsubwMwoJm03kZOGM5k09b/96YhJwUtU1BtzjhXL+JODg7Diu3MTrZOPAZYZBvcc9134sp77d jenkins@591fe973fd4b
jenkins@591fe973fd4b:~/.ssh$
由于之前运行Gitlab容器的时候,指定了222端口为容器内22的映射端口,那么这里地方还要在.ssh目录下增加一个config的配置文件!这个很坑啊,很容易忘记,导致后面的ssh拉取代码的时候一直报permission denied的错误!!!,这个坑搞了我两天,上班时的心情都不好了!对了,这里还要给这个 .ssh 的文件777的权限(这里如果22端口没改则跳过这一步)
# 在 .ssh目录下新增 config文件
[root@iZwz9eq1jai7e87n6vw5liZ .ssh]# vim config
# config文件中编辑的内容
Host 112.74.167.52 # gitlab服务器地址
User root # gitlab登入账号
port 222 # ssh的端口,之前做了映射的
IdentityFile /var/jenkins_home/.ssh/id_rsa # 私钥所在目录
将id_rsa.pub(公钥)内容复制到Gitlab的 ssh keys 中
将id_rsa(私钥)内容复制到 Jenkins的ssh凭据里面
使用ssh的方式从Gitlab拉取代码
再创建一个项目test02使用ssh的方式来构建项目
查看构建信息:构建成功!
因为后续需要将拉取的代码进行打包操作,所以这里必须要先配置maven以及JDK的环境
查看Jenkins中现有的环境
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker inspect myjenkins
Jenkins页面添加如下配置
再在系统配置添加如下变量
环境配置完毕!
至此,Gitlab以及Jenkins的搭建都已经说清楚了,还包括 jenkins从gitlab拉取代码的两种方式,那么接下来就再讲讲使用 Jenkins 对拉取的代码进行maven打包的把!这个也很简单
以 test01为例,点击 配置
编写maven打包指令
执行立即构建将项目打包
查看打包结果: 构建成功
那么接下来我们来看一下生成的springboot 的jar包
至此,使用Jenkins 对项目进行maven打包也已经完成!
截图截得我想吐啊,大家给个收藏关注吧!谢谢了。革命尚未成功,我们还需努力
只要前面都是按照我的做的,应该都能安装成功,并且到这一步
# 搜索tomcat镜像
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker search tomcat --filter=STARS=50
NAME DESCRIPTION STARS
tomcat Apache Tomcat is an open source implementati… 2751
tomee Apache TomEE is an all-Apache Java EE certif… 79
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 54
# 这里我们直接pull最新版的tomcat
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker pull tomcat
Using default tag: latest
e9afc4f90ab0: Pull complete
Digest: sha256:81c2a95e5b1b5867229d75255abe54928d505deb81c8ff8949b61fde1a5d30a1
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
# 查看现有镜像
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjenkins latest 02556376487f 4 hours ago 667MB
tomcat latest 2eb5a120304e 3 days ago 647MB
jenkins/jenkins lts 5d1103b93f92 2 weeks ago 656MB
[root@iZwz9eq1jai7e87n6vw5liZ /]# Tomcat镜像已经安装完毕
# 运行tomcat
[root@iZwz9eq1jai7e87n6vw5liZ mytomcat]# docker run -d -p 8080:8080 --name tomcat -v mytomcat:/usr/local/tomcat tomcat
9aa32004d185990213381e6aa1cf03684af32ab9a8ff3f5bd602161bf440e85f
# 查看当前运行的容器
[root@iZwz9eq1jai7e87n6vw5liZ mytomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aa32004d185 tomcat "catalina.sh run" 48 seconds ago Up 47 seconds 0.0.0.0:8080->8080/tcp tomcat
591fe973fd4b myjenkins "/sbin/tini -- /usr/…" 4 hours ago Up 4 hours 0.0.0.0:50000->50000/tcp, 0.0.0.0:8088->8080/tcp myjenkins
[root@iZwz9eq1jai7e87n6vw5liZ mytomcat]# tomcat容器启动成功
接下来就直接访问tomcat的页面吧! http://IP:8080
发现404,这是为什么呢?这是因为docker容器只保留了容器的最小功能,其他的配置能省就省,不信的话,我们可以切换到tomcat的webapps的目录下来一探究竟!!!
那要怎么样才能访问到tomcat的首页呢?其实很简单,我们发现tomcat的目录下面有一个webapps.dist的文件,我们只要把这个文件下的所有内容都复制到webapps的目录下面,即可访问到tomcat的经典首页!
# 复制命令
[root@iZwz9eq1jai7e87n6vw5liZ _data]# cp -r webapps.dist/* webapps/
[root@iZwz9eq1jai7e87n6vw5liZ _data]# cd webapps
[root@iZwz9eq1jai7e87n6vw5liZ webapps]# ls
docs examples host-manager manager ROOT
[root@iZwz9eq1jai7e87n6vw5liZ webapps]#
接下来我们再次访问 http://IP:8080,完美运行
# 我们为tomcat添加一个用户和角色
<tomcat-users>
<role rolename="tomcat" />
<role rolename="role1" />
<role rolename="manager-script" />
<role rolename="manager-gui" />
<role rolename="manager-status" />
<role rolename="admin-gui" />
<role rolename="admin-script" />
<user username="tomcat" password="123456" roles="manager-gui,manager- script,tomcat,admin-gui,admin-script" />
</tomcat-users>
#注释掉如下内容
<value className="org.apache.catalina.values.RemoteAddrValue"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
OK配置完毕,接下来我们再次访问页面,点击 manager webapp 输入刚才设置的登入账号和密码 tomcat/123456登入查看
登入后页面:
至此,Tomcat的服务器也搭建完毕了。更新先停一段落,后续将会继续更新
Jenkins自动化项目部署的操作!!!只需要开发人员提交代码到版本库,那么Jenkins就自动将最新代码打包直接发布到Tomcat服务器,是不是很方便!也希望大家多多支持。头一次写这么详细,希望大家好好练习。
只要学不死,就往死里学!!!