持续集成-禅道

说明

安装持续集成: 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

实现流程图

安装禅道

禅道下载链接:https://www.zentao.net/download/

[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

配置完成,点击保存。

修改 禅道 实时参数:

尝试通过 禅道进行构建:

构建成功。

image-20210325203652165

这个持续集成的过程较为复杂,我是一遍搭建一遍写记录的,于是就诞生了本文,逻辑相对较为混乱。有需求的同学,可以私信给我吧, 可提供一些帮助。

【完】

posted @ 2021-03-26 11:15  hukey  阅读(587)  评论(0编辑  收藏  举报