使用Gitlab CI/CD功能在本地部署 Spring Boot 项目
centos部署
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | bash
sudo yum -y install gitlab-ee
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum install curl openssh-server openssh-clients cronie policycoreutils-python git gitlab-ce -y
sudo yum install curl openssh-server openssh-clients cronie policycoreutils-python git gitlab-ce -y
vim /etc/gitlab/gitlab.rb
sudo vim /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo vim /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
sudo vim /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo /etc/gitlab/initial_root_password
cat /etc/gitlab/initial_root_password
sudo cat /etc/gitlab/initial_root_password
sudo gitlab-ctl tail
cat /etc/gitlab/initial_root_password
Docker安装Gitlab
# 拉取镜像
docker pull gitlab/gitlab-ce
# 创建挂载目录
mkdir -p /opt/gitlab/{data,etc,log}
# 启动容器
docker run -d -p 8090:80 -p 8443:443 -p 8222:22 --name gitlab --restart always --privileged=true -v /opt/gitlab/etc:/etc/gitlab -v /opt/gitlab/log:/var/log/gitlab -v /opt/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df12108bb81d gitlab/gitlab-ce:latest "/assets/wrapper" 23 minutes ago Up 10 minutes (healthy) 0.0.0.0:8222->22/tcp, 0.0.0.0:8090->80/tcp, 0.0.0.0:8443->443/tcp gitlab
# 端口说明
# 80和443端口是gitlab中nginx使用的,22端口是gitlab中ssh使用的,均是默认端口
在浏览器中输入如下地址:http://宿主机ip:8090
先设置root用户密码(至少8位)
root/12345678
创建项目后显示的项目git地址,使用的是容器id的信息,而不是宿主机的信息
# 直接修改宿主机上的配置文件,启动容器时挂载了容器数据卷到宿主机上
# vim /opt/gitlab/etc/gitlab.rb
# external_url 'http://192.168.0.253' # 若启动容器时映射的没有使用默认80端口,则地址后面还需要加上端口,这个是通过web页面访问gitlab的地址,暂不修改这个
# 使用ssh的方式clone项目,默认使用的是22端口,因为是通过宿主机访问的,使用的端口是8222,所以需要修改这个,详看下面的图片,使用SSH克隆,地址中需要加上这个端口
gitlab_rails["gitlab_shell_ssh_port"] = 8222
# vim /opt/gitlab/data/gitlab-rails/etc/gitlab.yml # 通过HTTP方式clone项目,默认使用的是80端口,因为是通过宿主机访问的,使用的端口是8090,所以需要修改这个,详看下面的图片,使用HTTP克隆,地址中需要加上这个端口
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 192.168.0.253 # 默认的是容器id,这里修改成宿主机IP
port: 8090 # 需要修改成通过宿主机访问的那个端口
https: false
# 登录进容器中,重新启动服务,而不是重新启动容器(重启容器的话端口还是80,不是修改后的8090),最终解决办法是修改external_url,后面也加上8090端口号
~ # docker exec -it gitlab gitlab-ctl restart
# 分开操作
~ # docker exec -it gitlab /bin/bash
root@79c266fad617:/# gitlab-ctl restart
注意: 需要修改gitlab.rb配置文件中的站点地址。这里指定的端口是8090(不是必须的)也就是需要将gitlab.rb配置的地址改成8090和external_url端口为8090。
为什么端口要改成一致的?如果不修改gitlab.rb中的站点地址则默认是80端口,这时候做external_url的时候例如将80映射到8090,此时对外访问8090可以打开gitlab页面,但是下载代码的时候会发现地址为80端口,导致下载代码失败。所以这里强调一致哦。
Docker安装Gitlab-runner
# 拉取镜像
docker pull gitlab/gitlab-runner:latest
# 创建挂载目录
mkdir -p /opt/gitlab-runner/config
# 启动容器
docker run -d --name gitlab-runner --restart always -v /opt/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
如何获取token
进入到项目中的设置,找到CI/CD,Runner ,图片这个token仅供途径展示
进入runner容器,注册到gitlab上
汇总操作命令:
docker exec -it gitlab-runner gitlab-runner register -n \
--url http://222.186.36.121:8090 \
--registration-token Dvjh3F8DXGksyP6E8GpM \ # token需要根据实际情况进行修改
--tag-list=dockersock,docker \
--description "dockersock" \
--docker-privileged=true \
--docker-pull-policy="if-not-present" \
--docker-image "docker:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /root/m2:/root/.m2 \
--executor docker
docker exec -it gitlab-runner gitlab-runner register -n \
--url http://222.186.36.121:8090 \
--registration-token Dvjh3F8DXGksyP6E8GpM \
--tag-list=dockersock,docker \
--description "dockersock" \
--docker-privileged=true \
--docker-pull-policy="if-not-present" \
--docker-image "docker:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /root/m2:/root/.m2 \
--executor docker
分步操作命令:
# 进入容器
docker exec -it gitlab-runner /bin/bash
# 运行以下注册命令
gitlab-runner register
# 输入Gitlab实例的地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://192.168.0.253:8090 # 端口采用默认的80,否则需要加上端口,比如 http://192.168.0.253:8090
# 输入token
Please enter the gitlab-ci token for this runner
tyXBwC8frbShS4yn3nE5
# 输入Runner的描述,后期可以手动修改
Please enter the gitlab-ci description for this runner
[hostname] my-runner
# 输入与Runner关联的标签,后期可以手动修改
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag
# 输入Ruuner的执行者
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
# 如果上面执行者为docker,需要你在后续项目根部的.gitlab-ci.yml中指定docker版本
通过以上命令后,就可以在gitlab中查看到了这个刚刚创建的runner
runner注册完毕之后,还需要修改一下runner的配置文件,实现runner与宿主机的数据挂载:
vim /opt/gitlab-runner/config/config.toml # 开头创建的宿主机挂载目录
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "my-runner"
url = "http://192.168.0.253:8090"
token = "tyXBwC8frbShS4yn3nE5"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock"]
shm_size = 0
说明:
1.不同的项目可以使用不同的gitlab-runner,根据实际情况再运行一个名称不一样的容器,并根据新项目的token注册就行了。
2.不同的项目还可以使用同一个gitlab-runner,只需要在注册的时候使用不同项目下的token就行了。
在Gitlab上创建项目
1.新建项目
2.选择springboot模板创建
3.创建项目
创建好项目后查看克隆的地址
我这边是根据前提条件来创建的,所以使用的克隆地址中会有端口号
4.添加本机ssh秘钥到项目设置中
5.本机克隆该项目到本机
使用git地址克隆
使用http地址克隆
项目修改
1.修改项目中自带的Dockerfile文件,具体内容如下
# 原先的内容
FROM maven:3-jdk-8-alpine
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mvn package
ENV PORT 5000
EXPOSE $PORT
CMD [ "sh", "-c", "mvn -Dserver.port=${PORT} spring-boot:run" ]
# 修改后的内容
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY /target/demo-0.0.1-SNAPSHOT.jar app.jar # 正常情况下target前面没有/,但是在这里需要有,不能省略,否则会报错。
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]
按正常情况下target前面没有/的报错信息
target前面加上/后可以正确执行
2.创建.gitlab-ci.yml文件,具体内容如下
image: docker:latest #1
variables: #2
DOCKER_DRIVER: overlay2
# DOCKER_HOST: tcp://192.168.0.253:2375 # docker host,本地可不写,
TAG: root/hello-spring:v0.1 # 生成的镜像名称
cache: #3
paths:
- .m2/repository
services: #4
- docker:dind
stages: #5
- package
- deploy
maven-package: #6
image: maven:3.5-jdk-8-alpine
tags:
- maven # 使用的gitlab-runner需要有这个标签
stage: package
script:
- mvn clean package -Dmaven.test.skip=true
artifacts:
paths:
- target/*.jar
build-master: #7
tags:
- docker # 使用的gitlab-runner需要有这个标签
stage: deploy
script:
- docker build -t $TAG . # 根据Dockerfile文件构建镜像
- if [ $(docker ps -aq --filter name= test) ]; then docker rm -f test;fi ## 有启动镜像删除
- docker rm -f test || true # 删除测试容器
- docker run -d --name test -p 5000:5000 $TAG # 运行容器,$TAG是开头设置的变量,表示的是镜像
only:
- master
说明:
1:需要用到的镜像
2:必须配置的一些环境变量。如果本地可不配置 DOCKER_HOST。作用是生成的docker镜像是在本机上还是在其他主机上
3:配置缓存,配置后,maven 下载的依赖可以被缓存起来,下次不需要重复去下载了。
4:配置需要用到的额外的服务。docker:dind,这个貌似是用于在 docker 中运行 docker 的一种东西,在项目的构建中需要。
5:stages,这是 Gitlab CI 中的概念,Stages 表示构建阶段,就是一些按序执行的流程,具体执行是依赖于 Jobs 的。在CI/CD流水线中可以看到
6:定义的 Jobs 之一,用于构建 jar 包。内部又引入 maven 镜像来处理,负责执行 package 这一流程。script 为具体执行的脚本。
7:定义的 Jobs 之一,用于构建 Docker 镜像。负责执行 deploy 这一流程。具体执行 build 和 run。only 节点表示只监控 master 分支。