在Jenkins的幫助下讓我們的應用CI與CD

上圖三位大家應該很熟悉吧😄,藉助這三者可以讓我們的服務在Linux環境下持續集成、容器中持續部署。

本篇部落格的項目是core webapi, .NET 5.0 在11號已經正式發布了,你們的項目都升級了嗎?😊

在開始之前,所需要的的環境要提前準備一下

Centos7.x(連Linux系統都沒有還整啥?😄)
jdk1.8(Jenkins和Docker的運行都需要依賴jdk)
Docker(項目最終運行於容器中)
jenkins(這個是CI、CD的關鍵)
dotnet core環境(編譯我們的項目)
gitlab (用於託管程式碼的倉庫)

安裝jdk

yum install java-1.8.0-openjdk

安裝Docker

先執行命令(使用官方腳本自動安裝):curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker安裝完成之後我們執行Docker images 命令時,會報如下錯誤:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
我們需要再執行以下命令:systemctl enable docker #開機自動啟動docker
                    systemctl start docker #啟動docker
                    systemctl restart docker #重啟docker

安裝DotNet Core環境

1.安裝sudo:
  yum install sudo
2.將 Microsoft 包簽名密鑰添加到受信任密鑰列表,並添加 Microsoft 包存儲庫:
  sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
3.安裝.Net Core SDK(會自動安裝相應的運行時):
  sudo yum install dotnet-sdk-3.1

 安裝Jenkins

1.拉取庫的配置到本地對應文件:
  wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 
2.導入公鑰:
  rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
3.使用yum安裝我們的jenkins:
  yum install -y jenkins 
4.啟動我們的jenkins:
執行service jenkins start命令運行我們的Jenkins,打開ip:8080(Jenkins默認為8080埠)

我用的是gitlab倉庫管理我的項目,你也可以用Gogs、碼雲等。工具不重要,原理其實都一樣。

下面說一下流程:

1.本地提交我們的程式碼至倉庫
2.倉庫觸發Jenkins來構建我們的項目
3.執行shell腳本來發布我們的項目至指定文件下
4.停止、刪除容器
5.根據DockerFile構建鏡像,啟動我們的項目

 之前有幸開發過一個java的項目,當時那個項目就是以jenkins來自動化發布構建的。太方便了,特別是團隊協作開發的時候,提交即部署,不需要有人手動來編譯發布。

 ok!話不多說😂

來到Jenkins面板頁

這裡的話我們要安裝幾個插件來協助我們進行自動化構建:

1.Build Authorization Token Root Plugin  查看插件詳細資訊的地址://plugins.jenkins.io/build-token-root
2.GitLab Plugin與Gitlab Hook Plugin

除此之外伺服器要安裝Git,不然建立程式碼拉取請求的時候會報錯

Jenkins啟動的時候會創建一個’jenkins’的用戶來運行此服務,我們需要把這個用戶改為root,不改的話執行shell腳本時會提示沒有操作許可權

新建一個任務

 在源碼管理中選擇Git,地址的話填寫你遠程倉庫的地址就行了,添加的憑據中只需填寫用戶名和密碼就行了

 在構建觸發器中勾選以下兩個方式,令牌的話自己找一個即可,這個令牌到時候會在gitlab的webhooks配置中用到

 在構建方式中選擇執行shell

shell腳本如下:

dotnet publish -p:PublishDir=/home/core #發布我們的項目至/home/core目錄下
cp -r /var/lib/jenkins/workspace/automation/automation/Dockerfile /home/core #copy我們的DockerFile文件到/home/core文件下
docker build -t corecode /home/core/ #通過DockerFile構建鏡像
docker run -d -p 8009:8009 --restart=always --name corecode corecode #啟動容器

到此,Jenkins的配置工作就完了。我們還需要將gitlab與jenkins之間建立連接,從而觸發構建的動作。

進入對應的項目工程內,選擇鉤子

我們在push程式碼的時候,會觸發對應事件。如果上面的資訊都填寫完之後,將這個鉤子提交即可。

我們上面的shell腳本中有一行會拷貝我們項目中的DockerFile文件至指定目錄中,所以我們要把DockerFile文件放到web層中,這樣好拷貝一些。😉

 這裡的DockerFile文件是我自己寫的,你也可以在項目中添加Docker支援,不過它生成的DockerFile文件你還是得手動改一下😂

 DockerFile文件中的腳本如下:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim #依賴的基礎鏡像,第一次pull的時候會很慢,之後會很快(聯合文件系統)
WORKDIR /app/work #工作目錄
EXPOSE 8009 #對外的埠
COPY . . #將本地的文件拷貝到容器鏡像中
#容器內同步上海的時間
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
CMD ["dotnet", "automation.dll"]  #運行我們的項目

 提交我們的程式碼,在gitlab上查看我們的鉤子狀態,如果是201的狀態碼證明是成功的。如果是403的話,一定要檢查好url資訊,實在不行重啟一下jenkins(之前重啟一下就好了😅)

 第一次執行完之後,我們需要更改一下shell腳本。刪除掉打包鏡像的文件夾下的文件,並且移除掉容器.

rm -rf /home/core/*
dotnet publish -p:PublishDir=/home/core
cp -r /var/lib/jenkins/workspace/automation/automation/Dockerfile /home/core
docker stop corecode
docker rm corecode
docker rmi corecode
docker build -t corecode /home/core/
docker run -d -p 8009:8009 --restart=always --name corecode corecode

是不是覺得方便多了?按照上面的流程,就如下面這張圖一樣😉

這是單機的流程,如果是分散式的話就另論了。如果服務之間耦合度比較高,更新的時候就得有個先後,具體的以同學們實際業務場景為主,這裡的話希望能有個拋磚引玉的作用!😊

當然如果你要用nginx做靜態代理部署前端項目,其實也是一樣的,每次打包一個新的dist文件並拷貝到指定位置,並配置好監聽的埠即可。

本片部落格到這裡就結束了,如果您在配置的過程中遇到什麼問題可以與我交流。如果有什麼不足的地方請擔待!😅

路漫漫其修遠兮吾將上下而求索,我相信您也一樣。我叫張韜,一名成長中的全棧攻城獅(努力中…😄)