1 利用jenkins pipeline部署最终效果图(注意本文涉及到:jenkins安装,部署,插件安装,groovy,ssh插件等较多涉及点)
2 准备 已经安装好jenkins的可以直接略过
jenkins 安装
1 下载 wget -O jenkins https://pkg.jenkins.io/redhat-stable/jenkins-2.235.1-1.1.noarch.rpm
2 安装 rpm -ivh jenkins-2.235.1-1.1.noarch.rpm
3 修改 vim /etc/sysconfig/jenkins 修改用户名和密码 端口: JENKINS_PORT="8888"
4 启动: systemctl start jenkins
5 访问: IP+端口
6 登录
7 下载available updates 配置文件
Now change it to http://updates.jenkins-ci.org/update-center.json
You are done!
安装maven:
wget -O maven.tar.gz https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -xzf maven.tar.gz
//查看java安装目录
[root@izm5e3f1yp ~]# which java # 1
/usr/bin/java
[root@izm5e3f1yp ~]# ls -lrt /usr/bin/java #2
lrwxrwxrwx 1 root root 22 Apr 23 2019 /usr/bin/java -> /etc/alternatives/java
[root@izm5e3f1yp ~]# ls -lrt /etc/alternatives/java #3
lrwxrwxrwx 1 root root 34 Apr 23 2019 /etc/alternatives/java -> /usr/java/jdk1.8.0_77/jre/bin/java
修改:/etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_77
export MAVEN_HOME=/root/apache-maven-3.6.3
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
生效:source /etc/profile
验证:mvn -v
配置jenkins环境变量
JAVA_HOME=/usr/java/jdk1.8.0_77
M2_HOME=/root/apache-maven-3.6.3
PATH+EXTRA=M2_HOME/bin
修改ecs maven 私服地址
maven settings配置中使用阿里私服,可加速依赖下载速度
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
3 选择pipeline模式部署服务
4 关键代码样例
node {
#定义远程机器,可定义多个
def remote = [:]
remote.name = '172.168.100.101'
remote.host = '172.168.100.101'
remote.user = 'tomcat'
remote.password = 'tomcat@123456'
remote.allowAnyHosts = true
# 命令执行
stage('Remote SSH') {
sshCommand remote: remote, command: "ls -lrt"
sshCommand remote: remote, command: "for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done"
}
# 写文件,并远在程机器执行
stage('Remote SSH-write') {
writeFile file: 'abc.sh', text: 'pwd'
sshScript remote: remote, script: "abc.sh"
}
# PUT文件
stage('Remote SSH-putfile') {
writeFile file: 'abc.sh', text: 'if [ ! -d "myproject" ];then mkdir myproject fi;'
sshPut remote: remote, from: 'abc.sh', into: '.'
}
# 拉去代码
stage('Remote SSH-checkout-build') {
sshRemove remote: remote, path: "abc.sh"
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'ee1e129b-a876-47a9-a7e3-e0b13fa497f0', url: 'https://gitee.com/guofu/myproject']]])
sh label: '', script: 'mvn clean package'
}
# 整理资源
stage('Remote SSH-clean_remote') {
writeFile file: 'clean_remote_old_jar.sh', text: 'rm myproject/*.jar'
sshScript remote: remote, script: "clean_remote_old_jar.sh"
}
# 传送jar到目标机器
stage('Remote SSH-sendfile') {
sh label: '', script: 'if [ ! -d "myproject" ];then mkdir myproject; fi;'
sh label: '', script: 'rm myproject/*.jar'
sh label: '', script: 'jar=$(find ./rec-myproject/target/**.jar) ; mv $jar "./myproject/myproject_$BUILD_NUMBER-$JOB_NAME.jar"'
sshPut remote: remote, from: 'myproject/', into: '.'
}
# deploy.sh 放置在代码中,一并上传到git仓库的部署脚本
stage('Remote SSH-deploy') {
sshScript remote: remote, script: "rec-myproject/src/main/resources/deploy.sh"
}
}
deploy.sh 样例
#!/bin/bash
cd myproject
pid=$(jps -l | grep myproject | awk 'NR==1{print $1}')
echo $pid
if [ "$pid" != "" ];then
echo "kill $pid"
kill -9 $pid
fi
serverPort=9988
status=$(lsof -i:$serverPort)
whatToFind="java"
while [[ "$status" == *"$whatToFind"* ]]
do
v_time=`date "+%Y-%m-%d %H:%M:%S"`
status=$(lsof -i:$serverPort)
done
jar=$(find **$BUILD_NUMBER**.jar)
debug="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=n"
GC_PARAM="-Xmx2g -Xms2g"
LOG_ASYN="-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector "
PRINT_GC="-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-PrintHeapAtGC -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/root/habit-dynamic-rec/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/myproject/logs/heaperr.log"
nohup nice java -XX:+UseG1GC $LOG_ASYN $GC_PARAM $debug $PRINT_GC -jar $jar --spring.profiles.active=prod >/dev/null 2>&1 &
# 监听端口上线情况
whatToFind="java"
status=$(lsof -i:$serverPort)
while [[ "$status" != *"$whatToFind"* ]]
do
v_time=`date "+%Y-%m-%d %H:%M:%S"`
status=$(lsof -i:$serverPort)
tail -5 logs/all.log
sleep 1;
done
echo "success!!!"
5 多机器部署
6 脚本语法参考: