【gitlab】gitlabrunner部署
1、下载镜像
docker pull gitlab/gitlab-runner:latest
2、启动gitrunner容器
docker run -d --name gitlab-runner --restart always \
-v /root/gitrunner/config:/etc/gitlab-runner \ ///gitlab-runner的配置目录,挂载在宿主机上方便修改,里面有config.toml配置文件
-v /var/run/docker.sock:/var/run/docker.sock \
-v /localcache/mavenrepo:/root/.m2/ \
-v /root/gitbook/books:/buildres \
gitlab/gitlab-runner:latest
进入容器:把docker镜像库的ca.crt签名根证书挂到系统信任类库中,不然里面docker login 或者 pull 都提示证书问题:
解决ssl客户端证书验证的问题:
sudo cp ca.crt[这个证书可以在gitrunner启动是 挂载到容器上去] /usr/local/share/ca-certificates/
sudo update-ca-certificates
3、注册gitlab-runner的执行器到gitlab上
gitlab-runner会负责不断轮训gitlab的任务队列,发现任务就开启执行器开始完成任务
注册方法:
a: 进入gitlab,项目或者项目组 然后创建一个runner,获取页面提供的待token的指令,然后进入上面启动的gitrunner容器。执行指令gitlab-runner register --url http://gitlab.example.com/ --token t0k3nxxxxx
b: 可以注册shell docker k8s类型的执行器
4、查看配置config.toml配置文件
这个配置文件是执行器注册时生成的
格式例子如下:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "6e216efd6d37"
url = "https://47.xx.xx.22/gitlab"
token = "glrt-PQzw9H8PTfrx51zeQM38"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3] //这个可以去掉,没有这种分布式缓存的话,也可以自己安装minio然后配置
[runners.cache.gcs] //这个可以去掉
[runners.cache.azure] //这个可以去掉
[runners.docker]
tls_verify = false
image = "47.xx.xx.xx:444/base/docker:latest" ///这个是一个配置的全局镜像,可以在.gitlab-ci.yml文件中覆盖
privileged = false //启动的docker不是特权模式
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false //启动缓存
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/root/gitbook/books:/buildres","/cache","/root/.kube/config:/root/.kube/config","/localcache/mavenrepo:/root/.m2/"]
///localcache/mavenrepo:/root/.m2/ 如果是maven执行器的话,就缓存下载的jar,避免每次都去下载
//volumes 配置了docker容器执行器启动时挂载的宿主机的目录
///var/run/docker.sock:/var/run/docker.sock ,配置了启动的容器可以链接到宿主机的docker-daemon进行通信,也就是说gitrunner启动的docker容器
//执行器都是和gitrunner在同一个宿主机上的。 这样就不用docker in docker模式 完成后面的拉取进行、构建镜像等操作了
cache 配置作用就是在启动docker容器中有一个根目录是/cache,同时docker会/var/lib/docker/volume/创建一个匿名卷,然后关联到/cache
//存储缓存的文件
pull_policy = ["if-not-present"] ///镜像有的话就不下载
shm_size = 0
5、缓存目录
上面的/cache 缓存目录生成的匿名卷就是在这里,一个执行器+项目 生成一个目录
/var/lib/docker/volumes:
runner-{runnerid}-projects-{projectid}-concurrent-{num}-cache-3c3f060a0374fc8bc39395164f415a70|c33bcaa1fd2c77edfc3893b41966cea
以3c3f060a0374fc8bc39395164f415a70结尾的文件夹中存放的就是缓存文件
缓存文件都是最后会被压缩成cache.zip文件。
以c33bcaa1fd2c77edfc3893b41966cea8 结尾的文件夹中存放的是代码源文件
6、缓存使用说明
1、首先gitrunner要配置缓存使用
2、在job是配置缓存,如:
stages:
- build
- pushimage
- deployk8s
//所有的job都是自动在项目代码仓库目录,每个job执行时,就会把工程代码load工作目录
build-job:
stage: build
image: 47.xx.xx.xx:444/base/maven:3.8.1-jdk-8
script:
- mvn -version
- mvn clean package -Dmaven.test.skip=true
tags:
- docker_runner
cache:
key: $CACHE_KEY ///这个key的作用是,在/cache目录下创建这个含这个key相关的目录,区分下避免不同job的缓存覆盖了
paths:
- target/*.jar //意思就是缓存target下面的所有jar,打包压缩成cache.zip文件,传到对应的缓存目录,如果设置了分布式缓存的话还会上传到对应的服务器,不然就是本地,就是在docker的volume上,就是上面说明的目录
policy: push ///缓存策略就是上传,也有pull就是拉取
only:
- main
# artifacts: //配置工件,这个工件会自动上传到gitlab上,在页面可以下载,可以设置和这个工件的有效期
# paths:
# - target/*.jar
pushimage-job:
stage: pushimage
image: 47.xx.xx.xx:444/base/docker:latest
before_script:
- ls /
script:
- docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD $HARBOR_URL
- mv ./target/*.jar ./
- ls
- docker build -t 47.109.77.22:444/base/rocketmqui:latest .
- docker push 47.109.77.22:444/base/rocketmqui:latest
cache:
key: $CACHE_KEY //这个key要和上一个job的key的值一致才行,不然不会自动解压缓存文件
paths:
- target/ ///这里就会使用之前job的缓存,上job上传到本地目录的cache.zip会自动解压到当前工作目录。就是target/*
policy: pull
tags:
- docker_runner
1、总结就是:
gitlab-cicd的缓存就是: 每个job会创建缓存,然后把缓存的文件打包压缩传到特定的目录,然后下一个job 使用了cache的话就自动下载上个job的缓存 然后解压,就可以使用了。
使用本地目录作为缓存的话,如果并行job的话可能就会产生覆盖的文件。
使用minio 解决分布式缓存的问题: https://blog.51cto.com/u_15098009/2612611