本文詳細(xì)介紹如何在Linux系統(tǒng)使用Docker安裝Gitlab铛碑、Gitlab-Runner,并通過一個(gè)SpringBoot項(xiàng)目來演示CICD
本文需要掌握一點(diǎn)Linux和Docker的基礎(chǔ)知識和命令厢洞,不熟悉的建議先去了解這兩塊的內(nèi)容哦
一、安裝Gitlab
1、拉取鏡像并啟動
由于服務(wù)器的80
端口可能被占用吱涉,所以這里我們改成了其他端口來啟動
docker run -d -p 2443:443 -p 5678:80 -p 2222:22 --name gitlab --restart always -v/srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /src/gitlab/data:/var/opt/gitlab docker.io/gitlab/gitlab-ce
2逛薇、修改配置文件
提示:等待docker運(yùn)行g(shù)itlab一小段時(shí)間后在操作捺疼,否則可能出現(xiàn)文件找不到
修改gitlab.yml文件
vim /src/gitlab/data/gitlab-rails/etc/gitlab.yml
找到如下配置,修改host為你服務(wù)的IP或者域名(不能加http://
)永罚,修改完畢后保存退出
gitlab:
# 這里要將host設(shè)置為你gitlab所在的服務(wù)器IP或者域名
host: 172.20.9.3
port: 80
https: false
修改gitlab.rb文件
vim /srv/gitlab/config/gitlab.rb
找到external_url
啤呼,默認(rèn)是被注釋的,要打開呢袱,并填寫暴露出去的http://ip:port
官扣,IP
一定要和gitlab.yml
文件配置的相同,port
為你啟動時(shí)指定的羞福,我們這里使用5678
作為端口惕蹄;最后加上ssh協(xié)議下使用的IP和端口(這里的端口是你啟動時(shí)指定的,我們這里是2222
),最后保存并退出
external_url 'http://172.20.9.3:5678'
gitlab_rails['gitlab_ssh_host'] = '172.20.9.3'
gitlab_rails['gitlab_shell_ssh_port'] = '2222'
停止并移除之前啟動的gitlab
# 停止并移除之前啟動的GitLab容器
docker rm -f gitlab
重新啟動gitlab
這里要將容器端口改為5678
docker run -d -p 2443:443 -p 5678:5678 -p 2222:22 --name gitlab --restart always -v/srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /src/gitlab/data:/var/opt/gitlab docker.io/gitlab/gitlab-ce
等待一段時(shí)間卖陵,就可以訪問了恋昼,首次需要更改root
賬戶的密碼。
如果進(jìn)入登錄頁發(fā)現(xiàn)沒有讓你修改密碼赶促,直接就是賬號和密碼的輸入框的話液肌,需要執(zhí)行下面的命令更改下root
的密碼
# 進(jìn)入gitlab容器
docker exec -it gitlab sh
# 進(jìn)入控制臺
gitlab-rails console -e production
# 查找用戶,此處user就是你的root賬戶
user = User.where(id: 1).first
# 修改密碼
user.password = '你的密碼'
# 確認(rèn)密碼
user.password_confirmation = '重復(fù)輸入你的密碼'
# 保存
user.save!
# 退出控制臺
exit
# 退出容器
exit
做完上面的操作后鸥滨,就可以去GitLab登陸了
二嗦哆、安裝Gitlab-Runner
可以在項(xiàng)目中或者項(xiàng)目組中以及全局配置中找到Runner
配置的地方,全局配置僅限GitLab的管理員賬號才有權(quán)限
- 項(xiàng)目中
項(xiàng)目中配置的Runner只對當(dāng)前項(xiàng)目有效
這時(shí)候我們展開婿滓,就能看到這個(gè)設(shè)置Runner的區(qū)域
- 項(xiàng)目組中
只對這個(gè)項(xiàng)目組內(nèi)的所有項(xiàng)目生效
這個(gè)和在項(xiàng)目中一樣老速,都需要展開,往下拉就能看到手動設(shè)置Runner的區(qū)域
- 全局配置
所有項(xiàng)目都可以一起使用
全局配置在右邊就能直接看到手動設(shè)置Runner的區(qū)域
1凸主、拉取Runner鏡像并啟動
docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
2橘券、進(jìn)入Runner容器內(nèi)
docker exec -it gitlab-runner bash
3、運(yùn)行以下命令
gitlab-runner register
輸入Gitlab實(shí)例的地址
地址是你手動設(shè)置Runner區(qū)域里面的URL
> Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://xxx
輸入token
token是你手動設(shè)置Runner區(qū)域里面的令牌
> Please enter the gitlab-ci token for this runner
xxx
輸入Runner的描述
> Please enter the gitlab-ci description for this runner
[hostname] my-runner
輸入與Runner關(guān)聯(lián)的標(biāo)簽
標(biāo)簽是為了讓后期在CI腳本中指定選擇某個(gè)或者多個(gè)Runner卿吐,這里我們設(shè)置他的標(biāo)簽為test
旁舰,你們可以設(shè)置其他的
> Please enter the gitlab-ci tags for this runner (comma separated):
test
輸入Runner的執(zhí)行器
由于我們都是基于Docker,所以這里選擇執(zhí)行器為Docker
> Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
設(shè)置執(zhí)行器的版本
> Please enter the Docker image (eg. ruby:2.1):
alpine:latest
退出容器
exit
通過以上命令后嗡官,就創(chuàng)建成功runner啦箭窜,這時(shí)候我們?nèi)itLab中我們創(chuàng)建Runner的區(qū)域刷新就能看到了
4、修改Runner配置文件
vim /srv/gitlab-runner/config/config.toml
找到volumes
配置衍腥,修改結(jié)果為如下磺樱,分別是掛載了宿主機(jī)docker的sock文件和Maven的緩存,減少拉取Jar包的時(shí)間消耗婆咸,其中"/data/.m2/:/.m2/"
這塊為Maven的Jar包存放地址竹捉,左邊為宿主機(jī)目錄,右邊為容器內(nèi)的Jar包存儲路徑尚骄,這個(gè)需要根據(jù)自己使用的Maven鏡像而定
提示:如何構(gòu)建Maven鏡像請翻到文章末尾
volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock","/data/.m2/:/.m2/"]
在volumes
配置下方增加一行配置块差,防止Runner重復(fù)拉取鏡像
pull_policy = "if-not-present"
最后重啟Runner
docker restart gitlab-runner
三、創(chuàng)建SpringBoot項(xiàng)目測試CICD
這里就不演示如何創(chuàng)建項(xiàng)目了乖仇,不會SpringBoot的自行去學(xué)習(xí)憾儒,這里只展示.gitlab-ci.yml
文件
1询兴、在項(xiàng)目根目錄創(chuàng)建個(gè)Dockerfile
FROM openjdk:8-jdk
COPY target/*.jar ci-demo.jar
EXPOSE 7777
ENTRYPOINT ["java","-jar","ci-demo.jar"]
2乃沙、項(xiàng)目根目錄創(chuàng)建.gitlab-ci.yml
文件
下面腳本中出現(xiàn)了172.20.9.3:5001/root/maven:latest
鏡像,這塊是我們手動構(gòu)建的Maven鏡像诗舰,如何構(gòu)建請前往文章第四部分拓展知識查看
# 全局腳本警儒,會運(yùn)行在各個(gè)階段的script前,如果某個(gè)階段里面存在before_script,那么以那個(gè)階段里的為主
before_script:
# 這里定義了打包成功后的Docker鏡像名稱蜀铲,每一次提交代碼后構(gòu)建成功的鏡像名稱都是唯一的
- export IMAGE_FULL_NAME=$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHA
# 定義CI執(zhí)行的階段边琉,這里可以自己根據(jù)情況定義多少個(gè)階段
stages:
- compile
- build
- run
# 定義全局變量
variables:
PROJECT: "ci-demo"
# 這里定義了Maven的jar包存放地址,與我們構(gòu)建maven私服的時(shí)候設(shè)置的存放地址一致
MAVEN_REPO: "/.m2"
編譯:
# 當(dāng)前階段的執(zhí)行鏡像记劝,這是我們自己構(gòu)建的鏡像
image: 172.20.9.3:5001/root/maven:latest
# 屬于上面定義的哪一個(gè)階段
stage: compile
# 是否允許失敗变姨,允許的話如果當(dāng)前階段運(yùn)行失敗還會繼續(xù)執(zhí)行下一個(gè)階段
allow_failure: false
# 只在哪個(gè)分支生效
only:
- master
# 這里就是你要選擇哪個(gè)runner來執(zhí)行了,填寫我們創(chuàng)建runner時(shí)候指定的標(biāo)簽
tags:
- test
# 運(yùn)行腳本
script:
- mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
# 因?yàn)槭荕aven編譯厌丑,所以會有Jar包產(chǎn)物定欧,這里定義產(chǎn)物的過期時(shí)間
artifacts:
name: $PROJECT
expire_in: 7 days
paths:
- target/*.jar
構(gòu)建鏡像:
image: docker:stable
stage: build
script:
# 這里的變量會自動獲取你當(dāng)前推送代碼的gitlab用戶和密碼以及倉庫地址
- docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
# 這里的變量就是我們?nèi)峙渲枚x的了
- docker build -t $IMAGE_FULL_NAME .
- docker push $IMAGE_FULL_NAME
- rm -rf target
- docker rmi $IMAGE_FULL_NAME
only:
- master
tags:
- test
運(yùn)行:
image: docker:stable
stage: run
script:
- CONTAINER_NAME=$(docker ps -aq --filter name=$PROJECT)
- echo $CONTAINER_NAME
- if [[ -n "$CONTAINER_NAME" ]]; then
docker rm -f $CONTAINER_NAME;
fi
- docker run -d --name $PROJECT -p 7777:7777 $IMAGE_FULL_NAME
only:
- master
tags:
- test
在上面的腳本文件中可以看到很多以CI
開頭的變量,但是我們也沒看到哪里有定義怒竿,其實(shí)這是gitlab
提供的基礎(chǔ)變量砍鸠,那么都有哪些基礎(chǔ)變量呢,我們可以通過在瀏覽器上輸入您gitlab
的訪問地址耕驰,然后地址后方拼接上help/ci/variables/predefined_variables.md
爷辱,即可前往默認(rèn)變量的介紹了
3、將項(xiàng)目提交到Gitlab倉庫即可
編寫好腳本后朦肘,提交代碼到master分支饭弓,因?yàn)槲覀冊贑I腳本里只指定了master分支生效,第一次CI執(zhí)行的時(shí)候會比較慢
媒抠,因?yàn)樾枰』A(chǔ)鏡像和jar包
CI腳本執(zhí)行完畢后示启,我們可以去runner所在服務(wù)器進(jìn)行查看容器是否啟動成功,由于我們項(xiàng)目設(shè)置了一個(gè)接口领舰,所以我們直接嘗試訪問接口地址看看是不是正常返回夫嗓,如果返回了就是執(zhí)行成功了,沒有正常返回的話冲秽,就需要自己通過
docker logs -f <容器名>
查看日志了建議:
最好使用內(nèi)網(wǎng)環(huán)境的基礎(chǔ)鏡像
舍咖,否則可能導(dǎo)致CI執(zhí)行時(shí)間過長,比如CI腳本中運(yùn)行階段的基礎(chǔ)鏡像docker:stable
還有Dockerfile文件里的基礎(chǔ)鏡像JDK
锉桑。拉取時(shí)間的長短受服務(wù)器性能和網(wǎng)絡(luò)影響排霉。
該項(xiàng)目Demo可以前往GitHub查看
四、拓展知識
1民轴、開啟GitLab中Docker鏡像倉庫
首先我們先找臺服務(wù)器啟動一個(gè)Docker registry鏡像倉庫
docker run -d -v /data/registry:/var/lib/registry -e REGISTRY_STORAGE_DELETE_ENABLED=true -p 5001:5000 --restart=always --name registry registry:2
過了一會后通過瀏覽器訪問http://<服務(wù)器IP>:5001/v2/_catalog
攻柠,會返回一個(gè)空的JSON,這是因?yàn)槲覀冞€沒推送鏡像上去后裸。
在Gitlab中開啟Docker鏡像倉庫瑰钮,可以直接通過Gitlab中的用戶項(xiàng)目權(quán)限進(jìn)行鏡像權(quán)限控制,非常方便快捷微驶。首先執(zhí)行命令vim /srv/gitlab/config/gitlab.rb
編輯配置文件浪谴,然后將registry_external_url
和gitlab_rails['registry_api_url']
替換為你的鏡像倉庫地址开睡,registry_path
、registry_host
修改為對應(yīng)的地址和IP
registry_external_url 'http://172.20.9.3:5001'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "172.20.9.3"
gitlab_rails['registry_port'] = "5001"
gitlab_rails['registry_path'] = "/src/gitlab/data/gitlab-rails/shared/registry"
gitlab_rails['registry_api_url'] = "http://172.20.9.3:5001"
gitlab_rails['registry_path'] 這個(gè)配置的路徑和我們前面通過 docker run 運(yùn)行 gitlab時(shí)掛載的目錄有關(guān)系的苟耻,如果你們在運(yùn)行 gitlab 的時(shí)候篇恒,目錄沒有和文章一樣,那要調(diào)整成你們配的目錄
配置完刷新配置
docker exec -it gitlab gitlab-ctl reconfigure
這時(shí)候我們隨便找到一個(gè)項(xiàng)目凶杖,點(diǎn)進(jìn)去查看一下容器庫
右邊的就是如何通過docker提交鏡像到該項(xiàng)目了
提示:由于我們這邊沒有配置HTTPS胁艰,所以需要給Docker增加如下配置,需要登陸鏡像倉庫的機(jī)子都需要給配上智蝠,我們這里是通過runner去打包和啟動項(xiàng)目蝗茁,那么就需要在runner所在服務(wù)器的docker進(jìn)行配置了
# 打開文件
vim /etc/docker/daemon.json
# 將下面的配置追加到已有的配置中
"insecure-registries":["xxx:5000"]
最終的效果如下第一行
配置好后重啟Docker
systemctl restart docker
2、構(gòu)建自己的Maven鏡像
以下兩個(gè)文件要放到同一個(gè)目錄里面
- Dockerfile
FROM maven:3.6.0-jdk-8-alpine
COPY settings.xml /usr/share/maven/ref/
- Maven配置文件(settings.xml)
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://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">
<!--改為你的Jar包存放目錄-->
<localRepository>/.m2</localRepository>
<mirrors>
<mirror>
<id>mynexus</id>
<name>company nexus</name>
<url>更改為你的Maven倉庫地址寻咒,可以是阿里的私服哮翘,也可以是公司內(nèi)部的私服</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk18</id>
<activation>
<jdk>1.8</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
兩個(gè)文件創(chuàng)建好之后,通過控制臺進(jìn)入到該目錄毛秘,嘗試構(gòu)建鏡像并上傳饭寺,本文直接采用GitLab開啟Docker鏡像倉庫,因此這里叫挟,我們先去Gitlab創(chuàng)建一個(gè)叫Maven的項(xiàng)目艰匙,然后查看他的容器庫
依次執(zhí)行框框里的命令,這里需要配置docker鏡像倉庫地址到你要執(zhí)行這個(gè)命令的機(jī)子哦抹恳,如果你是在本地员凝,那么就是給本地電腦的docker加上配置了
docker login 172.20.9.3:5001
docker build -t 172.20.9.3:5001/root/maven .
docker push 172.20.9.3:5001/root/maven
執(zhí)行完畢后我們回到Gitlab查看一下,這時(shí)候就有我們推送的鏡像了