持续集成-禅道
说明
安装持续集成: svn + maven + jenkins + ansible 并结合 禅道 集成功能实现发布。
环境介绍
主机IP | 主机用途 |
---|---|
10.0.30.101 | 禅道 |
10.0.30.102 | jenkins |
10.0.30.103 | svn |
10.0.30.104 | 应用服务器-1 |
10.0.30.105 | 应用服务器-2 |
实现流程图
安装禅道
[root@zentao ~]# wget https://www.zentao.net/dl/zentao/biz4.1.3/ZenTaoPMS.biz4.1.3.zbox_64.tar.gz
[root@zentao ~]# tar xf ZenTaoPMS.biz4.1.3.zbox_64.tar.gz -C /opt/
[root@zentao ~]# /opt/zbox/zbox start
Start Apache success
Start Mysql success
[root@zentao ~]# netstat -ntplu | egrep httpd
tcp6 0 0 :::80 :::* LISTEN 1691/httpd
启动成功,通过浏览器访问。
用户名: admin | 密码:123456 进入后重新设置密码即可,注意密码要求的复杂度,否则不能通过。
禅道安装完毕。
安装 Jenkins
对于很多用户来说,安装 jenkins 是一件让人头痛的事,原因是因为 jenkins 的插件都依赖外网资源,下载速度慢或直接就超时这里就详细介绍下。
配置 jdk
[root@jenkins ~]# wget https://mirrors.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gz
[root@jenkins ~]# tar xf jdk-8u201-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# cat /etc/profile.d/java.sh
#!/bin/bash
# Author:hukey
JAVA_HOME=/usr/local/jdk1.8.0_201
JAVA_BIN=$JAVA_HOME/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
[root@jenkins ~]# source /etc/profile.d/java.sh
[root@jenkins ~]# ln -vs /usr/local/jdk1.8.0_201/bin/java /usr/bin/java
‘/usr/bin/java’ -> ‘/usr/local/jdk1.8.0_201/bin/java’
[root@jenkins ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
安装 jenkins
采用 rpm 包来安装 jenkins
[root@jenkins ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.285-1.1.noarch.rpm
[root@jenkins ~]# yum localinstall jenkins-2.285-1.1.noarch.rpm -y
修改jenkins运行用户:
[root@jenkins ~]# vim /etc/sysconfig/jenkins
...
JENKINS_USER="root"
...
# 启动服务
[root@localhost ~]# systemctl start jenkins
[root@localhost ~]# netstat -ntplu | egrep java
tcp6 0 0 :::8080 :::* LISTEN 1735/java
启动 jenkins 如果有报错,首先查看是否是因为 jenkins 找不到 java 命令所导致。如果是,执行如下命令:
[root@jenkins ~]# ln -vs /usr/local/jdk1.8.0_201/bin/java /usr/bin/java
‘/usr/bin/java’ -> ‘/usr/local/jdk1.8.0_201/bin/java’
通过页面登录
按照提示去对应的目录查看密码复制进来,点击继续。
安装插件会等待一会,如果出现这样的情况当然更好,插件就会自动安装。
如果出现这样的情况,就需要进步一设置
点击跳过插件安装。
点击保存并完成,后续继续保存。
点击 Advanced,拖到最下面,修改 Update Site
将 Update Site 修改为 国内插件下载地址:
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
点击 Submit ,重启jenkins
重启完毕以后,切换到服务器查看 /var/lib/jenkins/
该目录下应该有一个 update
目录,进入该目录:
# cd /var/lib/jenkins/updates/
# ls
default.json hudson.tasks.Maven.MavenInstaller
### 将国外链接替换为国内链接 ###
sed -i 's@https://updates.jenkins.io/download@http://mirrors.tuna.tsinghua.edu.cn/jenkins@g' default.json
sed -i 's@http://www.google.com@https://www.baidu.com@g' default.json
# 修改完成,重启服务
systemctl restart jenkins
安装汉化插件
汉化成功。
这里放出一张 Jenkins 默认安装的插件图,可以选择安装:
界面插件推荐安装:Blue Ocean
安装 ansible
在安装 jenkins 的主机上安装 ansible
[root@jenkins ~]# yum install ansible -y
配置节点主机:
[root@jenkins ~]# vim /etc/ansible/hosts
...
[appNode]
10.0.30.104
10.0.30.105
配置不检查公钥:
[root@jenkins ~]# vim /etc/ansible/ansible.cfg
...
host_key_checking = False
...
配置互信认证:
[root@jenkins ~]# ssh-keygen -t rsa -P '' # 直接回车结束
[root@jenkins ~]# ansible appNode -m authorized_key -a "user=root state=present key={{ lookup('file', '/root/.ssh/id_rsa.pub') }}" -k
SSH password: # 输入登录密码
安装配置SVN
[root@svn ~]# yum install subversion -y
[root@svn ~]# mkdir -p /svn/dev_test
[root@svn ~]# svnadmin create /svn/dev_test/
### passwd 设置用户名密码 ###
[root@svn ~]# vim /svn/dev_test/conf/passwd
...
dev_test = dev_test123
### authz 设置权限 ###
[root@svn ~]# vim /svn/dev_test/conf/authz
...
admin = dev_test
[/]
@admin = rw
### svn 主配置文件修改如下 ###
[root@svn ~]# egrep -v "^$|^#" /svn/dev_test/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
[sasl]
配置完成后,启动 svn
[root@svn ~]# svnserve -d -r /svn/
[root@svn ~]# netstat -ntplu | egrep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 11564/svnserve
启动完成后,进行 svn 测试。
OK, svn 配置完成。
集成组件
【测试源码 及 jar 下载链接】
两台业务服务节点都需配置 jdk 环境,上面有配置流程,这里不再叙述。
第一步,首先用程序包测试启动脚本,操作主机:10.0.30.104 |
[root@node1 ~]# mkdir -p /app
### 上传 test-0.0.1-SNAPSHOT.jar 到该目录 ###
[root@node1 /app]# ls
test-0.0.1-SNAPSHOT.jar
### 编写程序启动脚本 ###
[root@node1 /app]# vim service.sh
#!/bin/bash
# Author:hukey
DIR=/app
DATE1=$(date +%Y%m%d)
PORT=8080
function start(){
cd $DIR
#cp /usr/local/src/ccb/*.jar $DIR
if [ -f *.jar ];then
APP=$(ls *.jar)
else
echo "APP NOT FOUND!"
exit 1
fi
cd $DIR
nohup java -jar $APP --server.port=$PORT &> $DIR/nohup.out &
#nohup java -jar $APP --server.port=$PORT &
sleep 1
echo -e 'starting ............... \033[32m [ ok ] \033[0m'
}
function stop(){
cd $DIR
PID=$(lsof -i :${PORT} | egrep -i listen | awk '{print $2}')
kill -9 $PID
if [ $? == 0 ];then
echo -e "closed $PID ............... \033[32m [ ok ] \033[0m"
fi
if [ -f nohup.out ];then
rm -rf nohup.out
fi
}
function update() {
DATE2=$(date +%Y%m%d-%H:%M)
cd $DIR
mkdir -p backup/$DATE1/app
for app in `ls *.jar`;do
mv $app backup/$DATE1/app/$app-$DATE2
done
}
case $1 in
'start')
start
;;
'stop')
stop
;;
'restart')
stop &> /dev/null
start
;;
'update')
stop
update
;;
*)
echo "用法:$0 [start | stop | restart | update]"
esac
###################################################
[root@node1 /app]# chmod +x service.sh
[root@node1 /app]# yum install lsof -y
### 尝试启动服务 ###
[root@node1 /app]# ./service.sh start
starting ............... [ ok ]
[root@node1 /app]# netstat -ntplu | egrep java
tcp6 0 0 :::8080 :::* LISTEN 11642/java
#### 停止并备份 ###
[root@node1 /app]# ./service.sh update
closed 11642 ............... [ ok ]
[root@node1 /app]# ls backup/20210325/app/test-0.0.1-SNAPSHOT.jar-20210325-18\:09
backup/20210325/app/test-0.0.1-SNAPSHOT.jar-20210325-18:09
程序启动脚本测试成功。
第二步,通过 ansible 推送并发布程序包 |
切换到 jenkins 服务器(10.0.30.102)
首先,编写 playbook
[root@jenkins ~]# mkdir -pv /ansible/playbook
[root@jenkins ~]# cd /ansible/playbook
[root@jenkins /ansible/playbook]# vim deploy.yaml
- hosts: appNode
remote_user: root
tasks:
- name: update app
shell: /app/service.sh update
- name: copy app
copy:
src: /app/test-0.0.1-SNAPSHOT.jar
dest: /app/
- name: start app
shell: /app/service.sh start
### 将打包好的jar放置该目录(测试)###
[root@jenkins /ansible/playbook]# ls /app/
test-0.0.1-SNAPSHOT.jar
### 执行 playbook ###
[root@jenkins /ansible/playbook]# ansible-playbook deploy.yaml
PLAY [appNode] **************************************************************
TASK [Gathering Facts] ******************************************************
ok: [10.0.30.104]
ok: [10.0.30.105]
TASK [update app]**************************************************************
changed: [10.0.30.104]
changed: [10.0.30.105]
TASK [copy app]**************************************************************
changed: [10.0.30.105]
changed: [10.0.30.104]
TASK [start app]**************************************************************
changed: [10.0.30.104]
changed: [10.0.30.105]
PLAY RECAP**************************************************************
10.0.30.104 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.0.30.105 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
### 查看是否启动成功 ###
[root@jenkins /ansible/playbook]# ansible appNode -m shell -a 'netstat -ntplu | egrep java'
10.0.30.105 | CHANGED | rc=0 >>
tcp6 0 0 :::8080 :::* LISTEN 13136/java
10.0.30.104 | CHANGED | rc=0 >>
tcp6 0 0 :::8080 :::* LISTEN 12269/java
第三步,配置 Jenkins 任务 |
配置 maven 环境,配置在 jenkins 主机上。
[root@jenkins /usr/local/src]# wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[root@jenkins /usr/local/src]# tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
[root@jenkins /usr/local/src]# cd /usr/local/
[root@jenkins /usr/local]# mv apache-maven-3.6.3/ maven-3.6
[root@jenkins /usr/local]# vim /etc/profile.d/maven.sh
#!/bin/bash
# Author:hukey
export MAVEN_HOME=/usr/local/maven-3.6
export PATH=$MAVEN_HOME/bin:$PATH
[root@jenkins /usr/local]# source /etc/profile.d/maven.sh
[root@jenkins /usr/local]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven-3.6
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_201/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
### 配置 mvn 通过阿里云下载库文件 ###
[root@jenkins ~]# vim /usr/local/maven-3.6/conf/settings.xml
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
通过 web 页面配置 jenkins
安装SVN插件
配置 maven 变量
添加任务流程
注意这里的任务名必须和项目名一致!
源码这里添加 配置的 dev_test 仓库地址
配置 maven 进行构建
脚本如下:
if [ -f ${WORKSPACE}/target/*.jar ]; then
APP=`ls ${WORKSPACE}/target/*.jar`
else
echo "APP NOT FOUNTD!"
exit 1
fi
ansible-playbook /ansible/playbook/deploy.yaml -e APP=$APP
到此, Jenkins 任务配置完毕,点击保存,提交源码测试。
手动点击构建部署。
部署成功,可直接去业务服务节点查看程序更新时间和启动情况。
第四步,配置禅道结合 jenkins |
配置完成后保存。
添加 jenkins
注意:这里的 Token必须填写,否则会出现构建失败的情况
jenkins token 创建位置
添加构建
在尝试构建时候,需要为 jenkins 添加两个参数,编辑 jenkins
配置完成,点击保存。
修改 禅道 实时参数:
尝试通过 禅道进行构建:
构建成功。
这个持续集成的过程较为复杂,我是一遍搭建一遍写记录的,于是就诞生了本文,逻辑相对较为混乱。有需求的同学,可以私信给我吧, 可提供一些帮助。
【完】