Docker安裝Gitlab和Runner并實(shí)現(xiàn)Java項(xiàng)目的CICD

本文詳細(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)目有效

image.png

這時(shí)候我們展開婿滓,就能看到這個(gè)設(shè)置Runner的區(qū)域
image.png

  • 項(xiàng)目組中

只對這個(gè)項(xiàng)目組內(nèi)的所有項(xiàng)目生效

image.png

這個(gè)和在項(xiàng)目中一樣老速,都需要展開,往下拉就能看到手動設(shè)置Runner的區(qū)域

  • 全局配置

所有項(xiàng)目都可以一起使用

image.png

image.png

全局配置在右邊就能直接看到手動設(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ū)域刷新就能看到了


image.png

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包

image.png

CI腳本執(zhí)行完畢后示启,我們可以去runner所在服務(wù)器進(jìn)行查看容器是否啟動成功,由于我們項(xiàng)目設(shè)置了一個(gè)接口领舰,所以我們直接嘗試訪問接口地址看看是不是正常返回夫嗓,如果返回了就是執(zhí)行成功了,沒有正常返回的話冲秽,就需要自己通過docker logs -f <容器名>查看日志了
image.png

建議最好使用內(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_urlgitlab_rails['registry_api_url']替換為你的鏡像倉庫地址开睡,registry_pathregistry_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)去查看一下容器庫


image.png

右邊的就是如何通過docker提交鏡像到該項(xiàng)目了

提示:由于我們這邊沒有配置HTTPS胁艰,所以需要給Docker增加如下配置,需要登陸鏡像倉庫的機(jī)子都需要給配上智蝠,我們這里是通過runner去打包和啟動項(xiàng)目蝗茁,那么就需要在runner所在服務(wù)器的docker進(jìn)行配置了

# 打開文件
vim /etc/docker/daemon.json
# 將下面的配置追加到已有的配置中
"insecure-registries":["xxx:5000"]

最終的效果如下第一行


image.png

配置好后重啟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)目艰匙,然后查看他的容器庫


image.png

依次執(zhí)行框框里的命令,這里需要配置docker鏡像倉庫地址到你要執(zhí)行這個(gè)命令的機(jī)子哦抹恳,如果你是在本地员凝,那么就是給本地電腦的docker加上配置了


image.png
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í)候就有我們推送的鏡像了


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奋献,一起剝皮案震驚了整個(gè)濱河市健霹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓶蚂,老刑警劉巖糖埋,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窃这,居然都是意外死亡瞳别,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門杭攻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祟敛,“玉大人,你說我怎么就攤上這事兆解」萏” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵痪宰,是天一觀的道長叼架。 經(jīng)常有香客問我,道長衣撬,這世上最難降的妖魔是什么乖订? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮具练,結(jié)果婚禮上乍构,老公的妹妹穿的比我還像新娘。我一直安慰自己扛点,他們只是感情好哥遮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陵究,像睡著了一般眠饮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铜邮,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天仪召,我揣著相機(jī)與錄音,去河邊找鬼松蒜。 笑死扔茅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秸苗。 我是一名探鬼主播召娜,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惊楼!你這毒婦竟也來了玖瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤檀咙,失蹤者是張志新(化名)和其女友劉穎店读,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀芯,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯断,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侣诺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殖演。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖年鸳,靈堂內(nèi)的尸體忽然破棺而出趴久,到底是詐尸還是另有隱情,我是刑警寧澤搔确,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布彼棍,位于F島的核電站灭忠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏座硕。R本人自食惡果不足惜弛作,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望华匾。 院中可真熱鬧映琳,春花似錦、人聲如沸蜘拉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭旭。三九已至谎脯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持寄,已是汗流浹背穿肄。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留际看,地道東北人咸产。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像仲闽,于是被迫代替她去往敵國和親脑溢。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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