有幸這幾年待過的公司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)境钾怔,但相信在mac
或linux
環(huán)境下也是一樣的。 - 這次只實現(xiàn)代碼提交到
gitlab
后的自動編譯打包蒙挑,部署等到下次有機會再研究宗侦。
整體架構(gòu)
- 這個簡易的CI系統(tǒng)整體需要搭建兩個服務,
gitlab
和gitlab 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
而账,我們用Docker Compose
來組織鏡像部署,安裝參考:https://docs.docker.com/compose/install/
使用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)鍵點:
-
sameersbn
的gitlab
部署竞滓,需要用到redis
,postgresql
和gitlab
咐吼,所以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
-
運行完成后探入,通過ip訪問本機
10080
端口狡孔,便可看到gitlab
主頁:
使用
root
帳號即可登錄。
使用Docker部署Gitlab Runner
gitlab ci配置頁
- 打開管理中心 > 概覽 > Runner蜂嗽,這里能看到目前配置的
gitlab runner
:
- 我們主要關(guān)注點是配置
runner
使用的url
和token
苗膝。
編寫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
:
注冊Gitlab Runner
- 運行
docker exec -it gitlab-runner gitlab-runner register
命令界阁,將docker
中的gitlab-runner
注冊到gitlab
上:
- 依次輸入
gitlab
配置頁面上的url
侯繁,token
,runner
的描述,runner
的tag
(多個可以用逗號隔開)泡躯,executor
類型使用docker
贮竟,默認的鏡像使用docker
。 -
注冊完成后较剃,在gitlab管理頁面上就能看到runner:
創(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
的鏡像声旺。 -
script
:ci
任務的執(zhí)行腳本笔链,springboot
項目使用mvn
命令進行編譯打包。
-
-
提交代碼腮猖,觸發(fā)gitlab-ci
- 編寫好項目代碼和
.gitlab-ci.yml
鉴扫,Push至gitlab,就會觸發(fā)ci過程:
-
CI
任務的詳細過程缚够,可以在這個頁面中下載到CI
交付物:
優(yōu)化點和后續(xù)
- 目前
maven
編譯使用的是公共maven
鏡像幔妨,默認連接的是中央倉庫鹦赎,我們可以繼承它做一個連接到公司私服的maven
鏡像谍椅,提供給ci
任務進行編譯。 - 這個示例
ci
只做了編譯古话,后續(xù)可以對接k8s
實現(xiàn)自動部署雏吭,這樣一整套CI/CD
工具就完整了。