jenkins + pipeline +docker-compose部署java服务
【代码】jenkins + pipeline +docker-compose部署java服务。
·
1、配置登录gitlab和habar以及远程秘钥
首先进入设置页
其次配置远程登录秘钥,选择全局,再选择add
配置登录选择秘钥
配置连接gitlab,这里配置的密码
配置登录docker-harbor
至此登录验证信息如下
2、pipeline文本内容
// 参数构建
pipeline {
//agent { label '172.93.6.200' }
agent any
parameters {
gitParameter(name: 'BRANCH_TAG', type: 'PT_BRANCH_TAG', branchFilter: 'origin/(.*)', defaultValue: 'master', selectedValue: 'DEFAULT', sortMode: 'DESCENDING_SMART', description: '请选择需要部署的代码:')
choice(name: 'mode', choices: ['deploy','rollback'], description: '请选择发布或者回滚?')
imageTag(name: 'DOCKER_IMAGE',image: 'library/business-client',filter: '.*', defaultTag: '',registry: 'https://harbor.sgpexchange.com', credentialId: 'docker-habor', description: '版本回滚时需要选择镜像仓库\n版本发布可忽略')
string(name: 'version_id', defaultValue: 'v1.1', description: '版本发布时自定义版本号\n版本回滚时根据镜像修订版本号:')
string(name: 'iname', defaultValue: 'business-client', description: '服务名称')
string(name: 'LIMIT', defaultValue: '1024', description: '内存配置')
string(name: 'JARPORT', defaultValue: '10460', description: '服务端口')
string(name: 'ENVMENT', defaultValue: 'pre', description: '环境参数')
string(name: 'host', defaultValue: '172.93.6.200', description: 'host ip地址信息')
}
environment {
dest_path = "/var/jenkins_home/workspace/${JOB_NAME}"
job_path = "/data/docker-compose/jenkins/jenkins_home/workspace/${JOB_NAME}"
}
stages {
stage('从 gitlab 中拉取代码') {
when {
environment name: 'mode',value: 'deploy'
}
steps {
deleteDir()
checkout([$class: 'GitSCM',
branches: [[name: "${params.BRANCH_TAG}"]],
gitTool: 'Default',
userRemoteConfigs: [[url: 'http://gitlab.tqxd.com/defi/aitd-bankcard', credentialsId: 'gitlab-deploy',]]
])
}
}
stage('回滚') {
when {
environment name: 'mode',value: 'rollback'
}
steps {
sh '''
nowImage="library/${iname}:${version_id}"
if [ ${nowImage} != ${DOCKER_IMAGE} ];then
echo "镜像不存在或选择错误,请重新输入镜像tag:"
aborted
else
echo "开始还原${version_id}版本:"
fi
'''
}
}
stage('构建编译生成程序包') {
when {
environment name: 'mode',value: 'deploy'
}
steps {
sh '''
MAVEN_HOME=/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven
export PATH=$PATH:$MAVEN_HOME/bin
mvn clean install -pl business-client/ -am -Dmaven.test.skip=true
jarname=`find business-client/target/ -name "*.jar" |grep -v "sources"|grep -v "exec"`
cp ${jarname} ${iname}.jar
'''
}
}
stage('编写启动脚本docker-entrypoint') {
when {
environment name: 'mode',value: 'deploy'
}
steps {
sh '''
dest_path=/var/jenkins_home/workspace/${JOB_NAME}
cd ${dest_path}
cat > docker-entrypoint.sh <<EOF
#!/bin/bash
java -Dspring.profiles.active=\\${ENVMENT} -Xms\\${LIMIT}m -Xmx\\${LIMIT}m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC \\${JARPORT} -Dfile.encoding=\\${LANG} -Dsun.jnu.encoding=\\${LANG} -jar \${iname}.jar \\${NACOS} \\${DEBUG}
'''
}
}
stage('编写Dockerfile文件') {
when {
environment name: 'mode',value: 'deploy'
}
steps {
sh '''
dest_path=/var/jenkins_home/workspace/${JOB_NAME}
cd ${dest_path}
cat > Dockerfile <<EOF
FROM harbor.sgpexchange.com/library/alpine-jdk:1.8
#add volume
VOLUME /data
VOLUME /data/deploy/
WORKDIR /data
COPY \${iname}.jar ./
ARG LIMIT
ARG ENVMENT
ARG JARPORT
ARG LANG
ARG DEBUG
ARG NACOS_ADDR
ENV LIMIT="\\${LIMIT}" \
ENVMENT="\\${ENVMENT}" \
JARPORT="-Dserver.port=\\${JARPORT}" \
LANG="\\${LANG}" \
DEBUG="\\${DEBUG}" \
NACOS="\\${NACOS_ADDR}"
# NACAOS="--nacos.server={{ NACOS_ADDR }}"
# NACAOS="--spring.cloud.nacos.config.server-addr={{ NACOS_ADDR }}"
COPY docker-entrypoint.sh ./
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["sh","docker-entrypoint.sh"]
'''
}
}
stage('打镜像并推送镜像') {
when {
environment name: 'mode',value: 'deploy'
}
steps {
withCredentials([usernamePassword(credentialsId: 'docker-harbor', passwordVariable: 'password', usernameVariable: 'username')]) {
sh '''
DOCKER_HOME=/var/jenkins_home/tools/docker
export PATH=$PATH:$DOCKER_HOME
dest_path=/var/jenkins_home/workspace/${JOB_NAME}
cd ${dest_path}
docker build --build-arg ENVMENT=${ENVMENT} --build-arg LIMIT=${LIMIT} --build-arg JARPORT=${JARPORT} --build-arg LANG=${LANG} -f ${dest_path}/Dockerfile -t harbor.sgpexchange.com/library/${iname}:${version_id} ${dest_path}
docker login -u ${username} -p ${password} harbor.sgpexchange.com
docker push harbor.sgpexchange.com/library/${iname}:${version_id}
docker rmi harbor.sgpexchange.com/library/${iname}:${version_id}
'''
}
}
}
stage("编写docker-compose.yml文件") {
steps {
sh '''
dest_path=/var/jenkins_home/workspace/${JOB_NAME}
cd ${dest_path}
cat > docker-compose.yml <<EOF
version: '3'
services:
\${iname}:
container_name: \${iname}
image: harbor.sgpexchange.com/library/\${iname}:\${version_id}
restart: always
hostname: \${iname}
volumes:
- ./logs:/data/logs
'''
}
}
stage("启动容器") {
steps {
withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {
script{
def remote = [:]
remote.name = "${env.iname}"
remote.host = "${params.host}"
// remote.host = '172.93.6.200'
remote.allowAnyHosts = true
withCredentials([sshUserPrivateKey(credentialsId: '172.93.6.200', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
remote.user = userName
remote.identityFile = identity
sshCommand remote: remote, command: "mkdir -p /data/deploy/${params.iname}"
sshCommand remote: remote, command: "\\cp ${env.job_path}/docker-compose.yml /data/deploy/${params.iname}/"
sshCommand remote: remote, command: "cd /data/deploy/${params.iname} && docker-compose down"
sshCommand remote: remote, command: "docker images |grep none |awk -F \" \" \'{print \"docker rmi -f \"\$3}\'|sh"
sshCommand remote: remote, command: "cd /data/deploy/${params.iname} && docker-compose up -d"
}
// stage('Remote SSH') {
// sshScript remote: remote, command: "ls -lrt"
// sshScript remote: remote, command: "for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done"
// }
}
}
}
}
}
}
3、点击构建时参数自动补全,如下
4、执行结果如下
5、查看容器已启动
[root@ip-172-93-6-200 business-client]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d7e5f0fb4d8 harbor.sgpexchange.com/library/business-client:v1.0 "sh docker-entrypoin…" About a minute ago Up 6 seconds business-client
6、当我们需要还原时,只需要注意以下三个参数,其余不用考虑
7、查看还原视图
8、三个文件内容
1、docker-compose.yml
version: '3'
services:
business-client:
container_name: business-client
image: harbor.sgpexchange.com/library/business-client:v1.0
restart: always
hostname: business-client
volumes:
- ./logs:/data/logs
2、docker-entrypoint.sh内容
#!/bin/bash
java -Dspring.profiles.active=${ENVMENT} -Xms${LIMIT}m -Xmx${LIMIT}m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC ${JARPORT} -Dfile.encoding=${LANG} -Dsun.jnu.encoding=${LANG} -jar business-client.jar ${NACOS} ${DEBUG}
3、Dockerfile文件内容
FROM harbor.sgpexchange.com/library/alpine-jdk:1.8
#add volume
VOLUME /data
VOLUME /data/deploy/
WORKDIR /data
COPY business-client.jar ./
ARG LIMIT
ARG ENVMENT
ARG JARPORT
ARG LANG
ARG DEBUG
ARG NACOS_ADDR
ENV LIMIT="${LIMIT}" ENVMENT="${ENVMENT}" JARPORT="-Dserver.port=${JARPORT}" LANG="${LANG}" DEBUG="${DEBUG}" NACOS="${NACOS_ADDR}"
# NACAOS="--nacos.server={{ NACOS_ADDR }}"
# NACAOS="--spring.cloud.nacos.config.server-addr={{ NACOS_ADDR }}"
COPY docker-entrypoint.sh ./
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["sh","docker-entrypoint.sh"]
更多推荐
所有评论(0)