使用Gitlab CICD部署项目

使用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 分支。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值