gitlab CI/CD
GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。
GitLab-Runner 是什么呢,它就是CI\CD 干活的那个人,它可以在不同服务器,也可以在任何地方,只要你能通知到它。
1、docker hub 官方找搜索 gitlab/gitlab-runner
我选择了一个 gitlab/gitlab-runner:alpine3.15-bleeding
2、创建文件 docker-gitlab-runner.yml
,这个文件名可以随便取名,只要你能认识,
编写内容
services:
gitlab-runner:
image: gitlab/gitlab-runner:alpine3.15-bleeding
container_name: gitlab-runner # 容器名称
restart: always
volumes:
- "./gitlab_runner:/etc/gitlab-runner" #挂在配置文件在当前目录
- "/var/run/docker.sock:/var/run/docker.sock" #这个docker.sock 一定要挂在宿主机,var/run下 不然不能通讯
3、 运行 docker-compose -f docker-gitlab-runner.yml up -d
这个时候你查看 日志 会有一个错误 说是找不到 config.toml这个配置文件
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
这个暂时不用管它,待会儿注册了,就有这个文件了,注册到gitlab前,先准备两个东西
登录进入你的gitlab
项目 - 设置 - CI/CD - Runner 然后展开Runner
这里2、3步骤,在注册runner的时候需要用
4、执行以下命令,第一个gitlab-runner是你的容器名称(根据实际你的容器名称为准,如果你有指定参数:container_name 后面哪个就是你名称,没有的话,可以通过docker ps 查看),第二个gitlab-runner是容器中的默认授权用户,一般你启动没有特殊处理就默认输入这个。
docker exec -it gitlab-runner gitlab-runner register
接下来会让我们输入一些参数
完成之后 你会看到 这句话,
Runner registered successfully. Feel free to start it, but if it’s running already the config should be automatically reloaded!
4、在 项目 - 设置 - CI/CD - Runner 你就可以看到已经注册了一个runner 了,
5、这个时候你的CI/CD 管道就搭建好了, 你脑海中有几个构建流程 比如: 编译-打包成img-推送到你的私有habor -发布运行等等,可能有无数个环节,一个runner能完成吗? 当然是可以的,闲的蛋疼你也可以多整几个,也都是可以的。应为指定用哪个runner 是在.gitlab-ci.yml 里面指定的。
我们先以一个 简单的spring boot 程序为列子 做一个简单的
问题一: gitlab runner 是在docker 容器里执行, 打包肯定要用maven 用docker镜像岂不是默认都是国外拉取,最主要有些jar包可能还没有,可能是我们内部jar
解决方案 :在gitlab-ci文件中添加下面配置,可以创建一个,其实也就是把maven文件写在里面了
before_script:
- rm -rf /root/.m2/settings.xml
- echo -e "<?xml version=\""1.0\"" encoding=\""UTF-8\""?><settings xmlns=\""http://maven.apache.org/SETTINGS/1.0.0\"" xmlns:xsi=\""http://www.w3.org/2001/XMLSchema-instance\"" xsi:schemaLocation=\""http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd\""><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>" > /root/.m2/settings.xml
问题2:拉取的jar 包,都是存放在docker容器里,每次重启岂不是都没了,从新拉取,编译会变得很慢
解决方案:docker-gitlab-runner.yml 里面我们把配置文件 映射到宿主机 当前目录下gitlab_runner 文件夹里,找到打开,里面有一个配置文件 config.toml
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "build_runner" #我们之前指定的名称
url = "http://192.168.100.51:8088/"
token = "f4ce8524f47657a3abeb226bd7dc7c"
executor = "docker" #执行器,也是我们注册的时候选择的
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "latest" # 我们前面注册指定的docker 版本,这里可以更改 好像只有docker:latest、docker:dind 和 docker:git
privileged = fasle
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/.m2:/root/.m2"] #把容器内部的sock 映射到外面, 主要的还是 root/.m2 maven.xml,包括repository
shm_size = 0
pull_policy = "if-not-present" #images 依赖拉取策略:如果本地有就不检查,如果没有就拉取,我们可能用到的 maven,node来编译工具拉取一次就行了
.m2 文件都挂在出来了,在把自己的maven.xml上传进去,问题1也一并解决了
6、在gitlab 拉取一个项目在根目录创建一个 .gitlab-ci.yml
variables: #定义变量 用法 $jar_name (gilab 里面- ci/cd-变量 也可以设置 系统变量,这里面也能用,一般用户账号密码之类的)
jar_name: ttbgz_test.jar
jdk_image: openjdk:8-jre-slim
app_images_name: ttbgz_test:v0.0.1
#定义执行顺讯
stages:
- build #编译
- package #打包 image
- deploy #推送 harbor
- start #启动
job1:
image: maven:3.8.4-openjdk-8 #openjdk:8u322-slim-bullseye
stage: build
script:
- mvn clean package -Dmaven.test.skip=true
tags:
- maven #哪个执行器
artifacts:
paths:
- target/$jar_name
job2:
stage: package
image: docker:latest #依赖基础镜像 docker:git 是包含了 git 命令的 docker:latest,方便 CI 时使用 Git。
tags:
- docker #哪个执行器
script:
- echo package image
- docker build -t $app_images_name . # 构建镜像
- docker login -u $HARBOR_USERNAME -p $HARBOR_PWD $HARBOR_URL # 登录镜像仓库
# docker tag SOURCE_IMAGE[:TAG] 192.168.100.51:8080/ttbgz/REPOSITORY[:TAG]
- docker tag $app_images_name ttbgz/$app_images_name
- docker push 192.168.100.51:8080/ttbgz/$app_images_name # 推送镜像
- docker rmi $app_images_name # 删除本地镜像
7、Dockerfile
#指定待扩展的父级镜像(基础镜像)。除了
FROM openjdk:8-jre-slim
#作者
MAINTAINER ttbgz
#RUN:用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来对的指令会在新的镜像上继续执行。RUN 语句有两种形式:
#RUN yum update:是在/bin/sh环境中执行的指令的命令
#RUN ["yum", "update"]:直接使用系统调用exec来执行行。
#RUN yum update && yum install nginx:使用&&符号将多条命令连接在同一条RUN语句中。
#设置target 为工作目录
#用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开
EXPOSE 8081
# 将targer目录下的jar包复制到docker容器/home/springboot目录下面目录下面
COPY /target/ttbgz_test.jar /home/springboot/ttbgz_test.jar
#通过shell 命令启动
ENTRYPOINT java ${JAVA_OPTS} -jar /home/springboot/ttbgz_test.jar
这里只演示了打包,已经打成镜像,上传到 自己的harbor