Dockerfile 文件
# openjdk 8u222
FROM openjdk:8u222-jre
MAINTAINER 组织名称
LABEL description=XXXX平台
# 设置环境常量
ENV TZ=Asia/Shanghai \
# 工作目录名
WORKPATH=/部署项目名称
# 工作目录
WORKDIR /usr/local/workspace/$WORKPATH
# 拷贝Jar
ADD ./*.jar ./app.jar
# 切换为上海时区
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
# 启动镜像
ENTRYPOINT ["java", "-Dfile.encoding=utf-8", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=dev"]
# 暴露端口
EXPOSE 8080
Ansible Host 文件
[开发环境]
10.0.0.111 ansible_connection=ssh ansible_ssh_user=用户名 ansible_ssh_pass=用户密码 host1=host1:10.0.0.20 host2=host2:10.0.0.21 host3=host3:10.0.0.22 host4=host4:10.0.0.23
Jenkins Pipeline 代码
pipeline {
agent {
node {
label 'haimaxy-jnlp'
}
}
environment {
JAVA_HOME = '/data/projects/jenkins-home/opt/env/jdk/jdk8u292-b10'
MAVEN_HOME = '/data/projects/jenkins-home/opt/env/maven/apache-maven-3.6.3'
DOCKER_REPOSITORY_HOST = 'registry.cn-beijing.aliyuncs.com'
DOCKER_REPOSITORY_USERNAME = 'Docker仓库账号'
DOCKER_REPOSITORY_PASSWORD = 'Docker仓库密码'
ORG_NAME = '组织名称'
ANSIBLE_HOSTS_PATH = 'AnsibleHost文件路径'
DEPLOY_PROJECT = '部署项目名称'
DEPLOY_ENV = 'prod'
}
parameters {
gitParameter(name: 'GIT_TAG',
type: 'PT_TAG',
branchFilter: 'origin/(.*)',
defaultValue: 'master',
selectedValue: 'DEFAULT',
sortMode: 'DESCENDING_SMART',
description: '请选择代码标签')
choice(name: 'SERVER', choices: ['开发服务器'], description: '部署服务器')
string(name: 'JVM', defaultValue: '', description: 'JVM 配置')
string(name: 'PORT', defaultValue: '8080:8080', description: '端口 配置')
}
stages {
stage('git checkout') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${params.GIT_TAG}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[url: '项目Git地址', credentialsId: '1658a146-5944-4702-9fb8-f36ee3008222',]]
])
}
}
stage('code build') {
steps {
sh '''
ls
${MAVEN_HOME}/bin/mvn clean package -Dmaven.test.skip=true
'''
}
}
stage('docker build and push') {
steps {
sh '''
CURR_IMAGE=${ORG_NAME}/${DEPLOY_PROJECT}:${GIT_TAG}
REPOSITORY=${DOCKER_REPOSITORY_HOST}/${CURR_IMAGE}
# 打包镜像 发布到云仓库
cd docker-build
docker build -t ${CURR_IMAGE} .
docker tag ${CURR_IMAGE} ${REPOSITORY}
docker login --username=${DOCKER_REPOSITORY_USERNAME} --password=${DOCKER_REPOSITORY_PASSWORD} ${DOCKER_REPOSITORY_HOST}
docker push ${REPOSITORY}
'''
}
}
stage('remote docker deploy') {
steps {
sh '''
CURR_IMAGE=${ORG_NAME}/${DEPLOY_PROJECT}:${GIT_TAG}
REPOSITORY=${DOCKER_REPOSITORY_HOST}/${CURR_IMAGE}
# 制作部署配置文件
cat >> deploy.yaml << EOF
- hosts: ${SERVER}
tasks:
- name: 启动镜像
tags: back_code
shell: |
sudo docker login --username=${DOCKER_REPOSITORY_USERNAME} --password=${DOCKER_REPOSITORY_PASSWORD} ${DOCKER_REPOSITORY_HOST}
# 清除镜像
sudo docker rm -f ${DEPLOY_PROJECT}
sudo docker rmi -f ${REPOSITORY}
docker pull ${REPOSITORY}
sudo docker run -p ${PORT} --name ${DEPLOY_PROJECT} --restart=on-failure \
-v /data/logs/:/usr/local/workspace/${DEPLOY_PROJECT}/logs \
-v /data/var/${DEPLOY_PROJECT}/:/usr/local/workspace/${DEPLOY_PROJECT}/var \
--add-host={{host1}} \
--add-host={{host2}} \
--add-host={{host3}} \
--add-host={{host4}} \
-d ${REPOSITORY} \
--spring.profiles.active=${DEPLOY_ENV} ${JVM}
EOF
# 执行远程命令
ansible-playbook deploy.yaml -i ${ANSIBLE_HOSTS_PATH}
'''
}
}
}
}