在之前,要實現自動化打包部署,一般都需要藉助Jenkins。不過,現在Gitlab的CI/CD功能也能實現自動化部署,並且操作更加簡單。如果你也正在使用Gitlab作為Git倉庫的話,不妨試試它的CI/CD功能。
一、安裝
通過Gitlab的CI/CD功能實現自動化部署,我們需要安裝Gitlab、Gitlab Runner、Maven這些服務。
1.1 安裝Gitlab
首先,我們需要在我們自己的伺服器上安裝Gitlab,如果還不知道怎麼安裝,可以參考《10分鐘搭建自己的Git倉庫》 。
為了避免一些不必要的麻煩,我們可以使用如下命令執行Gitlab服務,這裡需要注意的是新增了hostname屬性,這樣我們就可以通過域名來訪問Gitlab了,GITLAB_ROOT_PASSWORD這個環境變數可以直接設定Gitlab中root賬號的密碼:
docker run --detach \
--hostname git.bilibili.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
然後,我們就可以通過git.bilibili.com這個域名來訪問Gitlab,如果你沒有域名的話,可以通過修改本機的host檔案來實現:
192.168.7.134 git.bilibili.com
由於我們的Gitlab執行在1080埠,如果我們想要不加埠來進行訪問,可以使用Nginx的反向代理進行處理,對Nginx不熟悉的朋友可以看下《Nginx的這些妙用,你肯定有不知道的!》 。下面是Nginx的配置資料夾中新增的git.conf配置檔案,內容如下:
server {
listen 80; # 同時支援HTTP
server_name git.bilibili.com; #修改域名
location / {
proxy_pass http://192.168.7.134:1080; # 設定代理服務訪問地址
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
完成之後,我們就可以通過git.bilibili.com這個域名來訪問Gitlab了,輸入賬號密碼root:12345678即可登入。
將我們的SpringBoot應用程式碼上傳到Gitlab上去,這樣Gitlab就準備完畢了!這裡需要注意的是,如果你在啟動Gitlab的時候沒有指定hostname的話,你的專案HTTP訪問地址會是容器的ID,使用該地址會無法訪問Git倉庫!
1.2 安裝Gitlab Runner
Gitlab只是個程式碼倉庫,想要實現CI/CD還需安裝gitlab-runner,gitlab-runner相當於Gitlab中任務的執行器,Gitlab會在需要執行任務時呼叫它。
首先,下載gitlab-runner的Docker映象,選用alpine-bleeding,這個版本非常小巧。
docker pull gitlab/gitlab-runner:alpine-bleeding
然後,使用如下命令執行gitlab-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
此時,我們如果檢視gitlab-runner的容器日誌的話,會發現如下錯誤,config.toml檔案找不到。這個問題不必擔心,當我們將gitlab-runner註冊到Gitlab時,會自動生成該檔案。
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
接下來,我們需要把gitlab-runner註冊到Gitlab,開啟Project->Settings->CI/CD功能,獲取到runner註冊需要使用的地址和token。
接下來,使用如下命令進入gitlab-runner容器的內部。
docker exec -it gitlab-runner /bin/bash
然後,在容器內使用如下命令註冊runner。
gitlab-runner register
註冊時會出現互動介面,提示你輸入註冊地址、token、執行器型別等資訊,ssh執行器能遠端執行Linux命令等,如下所示。
註冊完成後,我們可以發現config.toml檔案已經生成,內容如下,以後想修改runner配置的時候,直接改這個檔案就行了。
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上的專案,然後在Gitlab的CI/CD設定中就可以發現runner成功註冊了!
1.3 安裝Maven
SpringBoot專案打包需要依賴Maven,我們需要在伺服器上先安裝好它。首先,下載Maven的Linux安裝包,下載地址。
下載完成後,使用如下命令解壓到指定目錄。
cd /mydata
tar -zxvf apache-maven-3.8.1-bin.tar.gz
接著,修改/etc/profile檔案,新增環境變數配置。
export MAVEN_HOME=/mydata/apache-maven-3.8.1
export PATH=$PATH:$MAVEN_HOME/bin
我們可以使用mvn -v命令來測試Maven是否安裝成功。
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"
1.4 安裝JDK
CentOS上預設安裝的是JRE,使用Maven需要安裝JDK。首先,下載JDK 8。
下載完成後,將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檔案中新增環境變數JAVA_HOME。
vi /etc/profile
# 在profile檔案中新增
export JAVA_HOME=/mydata/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# 使修改後的profile檔案生效
. /etc/profile
二、使用CI/CD進行部署
一切準備就緒,接下來通過Gitlab的CI/CD功能就可以實現SpringBoot應用的自動化部署了!首先,在專案的根目錄下新增.gitlab-ci.yml檔案,定義了兩個任務,一個任務會將應用程式碼打包成Jar包並複製到指定目錄,另一個任務會通過執行指令碼run.sh打包應用的Docker映象並執行。
# 打包任務
build-job:
stage: build
# 指定標籤,只有具有該標籤的runner才會執行
tags:
- docker
script:
# 使用Maven打包
- mvn clean package
# 將jar包、Dockerfile、執行指令碼複製到指定目錄
- 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
# 部署任務
deploy-job:
stage: deploy
tags:
- docker
script:
# 進入指定目錄並執行執行指令碼
- cd /mydata/build
- chmod +x run.sh
- ./run.sh
需要說明的是,預設情況下runner只會執行具有相同標籤的Job,由於我們對Job和runner都設定了標籤為docker,所以我們這裡是可以執行的。如果你沒有設定標籤的話,需要在runner的編輯介面設定下讓runner可以執行沒有標籤的Job。
由於我們的gitlab-runner採用的是ssh的執行器,它會登入到我們指定的伺服器,執行我們在.gitlab-ci.yml中定義的script命令,在此之前還會先從Git倉庫中獲取程式碼,所以我們還需修改下伺服器上的host檔案。
vim /etc/hosts
192.168.7.134 git.bilibili.com
接下來就是要把指令碼提交到Git倉庫上去,提交後會在Project->CI/CD->Pipelines中發現正在執行的任務。
開啟Pipeline的詳情頁面,可以發現我們定義的兩個任務的執行結果。
開啟Job的詳情介面,我們可以看到任務執行過程中輸出的日誌資訊。
如果你想手動執行Pipeline,而不是提交觸發的話,可以在Pipelines頁面點選Run Pipeline按鈕即可。
可以看到,使用它的CI/CD功能來實現自動化部署確實很不錯!安裝一個輕量級gitlab-runner,編寫簡單的.gitlab-ci.yml指令碼檔案即可實現。