回系列博客主目录及代码地址 spring boot项目基于docker搭建gitlab CI CD持续集成环境
本文将会介绍如何使用gitlab CI实现持续部署(CD),将spring boot项目打包并部署到docker容器中。
增加application-prod.yml
一般来说,dev环境的配置会跟prod环境配置分开,所以需要增加一个配置专门用于部署到prod
spring boot的配置是增量配置,只需要将不同的配置分开既可。
- dev 环境
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/kelvin?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: mysql
- prod 环境
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${MYSQL_HOST}:3306/testdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: ${MYSQL_USERNAME}
password: ${MYSQL_PASSWORD}
mysql的hostname、username、password通过环境变量传入。
容器配置
- Dockerfile
FROM openjdk:8-jdk-alpine
ENV APP_HOME=/usr/app
COPY ./spring-boot-test-ci.jar ${APP_HOME}/app.jar
RUN chmod 777 ${APP_HOME}/app.jar
VOLUME /usr/app
EXPOSE 8001/tcp
WORKDIR ${APP_HOME}
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]
看不懂?那就要去温习一下docker基础知识了,嘿嘿!
- docker-compose.yml
version: '3'
services:
spring-boot-app:
image: spring-boot-test-ci:v1
build:
dockerfile: Dockerfile
context: .
container_name: spring-boot-ci
environment:
- MYSQL_HOST=mysql
- MYSQL_USERNAME=ci
- MYSQL_PASSWORD=ci
- DB_NAME=testdb
privileged: true
ports:
- 8001:8001
depends_on:
- mysql
networks:
- webnet
mysql:
image: mysql:5.7
container_name: mysql
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=Password1
- MYSQL_DATABASE=testdb
- MYSQL_USER=ci
- MYSQL_PASSWORD=ci
ports:
- 3306:3306
networks:
- webnet
volumes:
- /home/ci/volumes/mysql/data:/var/lib/mysql
networks:
webnet:
因为项目需要使用到mysql,所以增加了一个mysql service,如果你不想增加mysql的话,也可以在外部启动一个mysql服务器既可,然后修改application-prod.yml相应connection配置连接到你外部的mysql。
如上,在docker-compose.yml配置environment中定义了mysql连接信息等环境变量,那么在部署启动容器的时候就可以注入到application-prod.yml中使用。
增加deploy job
- 在.gitlab-ci.yml中增加deploy的job
package:
stage: package
cache:
key: m_m2
policy: pull-push
paths:
- .m2/repository/
script:
- mvn clean install -P skipTests -s settings.xml
artifacts:
when: on_success
paths:
- target/spring-boot-test-ci-1.0.0.jar
tags:
- SHARE_MAVEN_JDK
deploy:
stage: deploy
image: ictu/sshpass:latest
script:
- pwd
- ls -l
- ls ./target/
- sshpass -p ci scp -o StrictHostKeyChecking=no target/spring-boot-test-ci-1.0.0.jar ci@localhost:/home/ci/appsrc/spring-boot-ci/spring-boot-test-ci.jar
- sshpass -p ci scp -o StrictHostKeyChecking=no deploy/Dockerfile ci@localhost:/home/ci/appsrc/spring-boot-ci/Dockerfile
- sshpass -p ci scp -o StrictHostKeyChecking=no deploy/docker-compose.yml ci@localhost:/home/ci/appsrc/spring-boot-ci/docker-compose.yml
# - sshpass -p ci ssh -o StrictHostKeyChecking=no ci@localhost 'docker build -f /home/ci/appsrc/spring-boot-ci/Dockerfile -t spring-boot-test-ci:v1 /home/ci/appsrc/spring-boot-ci/'
- sshpass -p ci ssh -o StrictHostKeyChecking=no ci@localhost 'docker stop spring-boot-ci'
- sshpass -p ci ssh -o StrictHostKeyChecking=no ci@localhost 'docker-compose -f /home/ci/appsrc/spring-boot-ci/docker-compose.yml up -d --build'
tags:
- SSH_REMOTE_DEPLOY
only:
- master
定义了两个job:package, deploy. package想将项目打包成jar,上传到artifacts,然后deploy通过ssh scp命令将jar以及相应的部署配置copy到部署机器(这里本地虚拟机)中,然后重新build image并启动容器,进而实现重新部署。
-
注册deploy runner
可以发现deploy使用了另一个tag为SSH_REMOTE_DEPLOY的runner,由于所使用的image不一样所以使用单独一个runner用于deploy。这里没有特别需要注意的,只需要在注册runner最后一步选择image:ictu/sshpass:latest -
测试
尝试修改一些东西,然后push到gitlab触发CI CD,成功后:
查看你的修改是否已经生效。
最后
至此,基于spring boot的CI&CD已经全部搭建成功。