Win10下使用Docker搭建Gitlab CI自动构建平台

有幸这几年待过的公司devops都做的比较完善,每天享受着一键编译打包发布的快感。最近闲着无事,尝试着在Win10笔记本电脑上搭建一套自动构建平台玩一玩,在这里记录下过程。

目标和基本环境

  • 目前公司使用的是gitlab,功能丰富,对于一般的公司足够使用。所以使用gitlab作为代码仓库,用gitlab ci组件组建持续编译工具。
  • 公司配的是Win10电脑,所以整体工具系统的搭建环境就是:win10 + docker + gitlab + gitlab runner。虽然本文使用的是win10 docker环境,但相信在maclinux环境下也是一样的。
  • 这次只实现代码提交到gitlab后的自动编译打包,部署等到下次有机会再研究。

整体架构

image.png
  • 这个简易的CI系统整体需要搭建两个服务,gitlabgitlab runner
  • 开发人员除了代码本身,还需要在项目中编写一个gitlab-ci.yml文件,告诉ci系统如何编译这个项目,具体包含几个ci task
  • 在成功git push代码之后,gitlab-runner会从gitlab上拉取需要执行ci任务的项目,根据gitlab-ci.yml中的定义执行具体的编译任务,并产出交付物,提供下载或执行后续的部署任务。

前置准备

Win10 Docker安装

  • 在旗舰版Win10上开启Hyper-V特性,安装好docker运行环境,应该是各位Windows User的基本功,这里就不赘述了。

Docker Compose安装

使用Docker搭建Gitlab

编写docker-compose.yml

  • 首先我们需要一个gitlab,在这我使用sameersbn/gitlab镜像,组织的docker-compose进行gitlab部署。
  • 直接贴出编写好的yml:
version: '2'

services:
  redis:
    restart: always
    image: sameersbn/redis:4.0.9-2
    command:
    - --loglevel warning
    volumes:
    - redis-data:/var/lib/redis:Z

  postgresql:
    restart: always
    image: sameersbn/postgresql:10-2
    volumes:
    - postgresql-data:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm

  gitlab:
    restart: always
    image: sameersbn/gitlab:12.3.5
    depends_on:
    - redis
    - postgresql
    ports:  #gitlab docker与宿主电脑的端口映射
    - "10080:80"  #宿主电脑的10080端口映射到docker的80端口
    - "10022:22"  #同上
    volumes:
    - gitlab-data:/home/git/data:Z
    environment:
    - DEBUG=false

    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

    - REDIS_HOST=redis
    - REDIS_PORT=6379

    - TZ=Asia/Kolkata
    - GITLAB_TIMEZONE=Kolkata

    - GITLAB_HTTPS=false
    - SSL_SELF_SIGNED=false

    - GITLAB_HOST=10.130.72.51
    - GITLAB_PORT=10080
    - GITLAB_SSH_PORT=10022
    - GITLAB_RELATIVE_URL_ROOT=
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

    - GITLAB_ROOT_PASSWORD=
    - GITLAB_ROOT_EMAIL=

    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false

    - GITLAB_EMAIL=notifications@example.com
    - GITLAB_EMAIL_REPLY_TO=noreply@example.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com

    - GITLAB_BACKUP_SCHEDULE=daily
    - GITLAB_BACKUP_TIME=01:00

    - SMTP_ENABLED=false
    - SMTP_DOMAIN=www.example.com
    - SMTP_HOST=smtp.gmail.com
    - SMTP_PORT=587
    - SMTP_USER=mailer@example.com
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=login

    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=mailer@example.com
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_STARTTLS=false

    - OAUTH_ENABLED=false
    - OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
    - OAUTH_ALLOW_SSO=
    - OAUTH_BLOCK_AUTO_CREATED_USERS=true
    - OAUTH_AUTO_LINK_LDAP_USER=false
    - OAUTH_AUTO_LINK_SAML_USER=false
    - OAUTH_EXTERNAL_PROVIDERS=

    - OAUTH_CAS3_LABEL=cas3
    - OAUTH_CAS3_SERVER=
    - OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
    - OAUTH_CAS3_LOGIN_URL=/cas/login
    - OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
    - OAUTH_CAS3_LOGOUT_URL=/cas/logout

    - OAUTH_GOOGLE_API_KEY=
    - OAUTH_GOOGLE_APP_SECRET=
    - OAUTH_GOOGLE_RESTRICT_DOMAIN=

    - OAUTH_FACEBOOK_API_KEY=
    - OAUTH_FACEBOOK_APP_SECRET=

    - OAUTH_TWITTER_API_KEY=
    - OAUTH_TWITTER_APP_SECRET=

    - OAUTH_GITHUB_API_KEY=
    - OAUTH_GITHUB_APP_SECRET=
    - OAUTH_GITHUB_URL=
    - OAUTH_GITHUB_VERIFY_SSL=

    - OAUTH_GITLAB_API_KEY=
    - OAUTH_GITLAB_APP_SECRET=

    - OAUTH_BITBUCKET_API_KEY=
    - OAUTH_BITBUCKET_APP_SECRET=

    - OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
    - OAUTH_SAML_IDP_CERT_FINGERPRINT=
    - OAUTH_SAML_IDP_SSO_TARGET_URL=
    - OAUTH_SAML_ISSUER=
    - OAUTH_SAML_LABEL="Our SAML Provider"
    - OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
    - OAUTH_SAML_GROUPS_ATTRIBUTE=
    - OAUTH_SAML_EXTERNAL_GROUPS=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=

    - OAUTH_CROWD_SERVER_URL=
    - OAUTH_CROWD_APP_NAME=
    - OAUTH_CROWD_APP_PASSWORD=

    - OAUTH_AUTH0_CLIENT_ID=
    - OAUTH_AUTH0_CLIENT_SECRET=
    - OAUTH_AUTH0_DOMAIN=
    - OAUTH_AUTH0_SCOPE=

    - OAUTH_AZURE_API_KEY=
    - OAUTH_AZURE_API_SECRET=
    - OAUTH_AZURE_TENANT_ID=

volumes:
  redis-data:
  postgresql-data:
  gitlab-data:
  • 关键点:
    • sameersbngitlab部署,需要用到redis, postgresqlgitlab,所以docker-compose.yml中包含了这三个组件。
    • 每个组件都设置了volumes,表示将容器内的存储地址映射到本地硬盘路径,这样容器就可以保存运行时的数据状态。
    • gitlab中配置了端口映射,访问本机10080端口将会打开gitlab主页。
    • gitlab.environment中主要把GITLAB_HOST配置成测试用的域名,或者本机的ip地址,因为后续gitlab runner需要通过这个地址与gitlab通讯。其他配置可以看需要修改。

启动gitlab

  • 将写好的docker-compose.yml保存至一个文件夹中,如:D:\docker\gitlab\docker-compose.yml,在命令行中进入D:\docker\gitlab\路径,执行docker-compose up

    image.png

  • 运行完成后,通过ip访问本机10080端口,便可看到gitlab主页:

    image.png

  • 使用root帐号即可登录。

使用Docker部署Gitlab Runner

gitlab ci配置页

  • 打开管理中心 > 概览 > Runner,这里能看到目前配置的gitlab runner
    image.png
  • 我们主要关注点是配置runner使用的urltoken

编写Runner docker-compose并执行

version: '3'
services:
    runner:
      image: 'gitlab/gitlab-runner:v11.4.2'
      container_name: gitlab-runner
      restart: always 
      privileged: true
      volumes: 
        - ./config:/etc/gitlab-runner
        - /var/run/docker.sock:/var/run/docker.sock
  • 关键点:在volumes需要指定docker.sock,这个与docker执行的上下文环境有关,这里不作太多说明。
  • 同样的,把文件保存到一个单独目录,执行docker-compose up
    image.png

注册Gitlab Runner

  • 运行docker exec -it gitlab-runner gitlab-runner register命令,将docker中的gitlab-runner注册到gitlab上:
    image.png
  • 依次输入gitlab配置页面上的urltoken,runner的描述,runnertag(多个可以用逗号隔开),executor类型使用docker,默认的镜像使用docker
  • 注册完成后,在gitlab管理页面上就能看到runner:


    image.png

创建SpringBoot项目,对接gitlab-ci

在Gitalb中创建Project

  • 创建Project并提交Springboot项目代码,这里不赘述过程。

编写.gitlab-ci.yml配置文件

  • 在项目源码根目录下,创建.gitlab-ci.yml文件,这文件描述了ci过程的各个任务和需要的资源。
image: docker:latest  #1
variables:  #2
  MAVEN_OPTS: "-Dmaven.repo.local=.m2"
  DOCKER_DRIVER: overlay2

cache:  #3 缓存maven repository
  key: maven-repository-cache
  paths:
    - .m2

services:  #4 使用docker镜像执行任务
  - docker:dind
stages:  #5  定义CI过程有几个stage
  - package

maven-package:  #6  定义一个task
  image: maven:3.5-jdk-8-alpine

  tags:  # 此任务在具有哪个tag上的runner执行
    - maven
  stage: package  # 此task对应哪个stage
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:  # CI交付物
    paths:
      - target/*.jar
    expire_in: 1 day  # 一天后过期
  • 关键点:
    • stage:定义ci过程有几个阶段,gitlab-ci会按顺序执行每个stage
    • task定义maven-package
      • stage:指定这个task属于哪个阶段。同一个阶段下的所有task并发执行。
      • tag:指定此task要在具有哪个tag的runner上执行,可以实现需要不同编译环境的任务在特定runner上运行,如ios app编译需要在mac环境下的runner运行。
      • image:此任务使用哪个镜像进行ci任务,这里使用带有maven-jdk的镜像。
      • scriptci任务的执行脚本,springboot项目使用mvn命令进行编译打包。

提交代码,触发gitlab-ci

  • 编写好项目代码和.gitlab-ci.yml,Push至gitlab,就会触发ci过程:
    image.png
  • CI任务的详细过程,可以在这个页面中下载到CI交付物:
    image.png

优化点和后续

  • 目前maven编译使用的是公共maven镜像,默认连接的是中央仓库,我们可以继承它做一个连接到公司私服的maven镜像,提供给ci任务进行编译。
  • 这个示例ci只做了编译,后续可以对接k8s实现自动部署,这样一整套CI/CD工具就完整了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容