gitlab-ci+docker+docker-compose自动部署到远程服务器(springcloud)

⚠️注意:主要技术有

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上就会自动进行部署,如图:
在这里插入图片描述

如果出现如下错误
在这里插入图片描述
则需要配置分支为受保护状态
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值