本系列文章记录“智能提醒助理”wx公众号 建设历程。
一、需求出发点
当前系统开发使用springboot技术栈,需要打包发布、部署到服务器,同时需要区分不同的环境配置。
二、实现方案分析
1、本地打jar包,上传到服务器、启动的时候引用本地配置文件,通过脚本启停。
nohup java -Xms128m -Xmx256m -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -javaagent:/root/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=xx-admin -Dskywalking.collector.backend_service=localhost:11800 -jar ${_JAR_PATH}/${_JAR_NAME} --spring.config.location=${_JAR_PATH}/conf/application.yml > ${_JAR_PATH}/logs/`date +%Y%m%d`-stdout.log &
2、通过Coding devops 持续发布,使用docker 方式部署。
可实现 提交代码 合并分支 即可 触发部署。
三、最终方案
通过Coding devops 持续发布,使用docker 方式部署
1、创建构建计划
2、构建计划基础信息配置
3、构建流程配置
4、构建脚本编辑
选择 文本编辑,输入 构建脚本:
逻辑过程:
1、检出编译
2、构建docker镜像
3、发布docker镜像到镜像仓库
4、登录服务器,拉取镜像,停止旧版本,启动新版本
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('编译') {
steps {
sh 'pwd'
sh 'ls *'
sh 'env'
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('DockerBuild') {
steps {
sh """
cd ${PROJECT} // 切换目录到当前应用
docker build -t ${DOCKER_IMAGE_URL} .
echo ${REGISTRY_PASS} | docker login -u ${REGISTRY_USER} --password-stdin ${CODING_DOCKER_REG_HOST}
docker push --disable-content-trust ${DOCKER_IMAGE_URL}
"""
}
}
stage('发布') {
steps {
withCredentials([usernamePassword(
credentialsId: "${REMOTE_CRED}",
passwordVariable: 'password',
usernameVariable: 'userName'
)]) {
script {
remoteConfig = [:]
remoteConfig.name = "deloy-server"
remoteConfig.host = "${SERVER_IP}"
remoteConfig.allowAnyHosts = true
remoteConfig.user = userName
// SSH 登录密码
remoteConfig.password = password
// 远程登录
sshCommand(remote: remoteConfig, command: "docker login -u ${REGISTRY_USER} -p ${REGISTRY_PASS} ${CODING_DOCKER_REG_HOST}",sudo: true)
// 拉取新镜像
sshCommand(remote: remoteConfig, command: "docker pull ${DOCKER_IMAGE_URL}",sudo: true)
// 停止
sshCommand(remote: remoteConfig, command: "docker rm -f ${PROJECT} | true",sudo: true)
// 启动
sshCommand(remote: remoteConfig, command: "docker run \
-p 7001:7001 \
-p 7081:7081 \
--name ${PROJECT} \
--privileged=true \
--restart unless-stopped \
-v /root/znzl/${PROJECT}/logs:/root/logs \
-v /root/znzl/${PROJECT}/application.yml:/root/application.yml \
-e JAVA_OPTS='-Xms128m -Xmx256m -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8' \
-e PARAMS='--spring.config.location=application.yml' \
-d ${DOCKER_IMAGE_URL}",sudo: true)
}
}
}
}
}
environment {
CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME = "${PROJECT_NAME.toLowerCase()}/${DOCKER_REPO_NAME}/${PROJECT}"
DOCKER_IMAGE_URL = "${CODING_DOCKER_REG_HOST}/${CODING_DOCKER_IMAGE_NAME}:${CI_BUILD_NUMBER}" // 镜像地址
}
}
5、环境变量配置
6、触发方式
1、手动点击触发。
2、代码更新触发。
3、定时触发。
4、API触发。