.NET Core部署到linux(CentOS)最全解決方案,入魔篇(使用Docker+Jenkins實現持續整合、自動化部署)
阿新 • • 發佈:2021-01-28
通過前面三篇:
[.NET Core部署到linux(CentOS)最全解決方案,常規篇](http://blog.rdiframework.net/article/244)
[.NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx)](http://blog.rdiframework.net/article/245)
[.NET Core部署到linux(CentOS)最全解決方案,高階篇(Docker+Nginx 或 Jexus)](http://blog.rdiframework.net/article/246)
通過前面三篇文章的介紹,我們已經對.net core多方案部署到linux下有了非常全面的認識,小型團隊已經足夠使用。雖然目前的方案可以實現一鍵部署更新,但是還是需要登陸到linux伺服器去執行相應的命令。
顯示,這不是最優的方案,那麼還有沒有更好的方案呢?比如:當我們提交給git倉庫後,自動出發部署命令是不是就更方便了呢?
答案是肯定的,我們可以藉助jenkins來實現。
網際網路軟體的開發和釋出,已經形成了一套標準流程,最重要的組成部分就是持續整合(Continuous integration,簡稱 CI) 。
## 1、CI/CD
![ci/cd](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162805705-511766863.png)
### 1.1、持續整合
> continuous integration 持續整合是一種軟體實踐,流程為:開發 => 打包 => 整合 => 測試
![ci](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162806254-2026122371.png)
### 1.2、持續交付
> continuous delivery 持續交付是一種軟體工程手法,流程為:測試 => 釋出
![cd](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162810533-21840472.png)
### 1.3、持續部署
> continous deployment 持續部署是在持續交付的管道中釋出版本給終端使用者的一種軟體工程流程,流程為:釋出 => 部署上線
![cd](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162811007-269666518.png)
## 2、Jenkins
> Jenkins 是一個基於Java語言開發的CI持續構建工具,主要用於持續、自動的構建/測試軟體專案。它可以執行你預先設定好的設定和指令碼,也可以和 Git工具做整合,實現自動觸發和定時觸發器構建。
![image-20210122181431364](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162811691-1738183108.png)
jenkins官網:[https://www.jenkins.io/](https://www.jenkins.io/)
![jenkins](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162812253-1674173898.png)
### 2.1、安裝jenkins
**安裝docker-conpose**
因為jenkins需要用到本地的docker-compose環境,執行以下命令安裝
```
docker exec -it jenkins /bin/bash
```
進入**容器內部**安裝docker-compose,[安裝步驟去](https://github.com/yeasy/docker_practice/blob/master/compose/install.md)
**1、構建自定義的Dockerfile**
```dockerfile
# touch Dockerfile
# vim Dockerfile
```
編寫Dockerfile:
```dockerfile
FROM jenkins/jenkins
USER root
# 清除了基礎映象設定的源,切換成阿里雲源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源並安裝缺少的包
RUN apt-get update && apt-get install -y libltdl7 && apt-get update
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
# 安裝 docker-compose 因為等下構建環境的需要
RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
```
![構建自定義的Dockerfile](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162812733-1009690752.png)
如果不安裝 libltdl7 會導致如下這個問題,原因是jenkins容器內部沒有這個包
```shell
docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory
Build step 'Execute shell' marked build as failure
```
在Jenkins操作宿主的Docker的時候會出現拒絕訪問的問題,其實就是容器的jenkins使用者沒有許可權訪問容器外的docker命令,所以 RUN命令 需要把Jenkins使用者加入到Docker使用者組
**2、構建jenkins映象**
```
docker build . -t auto-jenkins
```
![構建jenkins映象](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162813238-2102924428.png)
看到以下字樣就構建成功了。
> Successfully built 80a4f61b5b6f
> Successfully tagged auto-jenkins:latest
![構建成功](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162816080-257659294.png)
**3、建立jenkins專案檔案的掛載目錄**
```
mkdir -p /var/jenkins_home
```
**4、修改目錄許可權**
> 這一步必不可少!會導致許可權不足報錯
```
chown -R 1000 /var/jenkins_home
```
**5、run我們自定義jenkins映象 auto-jenkins**
> 這裡我用7080作為對外的jenkins ip(因為我的8080被佔用了)
```
docker run --name jenkins -p 7080:8080 -p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-v /var/jenkins_home:/var/jenkins_home \
-d auto-jenkins
```
使用`docker ps` 檢視執行中的容器,如看到如下圖,表示jenkins已正常啟動:
![檢視執行中的容器](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162816687-1665686554.png)
**6、完成jenkins安裝**
訪問 [http://你的伺服器ip:7080](http://xn--ip-0p3cl7jf7fo83a16x:7080/)
![jenkins首次執行](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162817005-1931690379.png)
這裡需要安裝密碼,證明這是你的伺服器,進入容器:
```
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
```
如下圖所示,生成好了密碼;
![image-20210122154143440](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162817723-378332967.png)
複製密碼後,單擊繼續按鈕。
![安裝推薦的外掛](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162818220-1269811421.png)
如圖,點選"安裝推薦的外掛",安裝jenkins常用外掛
![安裝推薦的外掛](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162818745-2021821484.png)
安裝完畢後,需要建立一個管理員使用者賬號,如下圖所示。
![建立管理員賬號](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162820019-381556878.png)
提示:安裝過程如果某個元件失敗,可以重試一下。
![重試安裝過程失敗的元件](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162820456-2069730808.png)
到這裡,jenkins安裝結果,填寫完管理員資訊後,接下來開始jenkins自動化部署之旅。
![jenkins安裝完成](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162820723-309676751.png)
安裝成功後,Jenkins主介面:
![Jenkins執行成功](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162821231-1198509278.png)
### 2.2、jenkins配置
**1、建立一個jenkins專案**
**新建專案**
![新增Item](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162821647-111438132.png)
**構建一個自由風格的軟體專案**
![新增任務](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162822132-222081965.png)
**2、原始碼管理**
> 這裡可以指定git分支
![git原始碼](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162822521-537221721.png)
如果專案配置了公鑰,那麼在上圖中,我們還需要配置憑證,否則是不能連結到git倉庫的,如下圖所示。
![原始碼管理憑證新增](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162823063-1860695401.png)
![原始碼管理](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162823554-505763328.png)
**3、構建觸發器**
> 這裡的是設定輪詢去git拉取程式碼,如果程式碼有更新就觸發構建操作,`H/2 * * * *` 是指每2分鐘輪詢拉取一次;
![構建觸發器](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162824822-2039401853.png)
**4、構建環境**
> Abort the build if it's stuck 是指如果構建過程中卡住了,就終止構建;這裡是5是5分鐘,5分鐘超時構建失敗;
![構建環境](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162825224-1121630048.png)
**5、新增構建指令碼Execute Shell**
![新增構建指令碼Execute Shell](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162825517-2031748529.png)
填寫構建指令碼
```shell
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
# 停止之前的docker container
CID=$(docker ps | grep "core50test" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
docker stop $CID
docker rm $CID
fi
#docker stop core50test;
# 刪除這個container
#docker rm core50test;
# build映象並且打上tag
docker build -t core50test:$image_version .;
docker images;
# 把剛剛build出來的映象跑起來
docker run -p 8066:5000 --name core50test -d core50test:$image_version;
docker logs core50test;
```
![shell](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162826060-1312743917.png)
點選儲存回到core50test專案介面
![core50test專案](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162826487-1687466250.png)
單擊上圖名稱為"core50test"的專案,點選“立即構建”
![立即構建](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162827001-372504875.png)
![構建歷史](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162827394-1096197645.png)
構建控制檯輸出
![image-20210125160313617](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162827613-680616746.png)
構建成功,現在開啟 [http://你的伺服器ip:5000](http://xn--ip-0p3cl7jf7fo83a16x:5006/),可以看到我們的網站:
![構建成功](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162828109-2062940392.png)
如果網站有任何更改,提交程式碼,jenkins會自動拉取程式碼,併發佈一個新的容器,等等重新整理瀏覽器就行了;
![構造狀態](https://img2020.cnblogs.com/news/157572/202101/157572-20210126162828650-1231814390.png)
**構建狀態**
> **Successful藍色**:構建完成,並且被認為是穩定的。
>
> **Unstable黃色**:構建完成,但被認為是不穩定的。
>
> **Failed紅色**:構建失敗。
>
> **Disable灰色**:構建已禁用
**構建穩定性**
> 構建穩定性用天氣表示:**晴、晴轉多雲、多雲、小雨、雷陣雨**。天氣越好表示構建越穩定,反之亦然。
最後借用一張Jenkins的思維導圖供大家參考:
![Jenkins的思維導圖](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162829055-1807068893.png)
-----
一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址瞭解詳情。
RDIFramework.NET官方網站:[http://www.rdiframework.net/](http://www.rdiframework.net/)
RDIFramework.NET官方部落格:[http://blog.rdiframework.net/](http://blog.rdiframework.net/)
特別說明,框架相關的技術文章請以官方網站為準,歡迎大家收藏!
RDIFramework.NET框架由海南國思軟體科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用!
歡迎關注RDIFramework.NET框架官方微信公眾號(微訊號:**guosisoft**),及時瞭解最新動態。
使用微信掃描二維碼立即關注
![微訊號:**guosisoft**](https://img2020.cnblogs.com/blog/157572/202101/157572-20210126162829401-1779472876.png)