使用gitlab提供的CICD功能进行项目部署(SpringCloud微服务)


一、GitLab Runner 介绍

GitLab Runner是一个开源项目,用于运行您的作业并将结果发送回GitLab。它与GitLab CI一起使用,GitLab CI是GitLab随附的开源持续集成服务,用于协调作业。

GitLab Runner是用Go编写,可以作为单个二进制文件运行,不需要语言特定的要求。

二、GitLab Runner的三种类型

shared:运行整个平台项目的作业(gitlab)

group:运行特定group下的所有项目的作业(group)

specific:运行指定的项目作业(project)

三、GitLab Runner两种状态

locked:无法运行项目作业

paused:不会运行作业

四、GitLab Runner安装

由于目前服务都上容器了,因此这里只演示采用docker安装GitLab Runner的方法,其他的方法可参考官网。

官网地址:https://docs.gitlab.com/runner/

docker run -d --name gitlab-runner --restart always \
  -v /mydata/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

五、GitLab Runner注册

注意:注册gitlab-runner的前提是必须有一个可以使用的gitlab仓库

点击用户管理–左边点击runner,可以看到界面右边有gitlab的地址和token。这个需要用于后面runner的注册使用。这里我们注册一个share类型的runner。

由于runner是采用docker安装,因此注册的时候需要进入到runner的容器中进行

[root@localhost config]# docker exec -it gitlab-runner bash

root@24dc60abee0b:/# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=86 revision=775dd39d version=13.8.0
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://192.168.50.128/
Enter the registration token:
iqxKz5XTz4w_2RxiSQ5S
Enter a description for the runner:
[24dc60abee0b]: node1.ayunw.cn
Enter tags for the runner (comma-separated):
default
Registering runner... succeeded                     runner=iqxKz5XT
Enter an executor: docker-ssh+machine, kubernetes, custom, shell, ssh, virtualbox, docker, docker-ssh, parallels, docker+machine:
docker
Enter the default Docker image (for example, ruby:2.6):
docker:19.03.15
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

root@24dc60abee0b:/# gitlab-runner restart
Runtime platform                                    arch=amd64 os=linux pid=98 revision=775dd39d version=13.8.0
Terminated

root@24dc60abee0b:/# gitlab-runner list 
Runtime platform                                    arch=amd64 os=linux pid=130 revision=775dd39d version=13.8.0
Listing configured runners                          ConfigFile=/etc/gitlab-runner/config.toml
node1.ayunw.cn                                      Executor=docker Token=VSVWeipeMirJsJo9znT5 URL=http://192.168.50.128/

runner注册完成后会在 /etc/gitlab-runner目录下生成一个config.toml的文件。这个就是runner的配置文件。因为在安装runner的时候我们已经将配置文件的目录通过挂载的形式映射到了宿主机目录:/mydata/gitlab-runner/config 下,所以后续如果需要更新runner配置文件可以直接在宿主机上进行修改。并且在宿主机上进行修改runner配置文件不需要重启runner。它会每5分钟检查一次文件自动获取所有更改。包括该[[runners]]部分中定义的任何参数以及全局部分中的大多数参数(除外)listen_address。

配置如下:

[root@iZ8vb3whi21216kyd2fm2ywxgcZ ~]# cat /mydata/gitlab-runner/config/config.toml
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "springcloud cicd test"
  url = "http://192.121.121.2:8088"
  token = "H16qeFminuGeLZAed6ZE"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:20.10.15"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/mydata/sc     s/.m2:/mydata/scs/.m2","/mydata/scs/project/:/mydata/scs/project/"]
    pull_policy = "if-not-present"
    shm_size = 0

我这里的volumes填的第一个是因为我要在容器里使用docker命令,这涉及到docker in docker问题;root/.m2很好理解,因为我在runner里使用maven镜像进行打包操作(见一会的.gitlab-ci.yml文件),将各个jar包存在宿主机的/mydata/scs/.m2目录下,避免一直下jar包减少job所耗时间,/mydata/scs/project/将maven打包的jar存储在宿主机的/mydata/scs/project/目录下。

pull_policy = “if-not-present”#这是避免runner重新拉取镜像,直接从本地拉

注册完成后,返回gitlab的ui查看注册的runner。

六、配置.gitlab-ci.yml和Dockerfile

项目结构如下:

1.gitlab-ci.yml

variables: #变量
  AUTH_CONTAINER:  "scs-auth"
  AUTH_IMAGE:  "scs-auth"
  AUTH_PORT:  9200
  GATEWAY_CONTAINER: "scs-gateway"
  GATEWAY_IMAGE: "scs-gateway"
  GATEWAY_PORT: 8080
  SYSTEM_CONTAINER:  "scs-system"
  SYSTEM_IMAGE:  "scs-system"
  SYSTEM_PORT: 9201
  CMS_CONTAINER:  "scs-cms"
  CMS_IMAGE:  "scs-cms"
  CMS_PORT: 9301
  FILE_CONTAINER:  "scs-file"
  FILE_IMAGE:  "scs-file"
  FILE_PORT: 9300
  MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=/mydata/scs/.m2"  #指定maven的存储目录

cache:
  paths:
    - /mydata/scs/.m2

stages:
  - build
  - deploy

build:jdk8:
  stage: build
  script:
    - echo "=============== 开始编译打包任务 ==============="
    - mvn clean package -Dmaven.test.skip=true
    - mkdir -p /mydata/scs/project/auth
    - mkdir -p /mydata/scs/project/gateway
    - mkdir -p /mydata/scs/project/system
    - mkdir -p /mydata/scs/project/cms
    - mkdir -p /mydata/scs/project/file
    - cp -r scs-auth/target/scs-auth.jar  Dockerfile /mydata/scs/project/auth/
    - cp -r scs-gateway/target/scs-gateway.jar  Dockerfile /mydata/scs/project/gateway/
    - cp -r scs-modules/scs-cms/target/scs-modules-cms.jar  Dockerfile /mydata/scs/project/cms/
    - cp -r scs-modules/scs-file/target/scs-modules-file.jar  Dockerfile /mydata/scs/project/file/
    - cp -r scs-modules/scs-system/target/scs-modules-system.jar  Dockerfile /mydata/scs/project/system/
  artifacts:
    paths:
      - build/
  only:
    - master #当有代码合到主干时触发这个job
  tags:
    - default
  image: maven:3.3.9-jdk-8


deploy:jdk8:
  stage: deploy
  image: docker:20.10.15  #目的是为了在docker环境下的runner能执行docker命令
  script:
    - docker ps -a|grep $AUTH_CONTAINER &&  docker stop $AUTH_CONTAINER && docker rm $AUTH_CONTAINER || echo "not exist"
    - docker ps -a|grep $GATEWAY_CONTAINER &&  docker stop $GATEWAY_CONTAINER && docker rm $GATEWAY_CONTAINER || echo "not exist"
    - docker ps -a|grep $SYSTEM_CONTAINER &&  docker stop $SYSTEM_CONTAINER && docker rm $SYSTEM_CONTAINER || echo "not exist"
    - docker ps -a|grep $CMS_CONTAINER &&  docker stop $CMS_CONTAINER && docker rm $CMS_CONTAINER || echo "not exist"
    - docker ps -a|grep $FILE_CONTAINER &&  docker stop $FILE_CONTAINER && docker rm $FILE_CONTAINER || echo "not exist"
    - docker images |grep  $AUTH_CONTAINER && docker rmi -f $AUTH_CONTAINER || echo  "not exist"
    - docker images |grep  $GATEWAY_CONTAINER && docker rmi -f $GATEWAY_CONTAINER || echo  "not exist"
    - docker images |grep  $SYSTEM_CONTAINER && docker rmi -f $SYSTEM_CONTAINER || echo  "not exist"
    - docker images |grep  $CMS_CONTAINER && docker rmi -f $CMS_CONTAINER || echo  "not exist"
    - docker images |grep  $FILE_CONTAINER && docker rmi -f $FILE_CONTAINER || echo  "not exist"
    - docker build --build-arg JAR_FILE=scs-auth.jar -t $AUTH_CONTAINER  /mydata/scs/project/auth
    - docker build --build-arg JAR_FILE=scs-gateway.jar -t $GATEWAY_CONTAINER  /mydata/scs/project/gateway
    - docker build --build-arg JAR_FILE=scs-modules-system.jar -t $SYSTEM_CONTAINER  /mydata/scs/project/system
    - docker build --build-arg JAR_FILE=scs-modules-cms.jar -t $CMS_CONTAINER  /mydata/scs/project/cms
    - docker build --build-arg JAR_FILE=scs-modules-file.jar -t $FILE_CONTAINER  /mydata/scs/project/file
    - docker run -it -d --name $AUTH_CONTAINER -p $AUTH_PORT:$AUTH_PORT $AUTH_IMAGE
    - docker run -it -d --name $GATEWAY_CONTAINER -p $GATEWAY_PORT:$GATEWAY_PORT $GATEWAY_IMAGE
    - docker run -it -d --name $SYSTEM_CONTAINER -p $SYSTEM_PORT:$SYSTEM_PORT $SYSTEM_IMAGE
    - docker run -it -d --name $CMS_CONTAINER -p $CMS_PORT:$CMS_PORT $CMS_IMAGE
    - docker run -it -d --name $FILE_CONTAINER -p $FILE_PORT:$FILE_PORT $FILE_IMAGE
  only:
    - master
  tags:
    - default

2.Dockerfile

FROM primetoninc/jdk:1.8
ARG JAR_FILE
MAINTAINER   example@qq.com
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

注意:在gitlab中需要分配项目到指定的runner下才能执行cicd功能,并勾选图中的两项,如下图所示:

在新建项目时,时常会忘记去给新建的项目分配指定的runner,所以导致新建项目无法执行cicd功能,会出现这样的提示:

此作业已阻塞,因为您未分配任何具备这些标签的可用Runner: default
如下图所示:

3.结果:
最后的结果是我在docker上运行了七个容器,gitlab和gitlab-runner是常驻的,每当项目更新到主干的时候,会将docker里的 web容器stop跟rm,然后重新制作镜像并运行


 上一篇
Docker安装禅道并配置smtp邮件通知 Docker安装禅道并配置smtp邮件通知
禅道开源项目管理软件是一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、 组织管理和事务管理于一体,是一款专业的研发项目管理软件,完整地覆盖了项目管理的核心流程。
2023-08-11
下一篇 
使用Docker在Centos7上搭建gitlab服务器 使用Docker在Centos7上搭建gitlab服务器
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。
2022-06-10
  目录