自动化部署在项目部署过程中很重要,一旦自动化部署完成,我们就可以减轻我们手动的操作的步骤以及出错的概率。下面介绍一种通用的自动化部署。从打包编译到上线,一条命令就完成所有操作。简单而高效
1、Jenkins部署这里不在赘述,直接从新建项目开始。
项目截图,如下:增加两个变量如图,
PushDockerImage 默认布尔值是选中,直接把镜像推到镜像仓库。
增加Pipeline配置,主要是分了几个步骤。所以用pipeline,也可以不用这种方式,直接脚本也行
所有执行步骤写入Jenkinsfile中,并把文件放入项目的根目录,这样才能调用。
Jenkinsfile内容如下:包括编译、打包、推送docker镜像到仓库,ansible部署。
#cat Jenkinsfile
pipeline {
//定义了执行jenkins的机器
agent {
label ‘master’
}
stages {
stage (‘Prepare’) {
steps {
sh “echo Prepare”
//准备阶段,没有暂不处理
}
}
//build打包过程,最后会生产apk包
stage (‘build’) {
steps {
sh ‘echo “start Build”‘
script {
if (params.buildDebug) {
sh ‘echo “build debug version”‘
sh ‘chmod +x ./gradlew’
sh “./gradlew clean”
sh “./gradlew build –debug”
} else {
sh ‘echo “build release version”‘
sh ‘chmod +x ./gradlew’
sh “./gradlew clean”
sh “./gradlew build”
}
}
}
}
stage (‘Test’) {
steps {
sh “echo Test”
//测试阶段,没有暂不处理
}
}
//发布阶段,项目中包括了gradle.properties文件,几个变量:版本、项目、产品,按照这几个名词生产镜像的名
stage (‘Deploy’) {
steps {
sh ‘echo “Start Docker Build And Push Images”‘
script {
if (params.PushDockerImage) {
def props = readProperties file: ‘gradle.properties’
def VERSION = props[‘version’]
def PRODUCT = props[‘product’]
def ARTIFACT = props[‘artifact’]
sh ‘echo “start Build”‘
//开始修改Dockerfile
sh “sed -i ‘s#\${PRODUCT}#${PRODUCT}#g’ Dockerfile”
sh “sed -i ‘s#\${VERSION}#${VERSION}#g’ Dockerfile”
sh “sed -i ‘s#\${ARTIFACT}#${ARTIFACT}#g’ Dockerfile”
sh “docker build -t registry.sreop.com:5000/${PRODUCT}/${ARTIFACT}:${VERSION} -f Dockerfile .”
sh ‘echo “Publish Images To registry.leautolink.com”‘
sh “docker push registry.leautolink.com:5000/${PRODUCT}/${ARTIFACT}:${VERSION}”
//ansible playbook 部署到线上或者测试环境
sh “sudo /usr/bin/ansible-playbook /data/base-docker-compose/product/light/prod/playbook.yml”
}
}
}
}
}
}
2、每个项目需要一个Dockefile
cat Dockerfile
# 基础镜像
FROM registry.sreop.com:5000/alpine-java:8u121b13_jdk_unlimited
# 维护者信息
MAINTAINER test@test.com
# 镜像操作命令
RUN mkdir -p /data/bin/${PRODUCT}/${ARTIFACT}
# 指定后续命令的执行目录
WORKDIR /data/bin/${PRODUCT}/${ARTIFACT}
# 对外连接端口号
EXPOSE 12429
# 向镜像中增加文件
ADD ./build/libs/${ARTIFACT}-${VERSION}.jar .
# 容器启动命令
CMD java -Djava.security.egd=file:/dev/./urandom -jar ${ARTIFACT}-${VERSION}.jar –spring.profiles.active=prod
3、写ansible playbook,为推送到Docker集群平台,并部署到线上或者测试平台。
注意:docker-compose.yml要拷贝到每个docker节点机器上。功能是:获取各个变量,拉取镜像。最后生产docker services
– name: light Pull Image
hosts: docker-swarm-prod
remote_user: root
tasks:
– name: get product var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml |head -n1|awk -F’/’ ‘{print $2}’
register: product
– name: get artifact var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\1#g’
register: artifact
– name: get version var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\2#g’
register: version
– name: docker pull image
shell: docker pull registry.leautolink.com:5000/”{{ product.stdout }}”/”{{ artifact.stdout }}”:”{{ version.stdout }}” || /bin/true
– name: Remove Docker Old Verison
hosts: docker-swarm-prod-lead
remote_user: root
tasks:
– name: get product var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1|awk -F’/’ ‘{print $2}’
register: product
– name: get artifact var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\1#g’
register: artifact
– name: get version var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\2#g’
register: version
– name: remove light
shell: docker stack rm {{ artifact.stdout }} || /bin/true
– name: Start New verison
hosts: docker-swarm-prod-lead
remote_user: root
tasks:
– name: get product var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1|awk -F’/’ ‘{print $2}’
register: product
– name: get artifact var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\1#g’
register: artifact
– name: get version var
shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#\(.*\):\(.*\)#\2#g’
register: version
– name: start light
shell: docker stack deploy -c /data/base-docker-compose/product/light/prod/docker-compose.yml {{ artifact.stdout }} || /bin/true
4、swarm集群部署compose.yml
# cat docker-compose.yml
version: “3”
services:
config-server:
image: registry.sreop.com:5000/leradio/light:1.0.1-RELEASE
command: java -Djava.security.egd=file:/dev/./urandom -jar light-1.0.1-RELEASE.jar –spring.cloud.config.profile=prod –spring.profiles.active=prod
ports:
– 12429:12429
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
networks:
frontend: