需要 docker
和 docker-compose
环境
安装docker和docker-compose 参考Docker的安装使用与程序的部署
创建gitlab
文件夹,进入后创建docker-compose.yml
文件
version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce'
restart: always
container_name: gitlab
hostname: '192.168.2.132:8001'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.2.132:8001'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
# unicorn['port'] = 8888
nginx['listen_port'] = 80
ports:
- '8001:80'
- '8443:443'
- '2222:22'
volumes:
- /etc/localtime:/etc/localtime
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
gitlab-runner:
image: gitlab/gitlab-runner
restart: always
hostname: gitlab-runner
container_name: gitlab-runner
extra_hosts:
- git.imlcs.top:192.168.2.132
depends_on:
- gitlab
volumes:
- /etc/localtime:/etc/localtime
- ./runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
执行docker-compose up -d
运行容器
需要一定的部署时间请耐心等待
访问http://192.168.2.132:8001
并设置好密码
使用 root 帐号加刚才设置的密码登录
刷新页面就变成中文
将项目上传到GitLab上
在项目设置
->CI/CD
中找到Runner
并展开
获取 URL 和 注册令牌 接下来配置 GitLab Runner 会用到
docker exec -it gitlab-runner gitlab-runner register -n \
--url http://192.168.2.132:8001/ \
--registration-token WE6zAWHJniXzWDxq2qPU \
--description "dockersock" \
--docker-privileged=true \
--docker-pull-policy="if-not-present" \
--docker-image "docker:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /root/m2:/root/.m2 \
--executor docker
如果出现以下提示
ERROR: Registering runner... failed runner=WE6zAWHJ status=couldn't execute POST against http://192.168.2.132:8001/api/v4/runners: Post http://192.168.2.132:8001/api/v4/runners: dial tcp 192.168.2.132:8001: connect: no route to host
PANIC: Failed to register this runner. Perhaps you are having network problems
则是没有关闭防火墙,关闭防火墙后重启docker服务
在如方法二中图所示添加标签信息
该方法更方便理解每一步
[root@localhost gitlab]# docker exec -it gitlab-runner gitlab-runner register
Runtime platform arch=amd64 os=linux pid=17 revision=a998cacd version=13.2.2
Running in system-mode.
# 输入GitLab地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.2.132:8001/
# 输入GitLab Token
Please enter the gitlab-ci token for this runner:
WE6zAWHJniXzWDxq2qPU
# 输入 Runner 的说明(可以为空,以后可修改)
Please enter the gitlab-ci description for this runner:
[gitlab-runner]:
# 设置 Tag 可以用于指定在构建规定的 tag 时触发 ci(可后期修改)
Please enter the gitlab-ci tags for this runner (comma separated):
docker,maven
# 选择 runner 执行器,这里我们选择的是 docker
Please enter the executor: shell, docker+machine, docker-ssh+machine, kubernetes, custom, docker-ssh, parallels, ssh, virtualbox, docker:
docker
Please enter the default Docker image (e.g. ruby:2.6):
docker:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
当上述步骤完成后,刷新当前页面,可以看见当前页面下多出来一个 runner:
点击锁右边的编辑按钮
进入runner
目录,可以看到有个config.tooml
文件,编辑该文件
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "ci/cd-test"
url = "http://192.168.2.132:8001/"
token = "Ygz9Wn82NjxzYTnEDoty"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = true
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"]
shm_size = 0
pull_policy = "if-not-present"
每配置一个 runner 就会在配置文件中生成一个 [[runners]]
修改 privileged = true
默认为 false,需改为 true。false 时,在 CI 构建的时候 会进行 health check,很耗时而且还是失败,设为 true 就自动跳过了。
修改 volumes = ["/var/run/docker.sock:/var/run/docker.sock", “/cache”,"/root/m2:/root/.m2"]
如果本地有 maven 环境的话,可以挂在到本地,这样在处理依赖时可以直接使用本地的环境,并且可以用阿里云镜像源。
添加 pull_policy = “if-not-present”
依赖拉取策略:如果本地有就不检查,如果没有就拉取
在项目根目录下创建Dockerfile
文件
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY /target/*.jar app.jar
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]
添加 Gitlab CI 核心的配置文件——.gitlab-ci.yml,并把它放在项目的根目录下。Gitlab 项目在创建的时候,默认会开启 Auto DevOps流水线,当有代码 push 到仓库中去的时候会自动扫描根目录下是否包含 .gitlab-ci.yml,如果有,会根据预定义的持续集成和持续交付配置自动化地构建、测试和部署应用程序。详细的语法参考官方文档: .gitlab.yml reference
# 设置 Maven 阿里云镜像 也可以在 /root/.m2 目录中编辑 settings.xml文件 添加阿里云镜像信息
before_script:
- rm -rf /root/.m2/settings.xml
- echo -e "<?xml version=\""1.0\"" encoding=\""UTF-8\""?>://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\"">>>>alimaven >>aliyun maven >>http://maven.aliyun.com/nexus/content/groups/public/ >>central > > > >" > /root/.m2/settings.xml
image: docker:latest
variables: # 定义job执行时所需要使用的环境变量
DOCKER_DRIVER: overlay2
#DOCKER_HOST: tcp://192.168.2.132:2375 # docker host,本地可不写
TAG: root/gitlab-ci:v1.0 # 镜像名称
CONTAINER_NAME: gitlab-ci-cd
PORT: 8765
cache: # 配置缓存,配置后,maven 下载的依赖可以被缓存起来,下次不需要重复去下载了。
paths:
- .m2/repository
services: # 配置需要用到的额外的服务。docker:dind,用于在 docker 中运行 docker 的一种东西,在项目的构建中需要。
- docker:dind
stages: # 这是 Gitlab CI 中的概念,Stages 表示构建阶段,定义管道有哪些stage,stage按定义顺序执行
- package
- deploy
maven-package: # 定义的 Jobs 之一,用于构建 jar 包。内部又引入 maven 镜像来处理,负责执行 package 这一流程。
image: maven:3.6.3-jdk-8
tags: # 指定哪一个gitlab runner可以pickup这个job去执行,每个gitlab runner都有一个tag
- maven
stage: package
script: # 定义job要执行的命令
- mvn clean package -Dmaven.test.skip=true
artifacts: # 定义那些文件需要在下一个job使用,一般是用于上一个job构建的结果文件需要在下一个job去使用
paths:
- target/*.jar
build-master: # 定义的 Jobs 之一,用于构建 Docker 镜像。负责执行 deploy 这一流程。具体执行 build 和 run。
tags:
- docker
stage: deploy
script:
- docker build -t $TAG . # 构件镜像
- docker rm -f $CONTAINER_NAME || true # 删除容器
- docker run -d --name $CONTAINER_NAME -p $PORT:$PORT $TAG # 运行容器
only: # 指定哪些branch的push commit会触发执行该job,本例子指定只有master才会执行deploy这个job
- master
完成配置工作后 Git 执行 commit&push 就会开始自动构建。回到 Gitlab 页面就可以看到构建的过程。