Coding使用构建计划,实现局域网Linux中docker的自动部署
Posted 18岁的许嵩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Coding使用构建计划,实现局域网Linux中docker的自动部署相关的知识,希望对你有一定的参考价值。
文章目录
前言
在项目测试阶段,我们经常要部署测试环境。第一步先拉去测试分支的最新代码;第二步mvn clean install打包jar/war包;第三步通过一些ftp工具传输到局域网的linux上,第四步拷贝进docker镜像;第五步java -jar启动jar包/启动tomcat等等…繁琐的过程,今天我们就来一键完成这个操作。使用Coding的构建计划,加上shell脚本来实现,自动拉代码;自动打包;自动传输;自动拷贝替换;自动执行重启脚本等一整套自动部署流程。
一、创建节点池节点/接入新节点
此步骤在coding说明文档里有,按文档操作即可,此处不做详细介绍。参考
接入新节点成功后,可以看到占用状态为闲置
二、创建构建计划
1.选择简易模板
2.选择对应的git仓库,点击确定即可
3.流程配置
直接进入第三步构建->执行Shell脚本,修改为项目所需要的脚本,我的项目是:
mvn clean
mvn package
然后是收集构建物,根据项目的架构而定,单应用部署的,收集一次构建物即可,找到对应的jar/war包即可。
多应用则添加一个收集构建物流程,同理配置一下即可。
到这里构建的配置已完成,接下来配置部署流程,直接查看执行Pipeline脚本
这里推荐使用文本编辑器配置,屏幕大一些
语法使用的是Jenkins,我这边的Linux是使用私钥登录的,需要提前把id_rsa配置为项目凭据。参考
可以把对应的一些服务器信息,配置到环境变量里
stage('部署') {
steps {
echo '部署中...'
script {
def remoteConfig = [:]
remoteConfig.name = "ssh-server"
remoteConfig.host = "${env.REMOTE_HOST}"
remoteConfig.port = "${env.REMOTE_PORT}".toInteger()
remoteConfig.user = "${env.REMOTE_USER_NAME}"
remoteConfig.allowAnyHosts = true
// Linux私钥登录
withCredentials([sshUserPrivateKey(
credentialsId: "${env.REMOTE_CRED}",
keyFileVariable: "id_rsa"
)]) {
remoteConfig.identityFile = id_rsa
sshPut(remote: remoteConfig, from: "/target/demo-server.jar", into: "/home")
sshCommand(remote: remoteConfig, command: "/home/auto_server.sh")
}
}
echo '部署完成'
}
}
4.触发规则
指定对应的分支,一般使用手动触发,当然你可以根据需求选择。
5.Linux shell脚本 auto_server.sh
调用Linux的shell脚本,实现把jar包拷贝进docker镜像里,再调用docker镜像中的shell脚本。
#!/bin/sh
#docker name
DOCKER_NAME=test
#file dir
FILE_DIR=/home/demo-server.jar
#project dir
PROJECT_DIR=/usr/local
#get docker cid
CID=$(docker ps | grep "$DOCKER_NAME" | awk '{print $1}')
docker cp $FILE_DIR $CID:$PROJECT_DIR
docker exec -i $CID /bin/bash -c 'cd /usr/local && ./demo.sh restart'
6.docker镜像中 shell脚本 demo.sh
这里是spring boot打包后的jar包
#!/bin/sh
#post
POST=8080
#app_name
API_NAME=demo
#jar_name
JAR_NAME=$API_NAME\\.jar
#log_name
LOG_NAME=$API_NAME\\.log
#MetaspaceSize
METASPACE_SIZE=2048m
#MaxMetaspaceSize
MAXMETASPACE_SIZE=2048m
#SurvivorRatio
SURVIVOR_RATIO=8
#garbage collector
GARBAGE_COLLECTOR=UseConcMarkSweepGC
#Xms
XMS=2048m
#Xmx
XMX=2048m
#Xmn
XMN=512m
#Xss
XSS=512k
#java opts
JAVA_OPTS="-XX:MetaspaceSize=${METASPACE_SIZE} -XX:MaxMetaspaceSize=${MAXMETASPACE_SIZE} -XX:SurvivorRatio=${SURVIVOR_RATIO} -XX:+${GARBAGE_COLLECTOR} -Xms${XMS} -Xmx${XMX} -Xmn${XMN} -Xss${XSS} -Dfile.encoding=utf-8 -Dserver.servlet.contextPath= -Dserver.port=${POST} -Dspring.application.name=${API_NAME}"
#pid
PID=0
#is_exist
is_exist(){
PID=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}'`
if [ -z "${PID}" ]; then
return 1
else
return 0
fi
}
#start
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} is already running PID=${PID}"
else
nohup /usr/bin/java $JAVA_OPTS -jar /usr/local/$JAR_NAME > $LOG_NAME 2>&1 &
echo "[OK]"
fi
}
#stop
stop() {
is_exist
kill $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} begin kill, PID=${PID}"
kill -9 $PID
sleep 2
echo "${JAR_NAME} process stopped"
else
echo "${JAR_NAME} is not running"
fi
}
#status
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} is running PID is ${PID}"
else
echo "${JAR_NAME} is not running"
fi
}
#restart
restart(){
stop
start
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
status
;;
*)
echo "Usage: {start|stop|restart|status}"
;;
esac
exit 0
三、立即构建
构建成功则已经完成自动部署!
总结
Coding服务器执行:拉去对应分支最新代码;
Coding客户端:执行构建流程(后端:mvn clean install,前端vue:npm i)、执行部署流程(连接上Linux服务器,把文件传输进去,且可以调用shell脚本)
Linux局域网服务器:编写shell脚本实现备份、替换jar/war包、启动jar包等等(前提是局域网是可以上网的)。
原创,禁止转载!
以上是关于Coding使用构建计划,实现局域网Linux中docker的自动部署的主要内容,如果未能解决你的问题,请参考以下文章
sql server 2008 如何实现数据库定时备份到局域网内另外一台服务器上