什么是CI/CD
CI全名Continuous Integration,啥意思?就是我们经常听到的持续集成概念。
当开发每天会提交多次代码到主干上,会做一些重复性的动作时,就可以用持续集成环境来操作。
有集成了,就肯定少不了它的好基友,没错就是CD。
CD全名是Continuous Deployment,是持续部署。
CD还有个小号,交持续交付,英文全称是Continuous delivery,缩写也是CD。
CI/CD优点是,重复的工作用自动化来代替、减少时间成本、版本发布时间减短了。
CI/CD流程
- push代码到gitlab触发WebHook
- Jenkins从gitlab拉取代码
- maven构建代码
- build镜像,同时进行代码分析
- push镜像到服务器
- 部署服务
SpringBoot+Git+Jenkins+Docker实现CI/CD
准备工作
本来打算使用我的腾讯云做一个CI/CD服务器,但是无奈发现我那个小破服务器真的运行不起来这么多玩意,于是我就拿我的mac做了CI/CD,然后再部署到腾讯云
接上一篇[闲置Mac搭建CI/CD服务器]
CentOS安装java环境
下载jdk1.8
- 安装wget
- 检查系统中是否已经安装wget,wget -v :如果出现版本号就说明安装
- 若wget未安装则进行安装,安装命令:yum -y install wget
- 安装vim编辑器
- 安装命令:yum install vim -y
- 设置行号:打开 vim ~/.vimrc 在最后添加: set number保存退出
centos安装jdk1.8的三种方法
我们使用wget下载jdk1.8CentOS7.5 通过wget下载文件到指定目录
下载链接去https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 找,现在需要登陆才能下载。
wget java1.8的下载链接 |
下载完以后使用命令
ls -l #查看目录下有什么文件 |
解压并放进指定目录中
利用tar -zxvf 文件名进行解压。
tar -zxvf jdk-8u241-linux-x64.tar.gz?AuthParam=1585675139_19b496fbd51d401a8e7a4e08b1fd1def |
解压完以后就会出现一个jdk1.8.0_241文件夹,在user下创建一个java文件夹
mkdir /usr/java #在user下创建一个java文件夹 |
将文件复制进去user/java中
mv jdk1.8.0_241 /usr/java |
设置环境变量
vim /etc/profile |
将如下配置添加至文件中,然后保存退出。
#java |
重载环境变量
source /etc/profile |
验证
输入java -version如果能出来版本就安装成功了
CentOS安装docker
检查系统版本
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
$ uname -r |
更新yum
使用 root 权限登录 Centos。确保 yum 包更新到最新。
$ sudo yum update |
卸载旧版本(如果安装过旧版本的话)
$ sudo yum remove docker docker-common docker-selinux docker-engine |
安装需要的软件包
yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
设置yum源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
选择版本
可以查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r |
安装
$ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0 |
启动并加入开机启动
$ sudo systemctl start docker |
验证安装是否成功
有client和service两部分表示docker安装启动都成功了
$ docker version |
CentOS安装GitLab
Centos 7搭建Gitlab服务器超详细Centos 7搭建Gitlab服务器超详细(搭建成功)
在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问。
安装Postfix以发送通知邮件
- 安装命令:sudo yum install postfix
- 将postfix服务设置成开机自启动,安装命令:sudo systemctl enable postfix
- 启动postfix,安装命令:sudo systemctl start postfix
安装gitlab
- wget 用于从外网上下载插件
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.2-ce.0.el7.x86_64.rpm # https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/选择版本
- 安装必要依赖 yum -y install policycoreutils-python 如果已经安装请忽略
- 安装gitlab 安装命令:rpm -i gitlab-ce-12.9.2-ce.0.el7.x86_64.rpm
- 出现以下表明安装成功
- wget 用于从外网上下载插件
配置gitlab
- .修改gitlab配置文件指定服务器ip和自定义端口
vim /etc/gitlab/gitlab.rb
# 打开的文件中有这一句,改成自己的ip和端口
external_url 'http://gitlab.example.com' - 重置并启动GitLab
gitlab-ctl reconfigure
gitlab-ctl restart
- .修改gitlab配置文件指定服务器ip和自定义端口
访问 GitLab页面
如果没有域名,直接输入服务器ip和指定端口进行访问
初始账户: root 密码:5iveL!fe成功撒花
配置ssh
- 找到本机底下的ssh文件夹: C:\Users\henshin.ssh
- 打开id_rsa.pub,里面就是公钥复制到gitlab就可以了
gitlab邮箱设置
配置文件位置/etc/gitlab/gitlab.rbgitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "1127913170@qq.com"
gitlab_rails['smtp_password'] = "ulyzqkxztutrichd"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = :login
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '1127913170@qq.com'
#修改gitlab配置的发信人
gitlab_rails['gitlab_email_from'] = "1127913170@qq.com"
user["git_user_email"] = "1127913170@qq.com" # 必须是一个具体的邮箱。不能瞎编当修改完成后, 记得重新加载配置并重启
gitlab-ctl reconfigure
gitlab-ctl restart测试
gitlab-rails console
# 进入以后输入代码进行测试
Notify.test_email('1127913170@qq.com','email title','email content desc').deliver_nowCentOS安装maven
下载maven
wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
利用tar -zxvf 文件名进行解压。
tar -zxvf apache-maven-3.6.3-bin.tar.gz
解压完以后就会出现一个apache-maven-3.6.3文件夹,在user下创建一个maven文件夹
mkdir /usr/maven #在user下创建一个java文件夹
将文件复制进去user/maven中
mv apache-maven-3.6.3 /usr/maven
配置环境变量
vim /etc/profile
在最后添加如下信息
#maven
export MAVEN_HOME=/usr/maven/apache-maven-3.6.3
export PATH=${MAVEN_HOME}/bin:${PATH}重载环境变量
source /etc/profile
修改maven仓库地址
mkdir /usr/maven/repository
vim /usr/maven/conf/settings.xml
#在xml中指定路径
<localRepository>/usr/maven/repository</localRepository>指定Java版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
CentOS安装jenkins
普通安装
添加Jenkins库到yum库,Jenkins将从这里下载安装。
$ wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo |
配置jenkis的端口
vim /etc/sysconfig/jenkins |
找到修改端口号:
JENKINS_PORT=”8080” 此端口不冲突可以不修改
启动jenkins
service jenkins start/stop/restart |
- 如果不幸启动失败这是我的出错原因
service jenkins status #查看原因
没有文件夹[root@192 ~]# service jenkins status
● jenkins.service - LSB: Jenkins Automation Server
Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
Active: failed (Result: exit-code) since 三 2020-04-01 16:40:44 CST; 1min 52s ago
Docs: man:systemd-sysv-generator(8)
Process: 17281 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=1/FAILURE)
4月 01 16:40:44 192.168.1.6 systemd[1]: Starting LSB: Jenkins Automation Server...
4月 01 16:40:44 192.168.1.6 runuser[17286]: pam_unix(runuser:session): session opened for user jenkins by (uid=0)
4月 01 16:40:44 192.168.1.6 jenkins[17281]: Starting Jenkins bash: /usr/bin/java: 没有那个文件或目录
4月 01 16:40:44 192.168.1.6 jenkins[17281]: [失败]
4月 01 16:40:44 192.168.1.6 systemd[1]: jenkins.service: control process exited, code=exited status=1
4月 01 16:40:44 192.168.1.6 systemd[1]: Failed to start LSB: Jenkins Automation Server.
4月 01 16:40:44 192.168.1.6 systemd[1]: Unit jenkins.service entered failed state.
4月 01 16:40:44 192.168.1.6 systemd[1]: jenkins.service failed.
解决方案是:
查看java环境变量复制Java的环境变量地址, 编辑/etc/init.d/jenkins文件, 指定位置添加该地址, 后缀附上/bin/javaecho $JAVA_HOME
浏览器访问即可vim /etc/init.d/jenkins
74 candidates="
75 /etc/alternatives/java
76 /usr/lib/jvm/java-1.8.0/bin/java
77 /usr/lib/jvm/jre-1.8.0/bin/java
78 /usr/lib/jvm/java-1.7.0/bin/java
79 /usr/lib/jvm/jre-1.7.0/bin/java
80 /usr/lib/jvm/java-11.0/bin/java
81 /usr/lib/jvm/jre-11.0/bin/java
82 /usr/lib/jvm/java-11-openjdk-amd64
83 /usr/bin/java ->改为/usr/java/jdk1.8.0_241//bin/java
" - 查看管理员密码
cat /var/lib/jenkins/secrets/initialAdminPassword
docker安装
1、拉取官方镜像 docker pull jenkins:2.60.3
docker hub 上面jinkins版本
2、查看jenkin镜像是否下载成功 docker images |grep jenkins
3、启动容器
mkdir /home/jekins_home |
4、密码获取
进入容器:docker exec -i -t 容器的id或者容器名字 /bin/bash
打印密码:cat /var/jenkins_home/secrets/initialAdminPassword
搭建环境
需要在jenkins安装插件
Git plugin ,Gitlab Authentication plugin Gitlab Hook Plugin Gitlab Plugin,Publish Over SSH,SSH Slaves plugin,Workspace Cleanup Plugin,Timestamper,Pipeline: GitHub Groovy Libraries,Maven Integration plugin,Build Timeout,Build Authorization Token Root Plugin,Ant Plugin
最主要的是maven,gitlab,ssh的插件,安装好以后就可以进行配置了
jenkins配置自定义的jdk和git
jenkins配置gitlab
设置gitlab凭据
配置ssh公钥密钥
使用命令再jenkins生成公钥和私钥
ssh-keygen -t rsa #创密钥 |
在gitlab上我们注册公钥,这样是为了能让gitlab连接到jenkins
首先我们创建一个凭证
在这里输入jenkins服务器的密钥
这样jinkins就可以从gitlab服务器找到下载代码然后运行工程了。
jenkins配置maven
maven安装好以后,需要配置以下jenkins
配置我们自己的maven
将我们自己的setting替换
maven构建失败
-
[参考](https://www.cnblogs.com/vipsoft/p/11605077.html)
由于 自定义 maven 仓库没权限导致
[root@localhost Service]# cat /etc/group|grep jenkins
jenkins:x:984:
[root@localhost Service]# cat /etc/passwd|grep jenkins
jenkins:x:989:984:Jenkins Automation Server:/var/lib/jenkins:/bin/false
[root@localhost Service]# groups jenkins
jenkins : jenkins
[root@localhost Service]# chown -R jenkins:jenkins /home/repository
[root@localhost Service]# chmod -R 755 /home/repository/
[root@localhost Service]# - 这是因为配置了MAVEN_OPTS 变量,一旦配置这个,jenkins的maven不生效
到现在我们可以push代码以后,在jenkins中进行编译,然后编译好以后存放到jenkins服务器
下面我们需要jenkins自己编译好以后把编译完成的代码打包到指定服务器
jenkins打包项目服务器
Publish Over SSH 用于连接远程服务器Publish over SSH
安装Publish Over SSH插件进行配置,安装好插件以后打开jenkins -> Manage Jenkins -> Configure System
拉到最底下有个Publish over SSH在这里我们进行配置
參数说明:
- Passphrase:SSH的password: 使用username/password登录时为username的password。使用私钥登录时为私钥的password。
- Path to key:SSH私钥的文件路径: 私钥文件的路径,能够是绝对路径。也能够是相对$JENKINS_HOME的相对路径
- Key:私钥,私钥导出后的文本内容,假设“Key”和“Path to key”都设置,则“Key”的优先级较高,私钥的password是“Passphrase”中设置的内容。
- Disable exec:禁止在目标机上运行命令,勾选后将会忽略在Job配置中“Exec command”选项中设置的命令。Jenkins的说明文档中的“The Disable exec in the advanced settings for individual configurations will be ignored.”没有全然理解。从实际效果来看,仅仅要“Disable exec”被勾选后,无论SSH Server中是否勾选“Disable exec”。Job中设置的命令都将补忽略。
SSH Server 配置 在Jenkins中配置Job 在Job设置中“添加构建步骤”里选择“Send files or execute commands over SSH”,即能够Job中使用Publish over SSH插件.
參数说明:
- Name:“系统管理>系统设置”设置的SSH Sverver的名字列表。
- Source files:拷贝到运程机上的文件。相对workspace的路径,也支持表达式,如上图中的“*/.jar”。
- Remove prefix:文件复制时要过滤的文件夹,如上图中的target文件夹。
- Remote directory: 文件得到远程机上的文件夹,此文件夹是相对于“SSH Server”中的“Remote directory”的。假设不存在将会自己主动创建。
- Exec command: 在目标服务器运行的shell脚本,这里脚本是用来运行jar,springboot项目的。linux(centos7)下springboot项目jar包使用sh脚本运行,Jenkins部署SpringBoot应用到远程服务器(含脚本)这个脚本放在服务器上,然后在jenkins执行
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/usr/java/jdk1.8.0_241
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
project=demo-0.0.1-SNAPSHOT.jar #这里需要替换成你jar包的名字
echo "切换路径"
cd /usr/code
cp /dev/null nohup.out #清空nohup.out
pid=`ps -ef | grep -w "$project" | grep "java" | awk '{print $2}'` #杀掉原有项目进程
echo "#### $project process pid is:$pid"
if [ -n "$pid" ]
then
kill -9 $pid
echo "杀死存在进程"
fi
echo "执行"
BUILD_ID=dontKillMe
nohup java -jar "$project" & #启动进程
sleep 1
echo "启动成功!"这端代码的意思就是将原有的进程杀死然后重新后台起一个。这里要注意的是运行命令的时候不能读取到java命令需要export以下。cd /usr/code #存放路径
sh test.sh
这样就可实现编译完以后自动打包了
jenkins选择分支打包
jenkins选择分支构建
在管理中选插件,输入Git Parameter,点击安装
在项目中点击配置->General->This project is parameterized->Git Parameter
然后来到git配置
然后回到构建页面就可以进行选择了
gitlab push自动打包jenkins
下载并安装gitlab plugin配置Gitlab Push自动触发jenkins构建
在gitlab上面获取用户的token;setting->access Tokens那着这个token以后在jenkins生成一个凭证
在jenkins中选择系统设置点击gitlab进行设置
配置任务
回到gitlab创建webhooks
进入项目,然后点击settings -> webhooks这样我们push代码的时候就可以自动触发jebkins任务去构建,而jenkins又可以自动部署到服务器上面
所以到目前为止我们实现了,我们本地编写完代码以后,直接push就可以实现自动部署到服务器,不需要关注其他的东西。
jenkins整合sonarqube
想要在构建的时候进行扫描需要在jenkins服务器上部署一下SonarQube Scanner
部署Sonarqube Scanner
下载SonarScanner:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
选择好对应自己Sonarqube版本
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip |
安装好以后需要在进入配置文件进行一些配置
cd /usr/sonarscanner/sonar-scanner-cli-3.2.0.1227-linux/conf |
这样就算告一段落了
jekins配置Sonarqube Scanner
下载插件:SonarQube Scanner for Jenkins
配置Sonar Scanner
项目配置Sonar Scannor
配置如下
来到项目的配置找到Post Steps选择Excute SanorQube Sconner,进行如下配置这样我们在构建的时候就可以进行代码分析了。test =
test =
1.0 =
java =
UTF-8 =
$WORKSPACE =
$WORKSPACE =
admin =
admin #我直接需要使用密码不然出现认证错误。。没有i找到原因为啥,明明已经再配置文件中写了。 =