上圖三位大家應該很熟悉吧😄,借助這三者可以讓我們的服務在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文件並拷貝到指定位置,並配置好監聽的端口即可。
本片博客到這里就結束了,如果您在配置的過程中遇到什么問題可以與我交流。如果有什么不足的地方請擔待!😅
路漫漫其修遠兮吾將上下而求索,我相信您也一樣。我叫張韜,一名成長中的全棧攻城獅(努力中...😄)