avatar

SpringBoot CI/CD

什么是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
export JAVA_HOME=/usr/java/jdk1.8.0_241
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

重载环境变量

source /etc/profile

验证

输入java -version如果能出来版本就安装成功了

CentOS安装docker

Centos7上安装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 yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce

启动并加入开机启动

$ sudo systemctl start docker
$ sudo systemctl enable 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
    • 出现以下表明安装成功
  • 配置gitlab

    • .修改gitlab配置文件指定服务器ip和自定义端口
      vim  /etc/gitlab/gitlab.rb
      # 打开的文件中有这一句,改成自己的ip和端口
      external_url 'http://gitlab.example.com'
    • 重置并启动GitLab
      gitlab-ctl reconfigure
      gitlab-ctl restart
  • 访问 GitLab页面
    如果没有域名,直接输入服务器ip和指定端口进行访问
    初始账户: root 密码:5iveL!fe

  • 成功撒花

  • 配置ssh

    • 找到本机底下的ssh文件夹: C:\Users\henshin.ssh
    • 打开id_rsa.pub,里面就是公钥复制到gitlab就可以了
  • gitlab邮箱设置
    配置文件位置/etc/gitlab/gitlab.rb

    gitlab_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_now

    CentOS安装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
$ rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
$ yum install -y jenkins

配置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环境变量
    echo $JAVA_HOME
    复制Java的环境变量地址, 编辑/etc/init.d/jenkins文件, 指定位置添加该地址, 后缀附上/bin/java
    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
docker run -d --name myjenkins -p 50000:8080 -v /home/jenkins_home:/home/jenkins_home jenkins

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  #创密钥
cat .ssh/id_rsa.pub #打印公钥
cat cat .ssh/id_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应用到远程服务器(含脚本)
      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 "启动成功!"
      这个脚本放在服务器上,然后在jenkins执行
      cd /usr/code  #存放路径
      sh test.sh
      这端代码的意思就是将原有的进程杀死然后重新后台起一个。这里要注意的是运行命令的时候不能读取到java命令需要export以下。
      这样就可实现编译完以后自动打包了

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

## 创建文件夹
mkdir /usr/sonarscanner
## 下载完成以后进行解压
unzip -o sonar-scanner-cli-3.2.0.1227-linux.zip -d /usr/sonarscanner
没有unzip命令:yum install -y zip unzip 安装一下

安装好以后需要在进入配置文件进行一些配置

cd /usr/sonarscanner/sonar-scanner-cli-3.2.0.1227-linux/conf
vim sonar-scanner.properties
## 进行配置信息
sonar.sourceEncoding=UTF-8
sonar.host.url=http://192.168.1.8:9000 #自己的地址
sonar.jdbc.username=root
sonar.jdbc.password=*****
sonar.jdbc.url=jdbc:mysql://ip:端口号/sonar?useUnicode=true&characterEncoding=utf8
sonar.login=admin
sonar.password=admin

#查看是否配置完成使用命令进行扫描
cd /usr/sonarscanner/sonar-scanner-cli-3.2.0.1227-linux/bin
./sonar-scanner -X 吗,没有报错ok那么成功
也可能会报错,因为我们没有指定扫描内容,可以全部配置完成以后再试试

这样就算告一段落了

jekins配置Sonarqube Scanner

下载插件:SonarQube Scanner for Jenkins

  • 配置Sonar Scanner

  • 项目配置Sonar Scannor
    来到项目的配置找到Post Steps选择Excute SanorQube Sconner,进行如下配置

    配置如下
    sonar.projectKey=test
    sonar.projectName=test
    sonar.projectVersion=1.0

    sonar.language=java
    sonar.sourceEncoding=UTF-8

    sonar.sources=$WORKSPACE
    sonar.java.binaries=$WORKSPACE

    sonar.login=admin
    sonar.password=admin #我直接需要使用密码不然出现认证错误。。没有i找到原因为啥,明明已经再配置文件中写了。
    这样我们在构建的时候就可以进行代码分析了。
文章作者: zenshin
文章链接: https://zlh.giserhub.com/2020/03/28/springboot/cicd/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zenshin's blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论