最近發(fā)現(xiàn)Gitlab的CI/CD功能也能實(shí)現(xiàn)自動(dòng)化部署,用起來(lái)也挺簡(jiǎn)單!如果你使用的是Gitlab作為Git倉(cāng)庫(kù)的話,不妨試試它的CI/CD功能。本文還是以SpringBoot的自動(dòng)化部署為例,實(shí)踐下Gitlab的CI/DI功能。
SpringBoot實(shí)戰(zhàn)電商項(xiàng)目mall(50k+star)地址:https://github.com/macrozheng/mall
安裝
通過(guò)Gitlab的CI/CD功能實(shí)現(xiàn)自動(dòng)化部署,我們需要安裝Gitlab、Gitlab Runner、Maven這些服務(wù)。
安裝Gitlab
首先我們來(lái)安裝下Gitlab,對(duì)Gitlab安裝和使用不了解的朋友可以參考下《10分鐘搭建自己的Git倉(cāng)庫(kù)》 。
使用如下命令運(yùn)行Gitlab服務(wù),這里需要注意的是添加了hostname屬性,這樣我們就可以通過(guò)域名來(lái)訪問(wèn)Gitlab了(為了避免一些不必要的麻煩),GITLAB_ROOT_PASSWORD這個(gè)環(huán)境變量可以直接設(shè)置Gitlab中root賬號(hào)的密碼;
docker run --detach --hostname git.macrozheng.com --publish 10443:443 --publish 1080:80 --publish 1022:22 --name gitlab --restart always --volume /mydata/gitlab/config:/etc/gitlab --volume /mydata/gitlab/logs:/var/log/gitlab --volume /mydata/gitlab/data:/var/opt/gitlab -e GITLAB_ROOT_PASSWORD=12345678 gitlab/gitlab-ce:latest
我們需要通過(guò)git.macrozheng.com這個(gè)域名來(lái)訪問(wèn)Gitlab,如果你沒有域名的話,可以通過(guò)修改本機(jī)的host文件來(lái)實(shí)現(xiàn);
192.168.7.134 git.macrozheng.com
由于我們的Gitlab運(yùn)行在1080端口上,我們想要不加端口來(lái)訪問(wèn),可以使用Nginx來(lái)反向代理下,對(duì)Nginx不熟悉的朋友可以看下《Nginx的這些妙用,你肯定有不知道的!》 ,在Nginx的配置文件夾中添加git.conf配置文件,內(nèi)容如下:
server { listen 80; # 同時(shí)支持HTTP server_name git.macrozheng.com; #修改域名 location / { proxy_pass http://192.168.7.134:1080; # 設(shè)置代理服務(wù)訪問(wèn)地址 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
之后我們就可以通過(guò)git.macrozheng.com這個(gè)域名來(lái)訪問(wèn)Gitlab了,輸入賬號(hào)密碼root:12345678即可登錄;
將我們的SpringBoot應(yīng)用代碼上傳到Gitlab上去,這樣Gitlab就準(zhǔn)備完畢了!這里需要注意的是,如果你在啟動(dòng)Gitlab的時(shí)候沒有指定hostname的話,你的項(xiàng)目HTTP訪問(wèn)地址會(huì)是容器的ID,使用該地址會(huì)無(wú)法訪問(wèn)Git倉(cāng)庫(kù)!
安裝Gitlab Runner
Gitlab只是個(gè)代碼倉(cāng)庫(kù),想要實(shí)現(xiàn)CI/CD還需安裝gitlab-runner,gitlab-runner相當(dāng)于Gitlab中任務(wù)的執(zhí)行器,Gitlab會(huì)在需要執(zhí)行任務(wù)時(shí)調(diào)用它。
首先下載gitlab-runner的Docker鏡像,選用alpine-bleeding,這個(gè)版本非常小巧!
docker pull gitlab/gitlab-runner:alpine-bleeding
使用如下命令運(yùn)行g(shù)itlab-runner;
docker run --name gitlab-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /mydata/gitlab-runner:/etc/gitlab-runner -d gitlab/gitlab-runner:alpine-bleeding
此時(shí)我們?nèi)绻榭磄itlab-runner的容器日志的話,會(huì)發(fā)現(xiàn)如下錯(cuò)誤,config.toml文件找不到,這個(gè)問(wèn)題不必?fù)?dān)心,當(dāng)我們將gitlab-runner注冊(cè)到Gitlab時(shí),會(huì)自動(dòng)生成該文件;
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
接下來(lái)我們需要把gitlab-runner注冊(cè)到Gitlab,打開Project->Settings->CI/CD功能,獲取到runner注冊(cè)需要使用的地址和token;
接下來(lái)使用如下命令,進(jìn)入gitlab-runner容器的內(nèi)部;
docker exec -it gitlab-runner /bin/bash
在容器內(nèi)使用如下命令注冊(cè)runner;
gitlab-runner register
注冊(cè)時(shí)會(huì)出現(xiàn)交互界面,提示你輸入注冊(cè)地址、token、執(zhí)行器類型等信息,ssh執(zhí)行器能遠(yuǎn)程執(zhí)行Linux命令,非常好用,推薦使用這個(gè)!
注冊(cè)完成后,我們可以發(fā)現(xiàn)config.toml文件已經(jīng)生成,內(nèi)容如下,以后想修改runner配置的時(shí)候,直接改這個(gè)文件就行了。
concurrent = 1 check_interval = 0 [session_server] session_timeout = 1800 [[runners]] name = "docker-runner" url = "http://192.168.7.134:1080/" token = "c2kpV6tX6woL8TMxzBUN" executor = "ssh" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.ssh] user = "root" password = "123456" host = "192.168.7.134" port = "22"
在Gitlab的CI/CD設(shè)置中,我們可以發(fā)現(xiàn),有個(gè)runner成功注冊(cè)了!
安裝Maven
SpringBoot項(xiàng)目打包需要依賴Maven,我們需要在服務(wù)器上先安裝好它。
下載Maven的Linux安裝包,下載地址:https://maven.apache.org/down…
下載完成后使用如下命令解壓到指定目錄;
cd /mydata tar -zxvf apache-maven-3.8.1-bin.tar.gz
修改/etc/profile文件,添加環(huán)境變量配置:
export MAVEN_HOME=/mydata/apache-maven-3.8.1 export PATH=$PATH:$MAVEN_HOME/bin
通過(guò)查看Maven版本來(lái)測(cè)試是否安裝成功。
mvn -v
Maven home: /mydata/apache-maven-3.8.1 Java version: 1.8.0_292, vendor: AdoptOpenJDK, runtime: /mydata/java/jdk1.8/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
安裝JDK
CentOS上默認(rèn)安裝的是JRE,使用Maven需要安裝JDK。
下載JDK 8,下載地址:https://mirrors.tuna.tsinghua…
下載完成后將JDK解壓到指定目錄;
cd /mydata/java tar -zxvf OpenJDK8U-jdk_x64_linux_xxx.tar.gz mv OpenJDK8U-jdk_x64_linux_xxx.tar.gz jdk1.8
在/etc/profile文件中添加環(huán)境變量JAVA_HOME。
vi /etc/profile # 在profile文件中添加 export JAVA_HOME=/mydata/java/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin # 使修改后的profile文件生效 . /etc/profile
使用
一切準(zhǔn)備就緒,接下來(lái)通過(guò)Gitlab的CI/CD功能就可以實(shí)現(xiàn)SpringBoot應(yīng)用的自動(dòng)化部署了!
首先在項(xiàng)目的根目錄下添加.gitlab-ci.yml文件,定義了兩個(gè)任務(wù),一個(gè)任務(wù)會(huì)將應(yīng)用代碼打包成Jar包并復(fù)制到指定目錄,另一個(gè)任務(wù)會(huì)通過(guò)運(yùn)行腳本run.sh打包應(yīng)用的Docker鏡像并運(yùn)行;
# 打包任務(wù) build-job: stage: build # 指定標(biāo)簽,只有具有該標(biāo)簽的runner才會(huì)執(zhí)行 tags: - docker script: # 使用Maven打包 - mvn clean package # 將jar包、Dockerfile、運(yùn)行腳本復(fù)制到指定目錄 - cp target/mall-tiny-gitlab-1.0-SNAPSHOT.jar /mydata/build/mall-tiny-gitlab-1.0-SNAPSHOT.jar - cp Dockerfile /mydata/build/Dockerfile - cp run.sh /mydata/build/run.sh # 部署任務(wù) deploy-job: stage: deploy tags: - docker script: # 進(jìn)入指定目錄并執(zhí)行運(yùn)行腳本 - cd /mydata/build - chmod +x run.sh - ./run.sh
這里值得一提的是,默認(rèn)情況下runner只會(huì)執(zhí)行具有相同標(biāo)簽的Job,由于我們對(duì)Job和runner都設(shè)置了標(biāo)簽為docker,所以我們這里是可以執(zhí)行的。如果你沒有設(shè)置標(biāo)簽的話,需要在runner的編輯界面設(shè)置下讓runner可以執(zhí)行沒有標(biāo)簽的Job;
由于我們的gitlab-runner采用的是ssh的執(zhí)行器,它會(huì)登錄到我們指定的服務(wù)器,執(zhí)行我們?cè)?gitlab-ci.yml中定義的script命令,在此之前還會(huì)先從Git倉(cāng)庫(kù)中獲取代碼,所以我們還需修改下服務(wù)器上的host文件;
vim /etc/hosts 192.168.7.134 git.macrozheng.com
接下來(lái)就是要把腳本提交到Git倉(cāng)庫(kù)上去,提交后會(huì)在Project->CI/CD->Pipelines中發(fā)現(xiàn)正在執(zhí)行的任務(wù);
打開Pipeline的詳情頁(yè)面,可以發(fā)現(xiàn)我們定義的兩個(gè)任務(wù)都已經(jīng)執(zhí)行成功了;
打開Job的詳情界面,我們可以看到任務(wù)執(zhí)行過(guò)程中輸出的日志信息;
如果你想手動(dòng)執(zhí)行Pipeline,而不是提交觸發(fā)的話,可以在Pipelines頁(yè)面點(diǎn)擊Run Pipeline按鈕即可;
運(yùn)行成功后,可以通過(guò)如下地址訪問(wèn)項(xiàng)目:http://192.168.7.134:8088/swa…
總結(jié)
如果你用Gitlab作為Git倉(cāng)庫(kù)的話,使用它的CI/CD功能來(lái)實(shí)現(xiàn)自動(dòng)化部署確實(shí)很不錯(cuò)!安裝一個(gè)輕量級(jí)gitlab-runner,編寫簡(jiǎn)單的.gitlab-ci.yml腳本文件即可實(shí)現(xiàn)。其實(shí)我們之前以及介紹過(guò)很多種自動(dòng)化部署方案,比如Jenkins、Gogs+Drone、Gitlab CI/CD,我們可以發(fā)現(xiàn)一個(gè)共同點(diǎn),這些方案都離不開Linux命令。 所以說(shuō)要想玩轉(zhuǎn)自動(dòng)化部署,還是得先玩轉(zhuǎn)Linux命令!
相關(guān)視頻教程推薦:Java視頻教程