持续集成(Continuous integration,简称CI)指频繁将代码集成到主干,持续集成的目的就是让产品可以快速迭代,同时还能保持高质量,一般包括代码拉取、构建、测试、部署等步骤。Jenkins是一款流行的开源持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。更多详情请参阅Jenkins官网
本文使用docker-compose进行安装,需提前准备好docker和docker compose
新建docker-compose.yml文件,输入以下配置
version: '3.7'
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts-jdk11
restart: unless-stopped
ports:
- '8082:8080'
- '50000:50000'
volumes:
- ./jenkins-data:/var/jenkins_home:rw
- ./jenkins/var/run/docker.sock:/var/run/docker.sock:rw
- D:\Java\apache-maven-3.6.3:/var/java/maven
- E:\var\java\repository:/var/java/repository:rw
networks:
- gljk
networks:
gljk:
driver: bridge
jenkins/jenkins:lts-jdk11镜像已经包含了jdk11,不需要另外安装jdk,maven可以使用宿主机的maven及配置
在docker-compose.yml目录下,执行命令docker-compose up jenkins -d
使用root权限进入jenkins容器实例
docker exec -u 0 -it 容器ID /bin/bash
使用vim打开/etc/profile,如果没有vim命令,可以使用apt-get update和apt-get install vim安装
在/etc/profile中加入下面配置
export JAVA_HOME=/opt/java/openjdk
export MAVEN_HOME=/var/java/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
执行source /etc/profile使其生效
使用java -version和mvn -v查看jdk和maven版本
浏览器输入地址:http://localhost:8082
在该文件或Jenkins启动日志或/var/jenkins_home/secrets/initialAdminPassword中找到密码,点击继续
选择安装推荐的插件,也可以自行安装需要的插件,选择好适合的插件后,点击安装
安装插件
等待插件安装完成,进入创建用户界面
这里选择使用admin账户,进入实例配置页面
点击保存并完成
点击开始使用Jenkins,进入Jenkins首页
默认生成的密码较为复杂,可以修改为简单易记的密码,查看默认密码,需要先进入jenkins容器实例,在文件/var/jenkins_home/secrets/initialAdminPassword中
找到Password,输入新密码,点击保存
修改密码后,需要重新登陆Jenkins
点击左侧菜单栏管理Jenkins
选择全局工具配置
找到JDK配置,配置如下信息
找到MAVEN配置,配置如下信息
在管理Jenkins页面选择插件管理
搜索maven插件
等待插件安装完成
勾选安装完成后重启Jenkins
点击左侧菜单系统管理,选择凭证管理
点击全局---->添加凭据
选择用户名和密码类型,输入用户名、密码、ID、描述
点击左侧菜单新建任务
填写任务名称,选择maven项目
进入maven项目构建页面,选择源码管理
选择Git,在Repository URL中输入项目地址,在Credentials中选择git地址的凭据账号,在Branches to build中选择分支
在Build---->Goals and options中输入clean package -U -Dmaven.test.skip=true,可以跳过单元测试
在Post Steps---->Add post-build step中选择执行shell
在命令行中,编写如下shell脚本
完整shell脚本如下
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="jenkins-maven"
echo "待部署的应用服务器"
server_ips="xx.xx.xx.xx"
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份"
ssh -Tq -o StrictHostKeyChecking=no root@${server_ip} << EOF
mkdir -p $DIR/backup/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}=`date "+%Y%m%d_%H%M%S"`.jar
fi
EOF
echo "拷贝jar包到目标服务器的tmp目录"
scp -q -o StrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar
echo "ssh连接进行发布"
ssh -q -o StrictHostKeyChecking=no root@${server_ip} << EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
cd ${DIR}/${projectName}
sh stop.sh
sh start.sh
EOF
done
echo "success"
回到jenkins容器,使用su jenkins切换到jenkins用户
在根目录下执行命令,一路按Enter即可
ssh-keygen -t rsa
复制.ssh目录下id_rsa.pub公钥为authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
对.ssh目录和authorized_keys文件分别授权700和600
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
同时也对待部署服务器授以相同的权限
将authorized_keys文件拷贝到待部署服务器
scp -p ~/.ssh/id_rsa.pub root@xx.xx.xx.xx:/root/.ssh/authorized_keys
第一次连接时会输入服务器密码,需要先在待部署服务器根目录下新建.ssh目录,另外为了部署应用需要在服务器根目录下先新建/data/app/jenkins-maven目录,并在该目录下新建start.sh脚本
#!/bin/bash
set -e
set -o pipefail
APP_ID=jenkins-maven
APP_DIR="/data/app"
nohup java -Dspring.profiles.active=dev -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > app_out.log & start_ok=false
if [[ $? = 0 ]];then
sleep 1
tail -n 10 app_out.log
sleep 3
tail -n 30 app_out.log
fi
aaa=`grep "Started" app_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];then
echo "Application started ok"
exit 0
else
echo "Application started error"
exit 1
fi
和stop.sh脚本
#!/bin/bash
APP_ID=jenkins-maven
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2'} | sh
回到Jenkins首页,点击新建任务列表右边三角形符号发布任务,运行完成后,在列表第一列可以查看运行结果,成功为勾,失败为叉
也可以直接点击任务名称
进入任务详情
点击左下角构建编号,进入控制台输出日志查看具体部署情况