CICD流水线 Jenkins + Docker compose 分环境 一键部署SpringCloud项目
一、环境准备
接上篇:上篇搭建好了Jenkins 环境 并把docker-compose.yml Dockerfile 相关jar包推送到了目标服务器。
二、分环境部署
1、SpringBoot配置
pom.xml
<profiles> <!--与build标签同级别,放在project标签中-->
<!--这是开发环境-->
<profile>
<id>dev</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<activatedEnv>dev</activatedEnv>
</properties>
<activation>
<!-- 默认环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--这是测试环境-->
<profile>
<id>sit</id>
<properties>
<activatedEnv>sit</activatedEnv>
</properties>
</profile>
</profiles>
bootstrap-dev.properties
#服务发现 spring.cloud.nacos.discovery.server-addr=192.168.56.15:8848 #配置中心 spring.cloud.nacos.config.server-addr=192.168.56.15:8848 spring.cloud.nacos.config.namespace=f9f9b142-110c-4c82-ae48-a15f73074b00 spring.cloud.nacos.config.ext-config[0].data-id=zeal_acl.properties spring.cloud.nacos.config.ext-config[0].refresh=true spring.cloud.nacos.config.group=DEFAULT_GROUP
bootstrap-sit.properties
#服务发现 spring.cloud.nacos.discovery.server-addr=192.168.56.15:8848 #配置中心 spring.cloud.nacos.config.server-addr=192.168.56.15:8848 spring.cloud.nacos.config.namespace=8da183ca-408a-4d3b-983f-35bf18d9edcc spring.cloud.nacos.config.ext-config[0].data-id=zeal_acl.properties spring.cloud.nacos.config.ext-config[0].refresh=true spring.cloud.nacos.config.group=DEFAULT_GROUP
application.properties
spring.profiles.active=@activatedEnv@
2、Jenkins打包设置
echo $Tag cd /var/jenkins_home/workspace/zeal git checkout $Tag git pull origin $Tag /var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package -P sit
3、Dockerfile、docker-compose.yml 配置
Dockerfile
FROM openjdk:8 ENV APP_HOME=/apps/data/zeal_acl WORKDIR $APP_HOME COPY ./zeal_acl-1.0-SNAPSHOT.jar ./zeal_acl.jar EXPOSE 8009 ENV JAVA_OPTS="" CMD java ${JAVA_OPTS} -jar zeal_acl.jar
docker-compose.yml
version: "3.3" networks: zeal: volumes: data: services: gateway: restart: always build: context: gateway dockerfile: Dockerfile container_name: zeal_gateway #指定容器名称 ports: - "8222:8222" networks: - zeal zeal_acl: build: context: zeal_acl dockerfile: Dockerfile container_name: zeal_acl #指定容器名称 environment: - JAVA_OPTS=${JAVA_OPTS} ports: - "8009:8009" volumes: - /logs/apps/zeal_acl/:/logs/apps/zeal_acl/ networks: - zeal nacos: restart: always image: nacos/nacos-server:latest ports: - "8848:8848" environment: - "MODE=standalone" networks: - zeal mysql: restart: always image: daocloud.io/library/mysql:5.6.20 #指定镜像路径 container_name: mysql #指定容器名称 ports: - "3306:3306" #只写一个端口随机使用宿主机一个端口进行容器端口映射 environment: - "MYSQL_ROOT_PASSWORD=root" - "TZ=Asia/Shanghai" - "MYSQL_DATABASE=zeal_acl" volumes: - /apps/docker/mysql:/var/lib/mysql #映射数据卷 - /apps/db/zeal_acl/zeal_acl_db.sql:/docker-entrypoint-initdb.d/zeal_acl_db.sql networks: - zeal sentinel1: restart: always image: redis container_name: redis-sentinel-1 command: redis-sentinel /apps/docker/redis/conf/sentinel1.conf # 自定义路径,可更改,但是需要和volumes中的路径相同。 ports: - 26380:26380 volumes: - ./apps/docker/redis/conf/sentinel1.conf:/apps/docker/redis/conf/sentinel1.conf # 自定义路径,可更改,但是需要和command中的路径相同。 networks: - zeal sentinel2: restart: always image: redis container_name: redis-sentinel-2 command: redis-sentinel /apps/docker/redis/conf/sentine2.conf ports: - 26381:26381 volumes: - ./apps/docker/redis/conf/sentinel2.conf:/apps/docker/redis/conf/sentine2.conf networks: - zeal sentinel3: restart: always image: redis container_name: redis-sentinel-3 command: redis-sentinel /apps/docker/redis/conf/sentine3.conf ports: - 26382:26382 volumes: - ./apps/docker/redis/conf/sentinel3.conf:/apps/docker/redis/conf/sentine3.conf networks: - zeal
看上面的配置 docker-compose.yml 里的 JAVA_OPTS=${JAVA_OPTS}是动态的 那么JAVA_OPTS在哪里配置呢?
答案 .env 文件 在docker-compose.yml同级目录中加入.env
文件,则可以设置docker-compose环境变量的默认值,可以在docker-compose中引用到的。
我们只需要在Jenkins推送文件后将JAVA_OPTS写入进.env文件中就行了
echo "JAVA_OPTS=-Dspring.profiles.active=sit" > .env
三、Jenkins推送后执行脚本
1、将文件移动到部署目录
2、停掉并删除相关服务旧容器,删除旧镜像
3、重新构建镜像并启动容器
这里就是一些文件操作和Docker命令操作就不贴出来了
四、测试
1、提交代码后 Gitee打标签
2、Jenkins构建
3、查看应用日志 环境切换成功
docker logs 容器id
4、SUCCESS 成功将相关服务注册到注册中心 检查相关应用也正常