gitlab-runner配置文件config.toml文件中有一个选项
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "Docker"
url = "http://gitlab.example.com/"
token = "Xs_S47aq6BoJgWjWvHfj"
executor = "docker" # docker命令
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
extra_hosts = ["gitlab.example.com:192.168.80.201", "jdd.io:192.168.2.162"] # 添加额外的域名解析,详看gitlab和gitlab-runner的一个小坑:https://www.cnblogs.com/sanduzxcvbnm/p/14668269.html
image = "sanduzxcvbnm/jre:1.8.275" # 注意,是这个选项
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache","/run/docker.sock:/run/docker.sock"]
shm_size = 0
docker-privileged=true
docker-pull-policy="if-not-present"
跟.gitlab-ci.yml
文件中的一个选项:
image: sanduzxcvbnm/jre:1.8.275
起到的作用是一样的,但是.gitlab-ci.yml
文件中的优先级高
这个的作用是表示gitlab-runner使用docekr命令使用这个镜像来操作.gitlab-ci.yml
文件中的其他命令。
所以,可以事先通过alpine来构建一个包含所需要软件的基础镜像,比如需要的软件有jdk1.8,maven,docker等。
这样一来就不用执行不同的命令拉取不同的镜像了
使用的Dockerfile文件如下
Dockerfile_alpine文件内容如下:
FROM alpine:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","openjdk8"]
RUN ["apk","add","maven"]
COPY settings.xml /usr/share/java/maven-3/conf/settings.xml # 这个是替换成国内的阿里云镜像,需要事先准备好该文件放在当前目录下
RUN ["apk","add","docker"]
中间涉及到时间文件,制作镜像,打标签等
其他步骤参考文章重构基础docker镜像:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html
构建好这样一个基础镜像后,还得先推送到dockerhub官方网站上。
# 登录,后面不加地址
docker login
# 推送
docker push sanduzxcvbnm/jre:1.8.275
因为gitlan-runner默认是从这个网站拉取所需要的镜像的。
然后具体看.gitlab-ci.yml
文件中的用法
image: sanduzxcvbnm/jre:1.8.275
variables:
DOCKER_DRIVER: overlay2
#services:
# - docker:dind
stages:
# - test
- package
- build
# - release
#test_step:
# tags:
# - maven
# script:
# - java -version
# - mvn -version
# - docker --version
maven_step:
tags:
- maven
stage: package
script:
- mvn clean package -Dmaven.test.skip=true
artifacts:
paths:
- target/*.jar
only:
- develop
docker_step:
tags:
- docker
stage: build
script:
- export TAG=`date "+%Y%m%d%H%M%S"` # 获取镜像标签
- docker login -u admin -p admin123 jdd.io # 登录私有仓库
- docker build -t jdd.io/demo:$TAG . # 构造镜像
- docker push jdd.io/demo:$TAG # 推送到私有仓库
- echo $TAG
- curl -X PUT -H "content-type:application/json" -H "Cookie:KuboardUsername=admin;KuboardAccessKey=4jz66jfsa6t6.5wjsz733f73p5fei4h4fpbmnfp72ytbc" http://192.168.2.163:10080/kuboard-api/cluster/develop/kind/CICDApi/admin/resource/updateImageTag -d '{"kind":"deployments","namespace":"test","name":"web-spring","images":{"jdd.io/demo":"jdd.io/demo:'$TAG'"}}' # 给k8s所在发送post请求,更新pod中容器使用的镜像版本
only:
- develop
curl命令是从kuboard界面中创建accesskey后获取到的
复制出来的命令需要注意的地方:
-H
选项是表示定义请求头,注入cookie,复制出来的参数中冒号后面有空格,但是在.gitlab-ci.yml
文件script用法中,不能有冒号后的空格,需要去掉
比如-H "content-type: application/json"
修改成-H "content-type:application/json"
去掉冒号后的空格- 复制出来的地址是加的有双引号,具体使用的时候需要去掉地址的双引号