Gitlab CI/CD with gitlab-runner in docker mode

1. Install and start the gitlab-runner container

​ 通过docker拉取gitlab-runner镜像,启动了一个gitlab-runner容器。假设你的私有化部署的gitlab网站做了一个host映射,例如例子中的gitlab.oa.com,那么需要通过--add-host方式将该host信息加入到gitlab-runner这个容器的/etc/hosts中。只有这样设置后,才能够完成gitlab-runner的注册。

docker run -d \
  --name gitlab-runner \
  --add-host gitlab.oa.com:192.168.146.60 \
  --restart always \
  --volume /data/gitlab-runner/config:/etc/gitlab-runner \
  --volume /data/gitlab-runner/build:/build \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

2. Register a runner for the gitlab site

​ 注册时可以通过这样的方式创建一个docker executor,这里用的是Java的例子,使用了一个maven3的image,这个image中带了jdk-8. 通过设置--tag-list "java,spring"的方式,只要我们的Java项目的.gitlab-ci.ymltags包含java或者spring,就可以分配到这个gitlab-runner上执行。注意要根据你从gitlab管理页面创建的token内容替换--registration-token的内容。

docker exec -it gitlab-runner gitlab-runner register --non-interactive --url "http://gitlab.oa.com/" --registration-token "token from your gitlab admin page" --description "java runner"  --tag-list "java,spring" --run-untagged --locked="false" --executor "docker" --docker-volumes /data/gitlab-runner/ws:/share:rw --docker-image maven:3-jdk-8
  

执行完成这样的命令后,将在/data/gitlab-runner/config/中创建一个config.toml文件,内容如下

➜  ~ cat /data/gitlab-runner/config/config.toml
concurrent = 1
check_interval = 0


[session_server]
  session_timeout = 1800


[[runners]]
  name = "java runner"
  url = "http://gitlab.oa.com/"
  token = "your token"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.docker]
    tls_verify = false
    image = "maven:3-jdk-8"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/data/gitlab-runner/ws:/share:rw", "/cache"]
    shm_size = 0

因为我们使用了自定义的hosts,还需要为docker in docker中的docker增加hosts信息,否则会导致无法解析gitlab.oa.com域名的问题。

2.1 extra_hosts and volumes setting

从官方文档 runner.docker settings中,我们了解到可以增加extra_hosts等参数来影响docker中的docker的执行参数。

➜  ~ cat /data/gitlab-runner/config/config.toml
concurrent = 1
check_interval = 0


[session_server]
  session_timeout = 1800


[[runners]]
  name = "java runner"
  url = "http://gitlab.oa.com/"
  token = "your token"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.docker]
    tls_verify = false
    image = "maven:3-jdk-8"
    extra_hosts = ["gitlab.oa.com:192.168.146.60"] # add this extra_hosts for docker in docker
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/data/gitlab-runner/ws:/share:rw", "/data/share/maven:/root/.m2:rw", "/cache"]  # share the maven repository and setting
    shm_size = 0

2.2 Example project with .gitlab-ci.yml

我们创建一个maven项目,目录结构如下,包括了两个lib,三个app,共5个module。

├─app                                                      
│  ├─app-signal-processor                                                                  
│  ├─watchlist-event-processor                                                         
│  └─watchlist-loader                                        
└─lib                                                      
    ├─common                                                                          
    ├─parent                                               
    └─publisher
pom.xml
.gitlab-ci.yml
.gitignore

其中.gitlab-ci.yml文件就是gitlab ci/cd的配置文件,有这个文件就能够定义你的DevOps流程。这里仅仅简单定义一个commit就触发如下流程

image-20200819125933954

配置文件内容是:

# This file is a template, and might need editing before it works on your project.
# Build JAVA applications using Apache Maven (http://maven.apache.org)
# For docker image tags see https://hub.docker.com/_/maven/
#
# For general lifecycle information see https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

# This template will build and test your projects
# * Caches downloaded dependencies and plugins between invocation.
# * Verify but don't deploy merge requests.
# * Deploy built artifacts from master branch only.

variables:
  # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins.
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"


# Cache downloaded dependencies and plugins between builds.
# To keep cache across branches add 'key: "$CI_JOB_NAME"'
cache:
  paths:
    - .m2/repository

# This will only validate and compile stuff and run e.g. maven-enforcer-plugin.
# Because some enforcer rules might check dependency convergence and class duplications
# we use `test-compile` here instead of `validate`, so the correct classpath is picked up.
validate: 
  stage: build
  tags:
    - java
  script:
    - 'mvn $MAVEN_CLI_OPTS test-compile'

# For merge requests do not `deploy` but only run `verify`.
# See https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
testing:
  stage: test
  tags:
    - java
  script:
    - 'mvn $MAVEN_CLI_OPTS verify test'
  artifacts:
    expire_in: 2 weeks
    reports:
      junit: ./**/target/surefire-reports/TEST-*.xml



# For `master` branch run `mvn deploy` automatically.
# Here you need to decide whether you want to use JDK7 or 8.
# To get this working you need to define a volume while configuring your gitlab-ci-multi-runner.
# Mount your `settings.xml` as `/root/.m2/settings.xml` which holds your secrets.
# See https://maven.apache.org/settings.html
deploy:jdk8:
  # Use stage test here, so the pages job may later pickup the created site.
  stage: test
  tags:
    - java
  script:
    - 'mvn $MAVEN_CLI_OPTS package -DskipTests'
    #- 'mvn $MAVEN_CLI_OPTS deploy site site:stage'
  only:
    - master
  # Archive up the built documentation site.
  artifacts:
    expire_in : 2 hrs
    paths:
      - ./**/target/*.jar

我们会在每次deploy阶段将成功打包的内容暂时存起来,供后续的自动化集成测试使用。

image-20200819130047137
image-20200819130119054
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355