⚠️注意:主要技术有
gitlab-ci
docker
docker-compose 语法规则
shell
linux
涉及到的知识点
**skywalking-oap** 链路追踪
需单独部署skywalking-oap服务,然后就只需要配置即可
> https://www.cnblogs.com/yougewe/p/11973117.html
**volumes** 保存Docker容器生成和使用的数据的首选机制
例如:当删除容器时,容器之前产生的数据会同时被删除,如果数据不想被删除,则可配置数据挂载到指定文件夹
> https://blog.csdn.net/dhaiuda/article/details/82842873
**network** 解决网络隔离问题
通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行
> https://www.cnblogs.com/jiangzhaowei/p/10124499.html
**gitlab-runner** 执行软件集成脚本
>https://blog.csdn.net/weixin_40286085/article/details/114532186
项目结构
链路追踪skywalking-oap
因为部署了skywalking-oap服务,则只需要将文件夹拷贝至项目下面即可,下载地址
链接:https://pan.baidu.com/s/1pDWrneyOmoSP38nR0J_jKA 密码:l4fw
docker配置
新建docker-compose.yml文件
docker-compose.yml文件内容
version : docker版本
order_service1 : 自定义服务名称
container-name : 容器名称
image : 镜像下载地址
expose : 项目端口号
volumes : 挂载 --将容器中的文件进行指定地址同步
environment :环境配置
NACOS_URL : nacos的端口号
NACOS_NAMESPACE : nacos对应的命名空间名称
AGENT_SERVICE_NAME : 自定义链路追踪名称
AGENT_URL : 链路追踪名称和端口
external_links : 需要连接的服务名称
项目下新建Dockerfile文件–服务打包
内容为:
FROM java:8
COPY ./jar/order-service.jar /app.jar
COPY ./agent /agent
ENTRYPOINT ["sh","-c","java -jar -Xms512m -Xmx512m -javaagent:/agent/skywalking-agent.jar=agent.service_name=$AGENT_SERVICE_NAME,collector.backend_service=$AGENT_URL /app.jar --nacos-url=$NACOS_URL --nacos-namespace=$NACOS_NAMESPACE"]
解释:
#将订单服务复制到容器下的/app.jar
#将链路追踪文件复制到docker容器下
#服务打包命令
#AGENT_SERVICE_NAME、AGENT_URL、NACOS_URL、NACOS_NAMESPACE对应docker-compose.yml文件下的环境变量配置的名称
项目下新建.gitlab-ci.yml文件–shell部署脚本
image: docker:stable #docker镜像
variables:
SERVER_NAME: order-service #服务名称--对应pom.xml里面打包的名称
DOCKER_SERVER_LOGIN: docker login -u $docker_username -p $docker_password $docker_host #docker登陆--$docker_username、$docker_password、$docker_host对应gitlab中全局设置下的CI/CD
DOCKER_SERVER_LOGIN_OUT: docker logout $docker_host #docker登出
JAR_HOME: ./order-service-start/target/order-service.jar #服务jar包的地址
BUILD_JAR_HOME: ./jar/ #复制的服务jar包地址
IMAGE_NAME: $docker_host/platform4/order-service:latest #订单服务镜像默认最新版本
TAG_IMAGE_NAME: $docker_host/platform4/order-service:$CI_COMMIT_TAG #带版本号的订单服务镜像版本 CI_COMMIT_TAG为runner参数
stages: #流程步骤,对应下面的stage
- test
- build
- build-image
- release
- deploy
测试:
image: $docker_host/gs_maven:3.6.3-jdk-8 #使用的镜像
stage: test
script:
- mvn -Dmaven.repo.local=.m2/repository test #mvn打包脚本--指定运行mvn test后,在项目下生成.m2文件夹存放jar包
tags:
- platform4 #对应gitlab-runner下的项目名称
cache: # 缓存依赖
key: MAVEN_REPOSITORY
paths:
- .m2/repository
only: #条件判断为dev才有测试步骤
refs:
- dev
构建jar:
image: $docker_host/gs_maven:3.6.3-jdk-8
stage: build
variables:
#maven 命令参数
MAVEN_COMMAND_ARGS: -Dmaven.repo.local=.m2/repository -Dmaven.test.skip=true
script:
#maven 项目打包
- mvn $MAVEN_COMMAND_ARGS package
- if [ ! -d $BUILD_JAR_HOME ]; then mkdir -p $BUILD_JAR_HOME; fi #判断生成的jar路径是否存在,不存在就创建
- cp $JAR_HOME $BUILD_JAR_HOME
artifacts: #jar产物保存一天
expire_in: 1 day
name: "${CI_COMMIT_REF_SLUG}-${CI_JOB_NAME}"
paths:
- $BUILD_JAR_HOME
cache: # 缓存依赖
key: MAVEN_REPOSITORY
paths:
- .m2/repository
tags:
- platform4
only:
refs:
- dev
needs: ["测试"]
构建jar:版本:
image: $docker_host/gs_maven:3.6.3-jdk-8
stage: build
variables:
#maven 命令参数
MAVEN_COMMAND_ARGS: -Dmaven.repo.local=.m2/repository -Dmaven.test.skip=true
script:
#maven 先设置版本并打包
- mvn versions:set -DnewVersion=$CI_COMMIT_TAG-RELEASES
- mvn $MAVEN_COMMAND_ARGS package
- if [ ! -d $BUILD_JAR_HOME ]; then mkdir -p $BUILD_JAR_HOME; fi
- cp $JAR_HOME $BUILD_JAR_HOME
artifacts: #jar产物保存一天
expire_in: 1 day
name: "${CI_COMMIT_REF_SLUG}-${CI_JOB_NAME}"
paths:
- $BUILD_JAR_HOME
cache: # 缓存依赖
key: MAVEN_REPOSITORY
paths:
- .m2/repository
tags:
- platform4
only:
variables:
- $CI_DEFAULT_BRANCH =='dev' && ($CI_COMMIT_TAG =~ /^t/ || $CI_COMMIT_TAG =~ /^v/)
构建镜像:
stage: build-image
script:
# docker 镜像打包
- docker build -t $IMAGE_NAME .
tags:
- platform4
only:
refs:
- dev
needs: ["构建jar"]
构建镜像:版本:
stage: build-image
script:
# docker 镜像打包
- docker build -t $TAG_IMAGE_NAME .
tags:
- platform4
only:
variables:
- $CI_DEFAULT_BRANCH =='dev' && ($CI_COMMIT_TAG =~ /^t/ || $CI_COMMIT_TAG =~ /^v/)
needs: ["构建jar:版本"]
发布maven:
image: $docker_host/gs_maven:3.6.3-jdk-8
stage: release
dependencies: [] #为空说明不下载产物
variables:
#maven 命令参数
MAVEN_COMMAND_ARGS: -Dmaven.repo.local=.m2/repository -Dmaven.test.skip=true
script:
#maven 发布
- mvn $MAVEN_COMMAND_ARGS deploy
cache: # 缓存依赖
key: MAVEN_REPOSITORY
paths:
- .m2/repository
tags:
- platform4
only:
refs:
- dev
needs: ["构建jar"]
发布maven:版本:
image: $docker_host/gs_maven:3.6.3-jdk-8
stage: release
dependencies: []
variables:
#maven 命令参数
MAVEN_COMMAND_ARGS: -Dmaven.repo.local=.m2/repository -Dmaven.test.skip=true
script:
#maven 打版本发布
- mvn versions:set -DnewVersion=$CI_COMMIT_TAG-RELEASES
- mvn $MAVEN_COMMAND_ARGS deploy
cache: # 缓存依赖
key: MAVEN_REPOSITORY
paths:
- .m2/repository
tags:
- platform4
only:
refs:
- dev
- /^v/
- /^t/
variables:
- $CI_DEFAULT_BRANCH =='dev' && ($CI_COMMIT_TAG =~ /^t/ || $CI_COMMIT_TAG =~ /^v/)
needs: ["构建jar:版本"]
发布docker:
stage: release
dependencies: []
script:
# 登录镜像仓库
- $DOCKER_SERVER_LOGIN
# 上传
- docker push $IMAGE_NAME
# 删除
- docker rmi $IMAGE_NAME
tags:
- platform4
only:
refs:
- dev
needs: ["构建镜像"]
发布docker:版本:
stage: release
dependencies: []
script:
# 登录镜像仓库
- $DOCKER_SERVER_LOGIN
# 上传
- docker push $TAG_IMAGE_NAME
# 删除
- docker rmi $TAG_IMAGE_NAME
tags:
- platform4
only:
variables:
- $CI_DEFAULT_BRANCH =='dev' && ($CI_COMMIT_TAG =~ /^t/ || $CI_COMMIT_TAG =~ /^v/)
needs: ["构建镜像:版本"]
部署开发环境:
# 使用专用SSH镜像
image: $docker_host/gs_ssh:latest
stage: deploy
dependencies: []
variables:
#SSH 连接命令参数,因为是在镜像中连接远程服务器,所以命令是ssh,如果只是在本服务器中,则不需要
SSH_COMMAND: ssh $dev_server_user@$dev_server_host
#部署文件夹 当前登录用户目录
FILE_DIR: /home/$dev_server_user/platform4/$SERVER_NAME
script:
# 检查目录docker-compose.yml 是否存在,存在则停止
- $SSH_COMMAND "if [ -f $FILE_DIR/docker-compose.yml ]; then docker-compose -f $FILE_DIR/docker-compose.yml down; fi"
# 判断镜像是否存在,存在则删除
- $SSH_COMMAND "if [[ \$(docker images -q ${IMAGE_NAME}) != '' ]]; then docker rmi $IMAGE_NAME; fi"
# 目录不存在则创建目录
- $SSH_COMMAND "if [ ! -d $FILE_DIR ]; then mkdir -p $FILE_DIR; fi"
# 把部署脚本从当前服务器上传到测试服务器
- scp ./docker/dev/docker-compose.yml $dev_server_user@$dev_server_host:$FILE_DIR
# 登录docker 私有镜像仓库,并启动镜像,登出
- $SSH_COMMAND "$DOCKER_SERVER_LOGIN"
# 运行docker-compose 启动镜像
- $SSH_COMMAND "docker-compose -f $FILE_DIR/docker-compose.yml up -d"
# 登出
- $SSH_COMMAND "$DOCKER_SERVER_LOGIN_OUT"
tags:
- platform4
only:
refs:
- dev
needs: ["发布docker"]
部署测试环境:
stage: deploy
dependencies: []
script:
- echo "部署测试环境-$TAG_IMAGE_NAME"
tags:
- platform4
only:
variables:
- $CI_DEFAULT_BRANCH =='dev' && $CI_COMMIT_TAG =~ /^t/
needs: ["发布docker:版本"]
部署生产环境:
stage: deploy
dependencies: []
script:
- echo "部署生产环境-$TAG_IMAGE_NAME"
tags:
- platform4
# 手动部署生产
when: manual
only:
variables:
- $CI_DEFAULT_BRANCH =='dev' && $CI_COMMIT_TAG =~ /^v/
needs: ["发布docker:版本"]
gitlab-runner参数
http://47.99.95.214:9091/help/ci/variables/README.md#custom-variables-validated-by-gitlab
最后提交代码,gitlab上就会自动进行部署,如图:
如果出现如下错误
则需要配置分支为受保护状态