Bootstrap

springboot项目结合gitlab的cicd实现自动化部署

结合自己的spring boot项目来总结一下实现服务器实现Java项目通过容器化技术实现自动构建部署的过程。

在学习过程中如果对docker基本命令以及Linux命令不太熟悉的小伙伴可以先先了解一下这块的技术。

一、安装GitLab

因为通过gitlab得CI CD脚本结合容器化技术来构建部署项目,所以需要先拉取gitlab镜像

docker run -d -p 2443:443 -p 5678:80 -p 2222:22 --name gitlab --restart always -v/srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /src/gitlab/data:/var/opt/gitlab docker.io/gitlab/gitlab-ce
  • docker run 启动一个容器
  • -d 就是让容器在后台运行
  • -p 用来设置相当于是5678映射到80端口,我这边是怕80端口被占用 所有新开了22端口
  • name 为容器指定一个名称 如果没有的话服务器会从dockerhub里面去拉
  • restart 是重启
  • -v是宿主机的目录挂载到容器里面

二、修改配置文件

修改gitlab.yml配置文件

vim /src/gitlab/data/gitlab-rails/etc/gitlab.yml

找到如下配置,修改host为你服务的IP或者域名(不能加http://),修改完毕后保存退出

gitlab:
    # 这里要将host设置为你gitlab所在的服务器IP或者域名
    host: 172.20.9.3
    port: 80
    https: false

修改gitlab.rb文件

vim /srv/gitlab/config/gitlab.rb

找到external_url,默认是被注释的,要打开,并填写暴露出去的http://ip:portIP一定要和gitlab.yml文件配置的相同,port为你启动时指定的,我们这里使用5678作为端口;最后加上ssh协议下使用的IP和端口(这里的端口是你启动时指定的,我们这里是2222),最后保存并退出

external_url 'http://172.20.9.3:5678'
gitlab_rails['gitlab_ssh_host'] = '172.20.9.3'
gitlab_rails['gitlab_shell_ssh_host'] = '2222'

停止并移除之前启动的gitlab

停止并移除之前启动的GitLab容器

docker rm -f gitlab

重新启动gitlab
这里要将容器端口改为5678

docker run -d -p 2443:443 -p 5678:5678 -p 2222:22 --name gitlab --restart always -v/srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /src/gitlab/data:/var/opt/gitlab docker.io/gitlab/gitlab-ce

等待一段时间,就可以访问了,首次需要更改root账户的密码

二、安装Gitlab-Runner
可以在项目中或者项目组中以及全局配置中找到Runner配置的地方,全局配置仅限GgitLab的管理员账号才有权限

项目中
项目中配置的Runner只对当前项目有效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysiJfokZ-1625797615904)(https://ibb.co/9gFqtZK)]

这时候我们展开,就能看到这个设置Runner的区域
image.png
项目组中
只对这个项目组内的所有项目生效
image.png

这个和在项目中一样,都需要展开,往下拉就能看到手动设置Runner的区域
全局配置
所有项目都可以一起使用
image.png

image.png

全局配置在右边就能直接看到手动设置Runner的区域
1、拉取Runner镜像并启动

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

2、进入Runner容器内

docker exec -it gitlab-runner bash

3、运行以下命令

gitlab-runner register

输入Gitlab实例的地址
地址是你手动设置Runner区域里面的URL

> Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://xxx(你的gitlba地址)

输入token
token是你手动设置Runner区域里面的令牌

> Please enter the gitlab-ci token for this runner
xxx(找到你的项目setting里面的CI/CD)

输入Runner的描述

> Please enter the gitlab-ci description for this runner
[hostname] my-runner(对runner的描述)

输入与Runner关联的标签
标签是为了让后期在CI脚本中指定选择某个或者多个Runner,这里我们设置他的标签为test,你们可以设置其他的

> Please enter the gitlab-ci tags for this runner (comma separated):
test(触发runer的tag,一定ci里面要用到)

输入Runner的执行器
由于我们都是基于Docker,所以这里选择执行器为Docker

> Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

设置执行器的版本

> Please enter the Docker image (eg. ruby:2.1):
alpine:latest

退出容器

exit

通过以上命令后,就创建成功runner啦,这时候我们去GitLab中我们创建Runner的区域刷新就能看到了

image.png
4、修改Runner配置文件
vim /srv/gitlab-runner/config/config.toml
找到volumes配置,修改结果为如下,分别是挂载了宿主机dockersock文件和Maven的缓存,减少拉取Jar包的时间消耗,其中=="/data/.m2/😕.m2/"这块为Maven的Jar包存放地址,左边为宿主机目录,右边为容器内的Jar包存储路径,这个需要根据自己使用的Maven==镜像而定

提示:如何构建Maven镜像请翻到文章末尾

volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/data/.m2/:/.m2/"]

volumes配置下方增加一行配置,防止Runner重复拉取镜像

pull_policy = "if-not-present"

最后重启Runner

docker restart gitlab-runner

三、创建SpringBoot项目测试CICD
首先创建一个基础的SpringBoot项目,在项目里面新增==.gitlab-ci.yml文件==

1、在项目根目录创建个Dockerfile

FROM openjdk:8-jdk
COPY target/*.jar ci-demo.jar
EXPOSE 7777
ENTRYPOINT ["java","-jar","ci-demo.jar"]

2、项目根目录创建gitlab-ci.yml文件
下面脚本中出现了172.20.9.3:5001/root/maven:latest镜像,这块是我们手动构建的Maven镜像,如何构建请前往文章第四部分拓展知识查看

# 全局脚本,会运行在各个阶段的script前,如果某个阶段里面存在before_script,那么以那个阶段里的为主
before_script:
  # 这里定义了打包成功后的Docker镜像名称,每一次提交代码后构建成功的镜像名称都是唯一的
  - export IMAGE_FULL_NAME=${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHA}

# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
  - compile
  - build
  - run
# 定义全局变量
variables:
  PROJECT: "ci-demo"
  # 这里定义了Maven的jar包存放地址,与我们构建maven私服的时候设置的存放地址一致
  MAVEN_REPO: "/.m2"
编译:
  # 当前阶段的执行镜像,这是我们自己构建的镜像
  image: 172.20.9.3:5001/root/maven:latest
  # 属于上面定义的哪一个阶段
  stage: compile
  # 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段
  allow_failure: false
  # 只在哪个分支生效
  only:
    - master
  # 这里就是你要选择哪个runner来执行了,填写我们创建runner时候指定的标签
  tags:
    - test
  # 运行脚本
  script:
    - mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
  # 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间
  artifacts:
    name: $PROJECT
    expire_in: 7 days
    paths:
      - target/*.jar
构建镜像:
  image: docker:stable
  stage: build
  script:
    # 这里的变量会自动获取你当前推送代码的gitlab用户和密码以及仓库地址
    - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
    # 这里的变量就是我们全局配置定义的了
    - docker build -t $IMAGE_FULL_NAME .
    - docker push $IMAGE_FULL_NAME
    - rm -rf target
    - docker rmi $IMAGE_FULL_NAME
  only:
    - master
  tags:
    - test
运行:
  image: docker:stable
  stage: run
  script:
    - docker run -d --name $PROJECT -p 7777:7777 $IMAGE_FULL_NAME
  only:
    - master
  tags:
    - test

3、将项目提交到Gitlab仓库即可
编写好脚本后,提交代码到master分支,因为我们在CI脚本里只指定了master分支生效,第一次CI执行的时候会比较慢,因为需要拉取基础镜像和jar包
image.png

CI脚本执行完毕后,我们可以去runner所在服务器进行查看容器是否启动成功,由于我们项目设置了一个接口,所以我们直接尝试访问接口地址看看是不是正常返回,如果返回了就是执行成功了,没有正常返回的话,就需要自己通过

docker logs -f

<容器名>查看日志了
image.png
建议:最好使用内网环境的基础镜像,否则可能导致CI执行时间过长,比如CI脚本中运行阶段的基础镜像docker:stable还有Dockerfile文件里的基础镜像JDK。拉取时间的长短受服务器性能和网络影响。

;