Win10下使用Docker搭建Gitlab CI自動構(gòu)建平臺

有幸這幾年待過的公司devops都做的比較完善共虑,每天享受著一鍵編譯打包發(fā)布的快感。最近閑著無事,嘗試著在Win10筆記本電腦上搭建一套自動構(gòu)建平臺玩一玩,在這里記錄下過程。

目標和基本環(huán)境

  • 目前公司使用的是gitlab泛粹,功能豐富遂铡,對于一般的公司足夠使用。所以使用gitlab作為代碼倉庫晶姊,用gitlab ci組件組建持續(xù)編譯工具扒接。
  • 公司配的是Win10電腦,所以整體工具系統(tǒng)的搭建環(huán)境就是:win10 + docker + gitlab + gitlab runner们衙。雖然本文使用的是win10 docker環(huán)境钾怔,但相信在maclinux環(huán)境下也是一樣的。
  • 這次只實現(xiàn)代碼提交到gitlab后的自動編譯打包蒙挑,部署等到下次有機會再研究宗侦。

整體架構(gòu)

image.png
  • 這個簡易的CI系統(tǒng)整體需要搭建兩個服務,gitlabgitlab runner忆蚀。
  • 開發(fā)人員除了代碼本身矾利,還需要在項目中編寫一個gitlab-ci.yml文件姑裂,告訴ci系統(tǒng)如何編譯這個項目,具體包含幾個ci task男旗。
  • 在成功git push代碼之后舶斧,gitlab-runner會從gitlab上拉取需要執(zhí)行ci任務的項目,根據(jù)gitlab-ci.yml中的定義執(zhí)行具體的編譯任務察皇,并產(chǎn)出交付物茴厉,提供下載或執(zhí)行后續(xù)的部署任務。

前置準備

Win10 Docker安裝

  • 在旗艦版Win10上開啟Hyper-V特性什荣,安裝好docker運行環(huán)境矾缓,應該是各位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:
  • 關(guān)鍵點:
    • sameersbngitlab部署竞滓,需要用到redis, postgresqlgitlab咐吼,所以docker-compose.yml中包含了這三個組件。
    • 每個組件都設(shè)置了volumes商佑,表示將容器內(nèi)的存儲地址映射到本地硬盤路徑锯茄,這樣容器就可以保存運行時的數(shù)據(jù)狀態(tài)。
    • gitlab中配置了端口映射茶没,訪問本機10080端口將會打開gitlab主頁肌幽。
    • gitlab.environment中主要把GITLAB_HOST配置成測試用的域名,或者本機的ip地址抓半,因為后續(xù)gitlab runner需要通過這個地址與gitlab通訊喂急。其他配置可以看需要修改。

啟動gitlab

  • 將寫好的docker-compose.yml保存至一個文件夾中笛求,如:D:\docker\gitlab\docker-compose.yml廊移,在命令行中進入D:\docker\gitlab\路徑,執(zhí)行docker-compose up

    image.png

  • 運行完成后探入,通過ip訪問本機10080端口狡孔,便可看到gitlab主頁:

    image.png

  • 使用root帳號即可登錄。

使用Docker部署Gitlab Runner

gitlab ci配置頁

  • 打開管理中心 > 概覽 > Runner蜂嗽,這里能看到目前配置的gitlab runner
    image.png
  • 我們主要關(guān)注點是配置runner使用的urltoken苗膝。

編寫Runner docker-compose并執(zhí)行

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
  • 關(guān)鍵點:在volumes需要指定docker.sock,這個與docker執(zhí)行的上下文環(huán)境有關(guān)植旧,這里不作太多說明荚醒。
  • 同樣的芋类,把文件保存到一個單獨目錄,執(zhí)行docker-compose up
    image.png

注冊Gitlab Runner

  • 運行docker exec -it gitlab-runner gitlab-runner register命令界阁,將docker中的gitlab-runner注冊到gitlab上:
    image.png
  • 依次輸入gitlab配置頁面上的url侯繁,token,runner的描述,runnertag(多個可以用逗號隔開)泡躯,executor類型使用docker贮竟,默認的鏡像使用docker
  • 注冊完成后较剃,在gitlab管理頁面上就能看到runner:


    image.png

創(chuàng)建SpringBoot項目咕别,對接gitlab-ci

在Gitalb中創(chuàng)建Project

  • 創(chuàng)建Project并提交Springboot項目代碼,這里不贅述過程写穴。

編寫.gitlab-ci.yml配置文件

  • 在項目源碼根目錄下惰拱,創(chuàng)建.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鏡像執(zhí)行任務
  - docker:dind
stages:  #5  定義CI過程有幾個stage
  - package

maven-package:  #6  定義一個task
  image: maven:3.5-jdk-8-alpine

  tags:  # 此任務在具有哪個tag上的runner執(zhí)行
    - maven
  stage: package  # 此task對應哪個stage
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:  # CI交付物
    paths:
      - target/*.jar
    expire_in: 1 day  # 一天后過期
  • 關(guān)鍵點:
    • stage:定義ci過程有幾個階段偿短,gitlab-ci會按順序執(zhí)行每個stage
    • task定義maven-package
      • stage:指定這個task屬于哪個階段馋没。同一個階段下的所有task并發(fā)執(zhí)行昔逗。
      • tag:指定此task要在具有哪個tag的runner上執(zhí)行,可以實現(xiàn)需要不同編譯環(huán)境的任務在特定runner上運行篷朵,如ios app編譯需要在mac環(huán)境下的runner運行勾怒。
      • image:此任務使用哪個鏡像進行ci任務,這里使用帶有maven-jdk的鏡像声旺。
      • scriptci任務的執(zhí)行腳本笔链,springboot項目使用mvn命令進行編譯打包。

提交代碼腮猖,觸發(fā)gitlab-ci

  • 編寫好項目代碼和.gitlab-ci.yml鉴扫,Push至gitlab,就會觸發(fā)ci過程:
    image.png
  • CI任務的詳細過程缚够,可以在這個頁面中下載到CI交付物:
    image.png

優(yōu)化點和后續(xù)

  • 目前maven編譯使用的是公共maven鏡像幔妨,默認連接的是中央倉庫鹦赎,我們可以繼承它做一個連接到公司私服的maven鏡像谍椅,提供給ci任務進行編譯。
  • 這個示例ci只做了編譯古话,后續(xù)可以對接k8s實現(xiàn)自動部署雏吭,這樣一整套CI/CD工具就完整了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陪踩,一起剝皮案震驚了整個濱河市杖们,隨后出現(xiàn)的幾起案子悉抵,更是在濱河造成了極大的恐慌,老刑警劉巖摘完,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姥饰,死亡現(xiàn)場離奇詭異,居然都是意外死亡孝治,警方通過查閱死者的電腦和手機列粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈飒,“玉大人岂座,你說我怎么就攤上這事『即耄” “怎么了费什?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長手素。 經(jīng)常有香客問我鸳址,道長,這世上最難降的妖魔是什么刑桑? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任氯质,我火速辦了婚禮,結(jié)果婚禮上祠斧,老公的妹妹穿的比我還像新娘闻察。我一直安慰自己,他們只是感情好琢锋,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布辕漂。 她就那樣靜靜地躺著,像睡著了一般吴超。 火紅的嫁衣襯著肌膚如雪钉嘹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天鲸阻,我揣著相機與錄音跋涣,去河邊找鬼。 笑死鸟悴,一個胖子當著我的面吹牛陈辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播细诸,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼沛贪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起利赋,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚送,沒想到半個月后塘偎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年偏窝,在試婚紗的時候發(fā)現(xiàn)自己被綠了祭往。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼补。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡已骇,死狀恐怖褪储,靈堂內(nèi)的尸體忽然破棺而出慧域,到底是詐尸還是另有隱情,我是刑警寧澤辛藻,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布互订,位于F島的核電站,受9級特大地震影響岩榆,放射性物質(zhì)發(fā)生泄漏坟瓢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奕坟。 院中可真熱鬧清笨,春花似錦抠艾、人聲如沸检号。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泥彤,卻和暖如春卿啡,著一層夾襖步出監(jiān)牢的瞬間吟吝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工剑逃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留官辽,地道東北人蛹磺。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像萤捆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容