话不多说,直接开撸
gitlab-runner 安装
如果没有安装docker的,先安装docker,yum安装docker如下(自定义安装 docker-ce 可参考我的另一篇博客 Centos 7 安装 docker & docker-compose)
yum -y install docker
拉取 gitlab-runner 镜像
docker pull gitlab/gitlab-runner
如果拉去镜像报错 Error response from daemon
配置阿里云镜像加速器
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l3go4y6y.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
启动 gitlab-runner
docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
gitlab-runner register 注册
方式一
在docker容器里执行 gitlab-runner register 注册命令:
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
然后根据提示输入:
1、gitlab地址(如下图)
2、token(如下图)
3、描述
4、gitlab-ci tags (即gitlab-ci文件的stage的tag)
5、选择执行gitlab-runner的执行程序,如果选docker,则继续下一步
6、如果选择docker作为执行程序,那要定义一个默认镜像的名称:alpine:laster
(注册完成)
如果注册失败,docker logs 报错如下
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
解决办法:
进入容器内部
docker exec -it 容器id /bin/bash
新建 config.toml 文件
touch /etc/gitlab-runner/config.toml
退出容器重新注册即可。
方式二
注册脚本,替换对应的参数的值,比如url和token等
docker run -it --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \--non-interactive \--executor "docker" \--docker-privileged \--docker-image docker:latest \--url "https://gitlab.com/" \--registration-token "2xAmgi-WmzWh9evSHgrx" \--description "package-runner" \--tag-list "mvn-package" \--run-untagged="true" \--locked="false" \--access-level="not_protected";docker run -it --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \--non-interactive \--executor "docker" \--docker-privileged \--docker-image docker:latest \--url "https://gitlab.com/" \--registration-token "2xAmgi-WmzWh9evSHgrx" \--description "build-runner" \--tag-list "build" \--run-untagged="true" \--locked="false" \--access-level="not_protected";docker run -it --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \--non-interactive \--executor "docker" \--docker-privileged \--docker-image docker:latest \--url "https://gitlab.com/" \--registration-token "2xAmgi-WmzWh9evSHgrx" \--description "deploy-runner" \--tag-list "deploy" \--run-untagged="true" \--locked="false" \--access-level="not_protected";
修改Runner配置文件
vim /srv/gitlab-runner/config/config.toml
找到volumes配置,修改为如下,分别是挂载了宿主机的docker和配置Maven的缓存,提高效率
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/data/.m2/:/.m2/"]
在volumes配置下方增加一行配置,防止Runner重复拉取镜像
pull_policy = "if-not-present"
重启Runner
创建SpringBoot项目测试CICD
在项目根目录创建个Dockerfile
FROM openjdk:8-jdk
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
项目根目录创建.gitlab-ci.yml文件
# 因为我们Runner执行器设置为docker, 所以这里需要指定docker的版本
image: docker:stablevariables:MAVEN_OPTS: "-Dmaven.repo.local=/.m2"stages:- package- build- deploy# 打包
package:stage: package# 打包用到了maven, 所有需要拉取maven镜像, 这是我自己构建的阿里云maven私服的maven镜像image: registry.cn-hangzhou.aliyuncs.com/sanchar/maven:1.0tags:- mvn-packagescript:- echo "=============== mvn package ==============="- mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true# 只作用在master分支only:- master# 这里可以将maven 打包好的文件传递给下一个 stage ,然后下一步的docker 就可以根据 这个 jar 包 和Dockerfile 构建镜像artifacts:# 指定下过期时间和路径expire_in: 1 dayspaths:- target/*.jarbuild:stage: buildscript:- echo "=============== docker build image ==============="- docker build -t registry.cn-hangzhou.aliyuncs.com/sanchar/springboot-ci-cd-demo:1.0 .- docker login --username 阿里云镜像仓库用户名 --password 阿里云镜像仓库密码 registry.cn-hangzhou.aliyuncs.com- docker push registry.cn-hangzhou.aliyuncs.com/sanchar/springboot-ci-cd-demo:1.0only:- mastertags:- builddeploy:stage: deployscript:- echo "=============== deploy ==============="- docker run -d --name my-test -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/sanchar/springboot-ci-cd-demo:1.0only:- mastertags:- deploy
提交到仓库的master分支后,会自动执行CICD,第一次会比较慢,因为要拉取一些镜像和下载目前本地库没有的jar包