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

江北、發表於2020-11-25

上圖三位大家應該很熟悉吧?,藉助這三者可以讓我們的服務在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  檢視外掛詳細資訊的地址:https://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檔案並拷貝到指定位置,並配置好監聽的埠即可。

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

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

相關文章