CICD可以理解为管道,一个自动化流程,用于实现应用开发中的高度持续自动化和持续监控
CI指持续集成,它属于开发人员的自动化流程,成功的CI说明新的代码会定期或手动构建、测试并合并到共享存储库中,可以有效解决由于分支过多而导致相互冲突的问题
CD指持续交付、持续部署,持续交付指开发人员将代码变更后会自动进行测试然后上传到共享存储库,然后由运维部署到生产环境中;持续部署指自动将变更的代码从共享存储库发布到生产环境。二者通常交叉使用,也可以单独使用,主要取决于自动化程度
工厂里的生产线以快速、可重复、自动化的方式将原材料生产为消费品,软件交付也是同样的道理,而如何完成这项工作的总体设计就是持续交付(CD),启动生产线的过程就是持续集成(CI),将最终产品提供给客户的过程就是持续部署(CD)
执行安装命令
yum install git -y
验证Git,查看版本
git --version
执行命令java -version
,查看系统是否已安装并配置jdk,若未安装请点击此处查看文章JDK安装步骤
在线安装:通过华为源下载
wget https://repo.huaweicloud.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
离线安装:点击此处进入官方下载页面,或者在国内源下载
将下载包上传到系统中,然后进行配置
解压下载包
tar -zxvf apache-maven-3.6.3-bin.tar.gz
编辑vim /etc/profile
文件,添加Maven环境变量
export MAVEN_HOME=maven路径
export PATH=$MAVEN_HOME/bin:$PATH
重新加载配置,执行命令. /etc/profile
验证Maven配置,执行命令mvn -version
创建一个目录,做为Maven仓库,并修改为华为源
mkdir apache-maven-3.6.3/repository
vim apache-maven-3.6.3/conf/settings.xml
修改以下信息
<!--本地仓库-->
<localRepository>apache-maven-3.6.3/repository</localRepository>
<!--华为源-->
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
在线安装:由于网络限制,建议使用国内镜像站下载
wget https://repo.huaweicloud.com/jenkins/war/版本/jenkins.war
离线安装:点击此处进入官方下载页面,建议下载LTS长期支持版,复制链接地址使用迅雷等工具进行下载
将下载的war包上传到系统中
nohup java -jar jenkins.war --httpPort=8888 > jenkins.log 2>&1 &
使用tail -f jenkins.log
命令查看输出日志,获取Jenkins密码并记录Jenkins密钥
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
d9ad78c6be5345b4837194ea91d934b0
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
开放端口供外网访问,或者直接关闭防火墙
# 开启防火墙8888端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent
# 关闭防火墙并禁止开机自启
systemctl stop firewalld && systemctl disable firewalld
浏览器访问地址http://192.168.107.132:8888/
,耐心等待进入以下页面,然后输入日志中复制的密码
然后点击【保存并完成】→【开始使用Jenkins】,进入Jenkins欢迎页面
由于是国外网址,插件下载太慢,所以先更换一下安装源
依次点击【Maanage Jenkins】→【Manage Plugins】→【Advanced】,划到最下面修改升级站点URL
https://repo.huaweicloud.com/jenkins/updates/update-center.json
修改服务器配置,先找到Jenkins的安装目录,因其是隐藏目录,可以通过查找命令find / -name ".jenkins"
找到安装路径,编辑updates目录下default.json文件
先切换到updates目录下,然后执行修改文件的命令
cd /root/.jenkins/updates/
sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/repo.huaweicloud.com\/jenkins/g' default.json
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
重启Jenkins,直接通过浏览器访问地址重启
http://192.168.107.132:8888/restart
在安装时选择推荐插件,已经把常用的插件安装成功,可以在已安装列表中查看
未安装的插件在【可选插件】中搜索,然后勾选要安装的插件,点击【直接安装】
例如:SonarQube Scanner插件,安装后可以执行 sonar scanner
指令,跑 CI 时检查代码质量
点击【直接安装】后会进入安装页面,在此页面勾选“安装完成后重启Jenkins(空闲时)”,如果页面长时间等待,可能已成功安装,请手动刷新页面
依次点击【Manage Jenkins】→【Global Tool Configuration】,找到JDK,点击【新增JDK】
出现黄色提示说明配置有问题,路径有误,Jenkins未找到
在【Global Tool Configuration】页面找到Git,默认已经填写,可以重命名操作
出现下图提示说明配置有误
在【Global Tool Configuration】页面找到Maven
同样下图提示说明路径有误
最后点击【保存】
依次点击【Manage Jenkins】→【Manage Credentials】,点击【全局】→【添加凭据】,或者进入全局详情页添加凭据
常用凭据类型
Username with password:用户名和密码
SSH Username with private key:使用SSH用户和密钥
下面以使用Git工具到码云拉取项目源码为例,演示Jenkins的如何管理码云的凭证
添加码云Gitee凭据
新建一个码云仓库
此仓库内有两个README文件,复制仓库地址
然后测试凭据是否能正常使用
【新建Item】→【Freestyle project】,输入任务名称,点击【确定】
找到源码管理,点击Git,URL中输入复制的仓库地址,Credentials选择已添加的码云凭据
因为仓库是私有的,所以必须要有凭据,否则无法连接到仓库,就会报错
保存任务,点击【Build Now】,立即构建,查看构建日志
通过日志输出结果可以看出构建成功
查看Jenkins的工作空间目录可以看到已成功将文件拉取下来
至此说明用户名和密码类型的凭证已经生效
由于Jenkins构建消耗内存很大,此处再创建一个虚拟机,有条件可以直接开通阿里云的ECS,就更像公司的部署情况啦!哈哈
应用服务器信息
在Jenkins服务器上生成密钥
ssh-keygen -t rsa
# 然后直接回车三次
执行后会生成.ssh目录,生成两个文件
接下来需要将公钥导入到认证文件中
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
ssh公钥生效需满足至少下面两个条件:
给文件授权
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
将authorized_keys文件拷贝到应用服务器192.168.107.133的.ssh目录下
# 先在应用服务器(192.168.107.133)上创建/.ssh目录
mkdir /root/.ssh
# 在jenkins服务器(192.168.107.132)上将pub公钥文件拷贝到应用服务器的.ssh目录下,并命名为authorized_keys
scp -p /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
然后再给应用服务器192.168.107.133上的.ssh和.ssh/authorized_keys授权
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
在Jenkins服务器192.168.107.132上进行免密连接测试
# 在jenkins服务器的任意目录下创建test文件,并拷贝到应用服务器
touch /root/test
scp -p test [email protected]:/root/test
# 进入到应用服务器(192.168.107.133),检查目录下是否出现test
# 在Jenkins服务器上使用ssh进行免密连接测试,成功连接如下图所示,如果还需要输入密码,说明配置失败,请检查
ssh [email protected]
# 验证后使用exit退出远程连接
exit
至此免密登录和实现免密拷贝成功
先使用脚手架写一个超简单的小项目,或者网上找个项目
先确保本地能够成功访问
创建一个Maven项目,若不存在此选项,请在插件中搜索maven,然后安装Maven
配置Pro Steps,POM默认已存在,无需更改,操作填写clean package -U -Dmaven.test.skip=true
编写Jenkins发布脚本
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/project"
projectName="dyd-jenkins-test"
echo "待部署的应用服务器"
server_ips="192.168.107.133"
for server_ip in ${server_ips[@]}
do
echo "ssh连接并进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <
将脚本代码粘贴到Execute shell框中,然后点击【应用】【保存】
执行构建任务
点击【Build Now】,立即构建,查看控制台输出,首次构建有下载任务,构建时间可能会很长,请耐心等待
通过上面操作可以看到任务构建成功后,每次还需要手动启停,所以需要一些自动启停的shell脚本
编写应用启动脚本
在/project/backup/dyd-jenkins-test目录下创建启动脚本
vim start.sh
将下面的代码粘贴到start.sh文件中
#!/bin/bash
set -e #一旦报错立即停止
set -o pipefail
# 添加JDK路径
JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
APP_ID=dyd-jenkins-test
APP_DIR="/project"
nohup $JAVA_HOME/bin/java -jar ${APP_DIR}/backup/${APP_ID}/${APP_ID}.jar > release_out.log 2>&1 &
start_ok=false
if [[ $? = 0 ]];then
sleep 5
tail -n 100 release_out.log
fi
dyd=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${dyd}" ]];then
echo "应用程序启动成功"
exit 0
else
echo "应用程序启动失败"
exit 1
fi
运行脚本看是否能够成功启动应用
# 切换到项目目录下
cd /project/backup/dyd-jenkins-test
# 执行shell命令
sh start.sh
# 或者执行命令时直接加上路径
sh /project/backup/dyd-jenkins-test/start.sh
# 然后查看日志
tail -f release_out.log
通过浏览器访问成功
编写停止应用脚本
在/project/dyd-jenkins-test目录下创建停止脚本
vim stop.sh
将下面的代码粘贴到stop.sh文件中
#!/bin/bash
APP_ID=dyd-jenkins-test
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
运行脚本看是否能够成功停止应用运行
# 切换到项目目录下
cd /project/backup/dyd-jenkins-test
# 执行shell命令
sh stop.sh
# 或者执行命令时直接加上路径
sh /project/backup/dyd-jenkins-test/stopt.sh
启停脚本验证通过后,将下述启停代码加到上面Jenkins的发布脚本中
sh $DIR/backup/${projectName}/stop.sh
sh $DIR/backup/${projectName}/start.sh