docker安装gitlab和gitlab-runner并配置CI/CD持续化集成部署流程
一、docker安装gitlab
1.拉取gitlab镜像
docker pull gitlab/gitlab-ce
2.启动镜像
docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart=always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
-d:后台运行
-p:将容器内部端口向外映射
–name:命名容器名称
-v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
3.修改配置文件
vim /home/gitlab/config/gitlab.rb
修改以下配置,其中192.168.230.6为虚拟机ip,222为第二步中22对应映射端口
#配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.230.6'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.230.6'
# 此端口是run时22端口映射的222端口
gitlab_rails['gitlab_shell_ssh_port'] = 222
4.重启
docker restart gitlab
5.访问首页
5.1首页地址:192.168.230.6
5.2能正常访问后,查看root用户密码
cd /home/gitlab/config/
cat initial_root_password
5.3修改密码
点击右上角头像,选中preferences跳转后点击左侧profile选项。
二、docker安装gitlab-runner
1.下载镜像并启动
docker run -d --name gitlab-runner --restart always -v /home/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
2.进入gitlab-runner容器内
docker exec -it gitlab-runner bash
3.执行以下命令,注册gitlab-runner
gitlab-runner register
输入后还需要输入token,在gitlab中找到token
①输入Gitlab实例的地址
②输入token
③输入Runner的描述(可随便输入)
④输入与Runner关联的标签,标签是为了让后期在CI脚本中指定选择某个或者多个 Runner,这里我们设置他的标签为test,你们可以设置其他的
⑤流道的可选维护注意事项(不清楚,随便输入)
⑥输入Runner的执行器,由于我们都是基于Docker,所以这里选择执行器为Docker
⑦设置执行器的版本
4.修改配置文件
vim /home/gitlab-runner/config/config.toml
找到volumes配置,修改结果为如下,分别是挂载了宿主机docker的sock文件和Maven的缓存,减少拉取Jar包的时间消耗,其中"/data/.m2/😕.m2/"这块为Maven的Jar包存放地址,左边为宿主机目录,右边为容器内的Jar包存储路径,这个需要根据自己使用的Maven镜像而定
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/data/.m2/:/.m2/"]
在volumes配置下方增加一行配置,防止Runner重复拉取镜像
pull_policy = "if-not-present"
最后重启Runner
docker restart gitlab-runner
三、测试CI/CD
3.1编写.gitlab-ci.yml
# 全局脚本,会运行在各个阶段的script前,如果某个阶段里面存在before_script,那么以那个阶段里的为主
before_script:
# 这里定义了打包成功后的Docker镜像名称,每一次提交代码后构建成功的镜像名称都是唯一的
- echo "提交的标题CI_COMMIT_TITLE $CI_COMMIT_TITLE"
- echo "提交的作者CI_COMMIT_AUTHOR $CI_COMMIT_AUTHOR"
- echo "提交的分支名CI_COMMIT_BRANCH $CI_COMMIT_BRANCH"
- echo "提交的描述CI_COMMIT_DESCRIPTION $CI_COMMIT_DESCRIPTION"
- echo "完整的提交信息CI_COMMIT_MESSAGE $CI_COMMIT_MESSAGE"
- echo "项目的分支名或tag名CI_COMMIT_REF_NAME $CI_COMMIT_REF_NAME"
- echo "Repository中创建tags的标签CI_COMMIT_TAG $CI_COMMIT_TAG"
- echo "CI_REGISTRY_IMAGE $CI_REGISTRY_IMAGE"
- echo "CI_COMMIT_REF_SLUG $CI_COMMIT_REF_SLUG"
- echo "CI_COMMIT_SHA $CI_COMMIT_SHA"
# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
- compile
- build
- run
#workflow:
# rules:
# - if: $CI_COMMIT_MESSAGE =~ /^deploy:/
# - if: $CI_COMMIT_TAG
# 定义全局变量
variables:
PROJECT: "ci-demo"
# 这里定义了Maven的jar包存放地址,与我们构建maven私服的时候设置的存放地址一致
MAVEN_REPO: "/.m2"
compile1:
# 当前阶段的执行镜像,这是我们自己构建的镜像
image: openjdk:8
# 属于上面定义的哪一个阶段
stage: compile
#满足这个条件才会执行以下步骤,提交信息以 deploy: 开头。例如 deploy:更新代码
rules:
- if: '$CI_COMMIT_MESSAGE =~ /^deploy:*/'
# 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段
allow_failure: false
# 只在哪个分支生效
# only:
# - main
# 这里就是你要选择哪个runner来执行了,填写我们创建runner时候指定的标签
tags:
- test
# 运行脚本
script:
- source /etc/profile
- echo "开始执行compile1步骤了,CI_COMMIT_MESSAGE= $CI_COMMIT_MESSAGE "
# - mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
# 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间
artifacts:
name: $PROJECT
expire_in: 7 days
paths:
- target/*.jar
#可以定义多个
#compile2:
# image: 172.20.9.3:5001/root/maven:latest
# stage: compile
# allow_failure: false
# only:
# - main
# tags:
# - test
# script:
# - mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
# artifacts:
# name: $PROJECT
# expire_in: 7 days
# paths:
# - target/*.jar
#build1:
# image: docker:stable
# stage: build
# script:
# # 这里的变量会自动获取你当前推送代码的gitlab用户和密码以及仓库地址
# - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
# # 这里的变量就是我们全局配置定义的了
# - docker build -t $IMAGE_FULL_NAME .
# - docker push $IMAGE_FULL_NAME
# - rm -rf target
# - docker rmi $IMAGE_FULL_NAME
# only:
# - main
# tags:
# - test
#run1:
# image: docker:stable
# stage: run
# script:
# - CONTAINER_NAME=$(docker ps -aq --filter name=$PROJECT)
# - echo $CONTAINER_NAME
# - if [[ -n "$CONTAINER_NAME" ]]; then
# docker rm -f $CONTAINER_NAME;
# fi
## - docker run -d --name $PROJECT -p 7777:7777 $IMAGE_FULL_NAME
# only:
# - main
# tags:
# - test
.gitlab-ci.yml与pom.xml放在同级目录,以下文件内容为只有当提交代码时,提交消息
以 deploy: 开头才会执行compile1步骤,如若需要执行mvn clean 等命令,需要在linux环境
下载openjdk:8镜像(随便下一个镜像,此处以openjdk:8镜像为例),然后使用docker启动,例如
docker run -it -d openjdk:8
启动后进入容器
docker exec -it 容器id /bin/bash
然后执行安装maven等操作,然后执行 mvn clean install下载所需依赖,退出容器,
将openjdk:8镜像推送到阿里云,此时openjdk:8镜像中已经有了maven环境以及jar包依赖。
最后 将 image: openjdk:8地址改为提交到阿里云的openjdk:8镜像地址。
注:在执行mvn命令前需要先执行source /etc/profile 使环境变量生效
GitLab Runner变量名称,[官方文档地址]
3.2提交代码后,查看执行结果
错误排查:若提交代码后Jobs中没有执行,可以到CI/CD目录下的Pipelines中查看失败原因。例如
(1)Before_script配置应该是一个字符串或一个嵌套的字符串数组,深度不超过10层
(2)compile1任务中 rules和only不能同时使用