廬山真面目之十一微服務架構手把手教你搭建基於Jenkins的企業級CI/CD環境

                廬山真面目之十一微服務架構手把手教你搭建基於Jenkins的企業級CI/CD環境

一、介紹
      說起微服務架構來,有一個環節是少不了的,那就是CI/CD持續集成的環境。當然,搭建CI/CD環境的工具很多,但是有一個工具它卻是出類拔萃,是搭建持續集成環境的首選,它就是Jenkins。在這裏,有關Jenkins的具體內容我就不說了,網上有很多,我在這裏只做很簡單的介紹。Jenkins 自動化部署可以解決集成、測試、部署等重複性的工作,工具集成的效率明顯高於人工操作;並且持續集成可以更早的獲取代碼變更的信息,從而更早的進入測試階段,更早的發現問題,這樣解決問題的成本就會顯著下降:持續集成縮短了從開發、集成、測試、部署各個環節的時間,從而也就縮短了中間出現的等待時間;持續集成也意味着開發、集成、測試、部署得以持續。我們今天就開始搭建一個企業級別的CI/CD的環境,這個內容很多,也需要有很多的基礎,比如:必須安裝Docker了,必須會使用Linux系統,必須會使用Git,對GitHub比較熟悉,當然也要對Net5.0有所認識,等等還有很多,這些基礎知識,我假定大家都是熟悉的,畢竟,文章要有主有次。

二、準備工作

          1、開發環境升級,將Net Core3.1的環境升級爲 Net5.0
                   官方文檔:https://docs.microsoft.com/zh-cn/aspnet/core/migration/31-to-50?view=aspnetcore-5.0&tabs=visual-studio#prerequisites
                   下載地址:https://dotnet.microsoft.com/download/dotnet/5.0

          2、安裝 Git 源代碼託管工具。
                在工作開始之前,先要檢查自己是否安裝了Git工具,如果安裝了,就可以跳過本節,如果沒有安裝,那就跟着我們開始安裝吧。當然了,安裝完成之後,我們還要配置Visual Studio 2019 的源代碼管理工具是 Git,很簡單,我就不寫了。
                  (1)、去官網下載Git的安裝文件,地址::https://git-scm.com/downloads/
                            

                  (2)、將下載下來的 Git 安裝包,存在自己的目錄裏,文件名:Git-2.30.0-64-bit.exe,雙擊該文件開始安裝。                  
              

                  (3)、選擇安裝的組件,保持默認就好(我的選擇)。
                            

                  (4)、選擇默認編輯器,保持默認就好(我的選擇)。
                            

                  (5)、可以修改默認分支的名稱,我選擇保持默認(我的選擇)。                   
              

                  (6)、可以設置環境變量,保持默認就可以(我的選擇)。                   
              

                  (7)、選擇Https 傳輸協議,保持默認。                   
              

                  (8)、配置終端使用 Git Bash,保持默認就好。                   
              

                  (9)、配置行未的轉換符。
              

                  (10)、選擇“git pull”的默認行爲,默認選擇。                   
              

                  (11)、選擇憑據幫助程序。
                            

                  (12)、配置額外選項。
                            

                  (13)、配置實驗選項。
                            

                  (14)、開始安裝。                   
              

                  (15)、安裝成功。                   
              

                  (16)、如何判斷 Git 是否安裝成功,在空白地方(任何地方),點擊右鍵,出現如圖效果表示安裝成功。
                            

          3、新建一個Net5.0的項目,然後將其上傳至 Git 服務器。         
                 由於是測試項目,所以每個項目的代碼都很簡單,因爲代碼不是重點。
                  
                  (1)、新建項目                   
                            【1】、PatrickLiu.CICD.Clients(Asp.Net Core WebApi),一個Core API項目。
                                       
                    代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Threading;
  5 using Microsoft.AspNetCore.Mvc;
  6 using Microsoft.Extensions.Configuration;
  7 using Microsoft.Extensions.Logging;
  8 using PatrickLiu.CICD.Interfaces;
  9 using PatrickLiu.CICD.Models;
 10 
 11 namespace PatrickLiu.CICD.Clients.Controllers
 12 {
 13     /// <summary>
 14     /// 用戶的 API 類型。
 15     /// </summary>
 16     [Route("api/[controller]")]
 17     [ApiController]    
 18     public class UsersController : ControllerBase
 19     {
 20         #region 私有字段
 21 
 22         private readonly ILogger<UsersController> _logger;
 23         private readonly IUserService _userService;
 24         private IConfiguration _configuration;
 25 
 26         #endregion
 27 
 28         #region 構造函數
 29 
 30         /// <summary>
 31         /// 初始化該類型的新實例。
 32         /// </summary>
 33         /// <param name="logger">日誌記錄器。</param>
 34         /// <param name="userService">用戶服務接口。</param>
 35         /// <param name="configuration">配置服務。</param>
 36         public UsersController(ILogger<UsersController> logger, IUserService userService, IConfiguration configuration)
 37         {
 38             _logger = logger;
 39             _userService = userService;
 40             _configuration = configuration;
 41         }
 42 
 43         #endregion
 44 
 45         #region 實例方法
 46 
 47         /// <summary>
 48         /// 獲取一條記錄
 49         /// </summary>
 50         /// <param name="id"></param>
 51         /// <returns></returns>
 52         [HttpGet]
 53         [Route("Get")]
 54         public User Get(int id)
 55         {
 56             return _userService.FindUser(id);
 57         }
 58 
 59         /// <summary>
 60         /// 獲取所有記錄。
 61         /// </summary>
 62         /// <returns></returns>
 63         [HttpGet]
 64         [Route("All")]
 65         //[Authorize]
 66         public IEnumerable<User> Get()
 67         {
 68             Console.WriteLine($"This is UsersController {this._configuration["port"]} Invoke");
 69 
 70             return this._userService.UserAll().Select((user => new User
 71             {
 72                 ID = user.ID,
 73                 Name = user.Name,
 74                 Account = user.Account,
 75                 Password = user.Password,
 76                 Email = user.Email,
 77                 Role = $"{this._configuration["ip"]}:{this._configuration["port"]}",
 78                 LoginTime = user.LoginTime
 79             })); ;
 80         }
 81 
 82         /// <summary>
 83         /// 超時處理
 84         /// </summary>
 85         /// <returns></returns>
 86         [HttpGet]
 87         [Route("Timeout")]
 88         public IEnumerable<User> Timeout()
 89         {
 90             Console.WriteLine($"This is Timeout Start");
 91             //超時設置。
 92             Thread.Sleep(3000);
 93 
 94             Console.WriteLine($"This is Timeout End");
 95 
 96             return this._userService.UserAll().Select((user => new User
 97             {
 98                 ID = user.ID,
 99                 Name = user.Name,
100                 Account = user.Account,
101                 Password = user.Password,
102                 Email = user.Email,
103                 Role = $"{this._configuration["ip"]}:{this._configuration["port"]}",
104                 LoginTime = user.LoginTime
105             })); ;
106         }
107 
108         #endregion
109     }
110 }

 

 1 using Microsoft.AspNetCore.Builder;
 2 using Microsoft.AspNetCore.Hosting;
 3 using Microsoft.Extensions.Configuration;
 4 using Microsoft.Extensions.DependencyInjection;
 5 using Microsoft.Extensions.Hosting;
 6 using Microsoft.OpenApi.Models;
 7 using PatrickLiu.CICD.Interfaces;
 8 using PatrickLiu.CICD.Services;
 9 
10 namespace PatrickLiu.CICD.Clients
11 {
12     public class Startup
13     {
14 
15         /// <summary>
16         /// 
17         /// </summary>
18         /// <param name="services"></param>
19         public void ConfigureServices(IServiceCollection services)
20         {
21             services.AddSingleton<IUserService, UserService>();
22             services.AddControllers();
23             services.AddSwaggerGen(c =>
24             {
25                 c.SwaggerDoc("v1", new OpenApiInfo { Title = "PatrickLiu.CICD.Clients", Version = "v1" });
26             });
27         }        
28     }
29 }


                            【2】、PatrickLiu.CICD.Interfaces(Net Core 類庫項目),定義抽象接口。
                                       
                    代碼如下

 1 using PatrickLiu.CICD.Models;
 2 using System.Collections.Generic;
 3 
 4 namespace PatrickLiu.CICD.Interfaces
 5 {
 6     /// <summary>
 7     /// 用戶服務的接口定義。
 8     /// </summary>
 9     public interface IUserService
10     {
11         /// <summary>
12         /// 查找指定主鍵的用戶實例對象。
13         /// </summary>
14         /// <param name="id">用戶的主鍵。</param>
15         /// <returns>返回查找到的用戶實例對象。</returns>
16         User FindUser(int id);
17 
18         /// <summary>
19         /// 獲取所有用戶的實例集合。
20         /// </summary>
21         /// <returns>返回所有的用戶實例。</returns>
22         IEnumerable<User> UserAll();
23     }
24 }


                            【3】、PatrickLiu.CICD.Models(Net Core 類庫項目),定義數據模型。
                                       
                    代碼如下:

 1 using System;
 2 
 3 namespace PatrickLiu.CICD.Models
 4 {
 5     /// <summary>
 6     /// 用戶模型。
 7     /// </summary>
 8     public class User
 9     {
10         /// <summary>
11         /// 獲取或者設置用戶主鍵。
12         /// </summary>
13         public int ID { get; set; }
14 
15         /// <summary>
16         /// 獲取或者設置用戶姓名。
17         /// </summary>
18         public string Name { get; set; }
19 
20         /// <summary>
21         /// 獲取或者設置用戶賬號名稱。
22         /// </summary>
23         public string Account { get; set; }
24 
25         /// <summary>
26         /// 獲取或者設置用戶密碼。
27         /// </summary>
28         public string Password { get; set; }
29 
30         /// <summary>
31         /// 獲取或者設置用戶的電子郵箱地址。
32         /// </summary>
33         public string Email { get; set; }
34 
35         /// <summary>
36         /// 獲取或者設置用戶角色。
37         /// </summary>
38         public string Role { get; set; }
39 
40         /// <summary>
41         /// 獲取或者設置用戶的登錄時間。
42         /// </summary>
43         public DateTime LoginTime { get; set; }
44     }
45 }


                            【4】、PatrickLiu.CICD.Services(Net Core 類庫項目),定義服務實現類型。
                                       
                    代碼如下:                    

 1 using PatrickLiu.CICD.Interfaces;
 2 using PatrickLiu.CICD.Models;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 
 7 namespace PatrickLiu.CICD.Services
 8 {
 9     /// <summary>
10     /// 實現用戶服務接口的實現類型。
11     /// </summary>
12     public class UserService : IUserService
13     {
14         private IList<User> dataList;
15 
16         /// <summary>
17         /// 初始化類型的實例
18         /// </summary>
19         public UserService()
20         {
21             dataList = new List<User>()
22             { new User {ID=1,Name="黃飛鴻-修改",Account="HuangFeiHong",Password="HuangFeiHong123456",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now },
23             new User {ID=2,Name="洪熙官",Account="HongXiGuan",Password="HongXiGuan54667",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-5) },
24             new User {ID=3,Name="方世玉",Account="FangShiYu",Password="FangShiYu112233",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-30) },
25             new User {ID=4,Name="苗翠花",Account="MiaoCuiHua",Password="MiaoCuiHua887766",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-90) },
26             new User {ID=5,Name="嚴詠春2",Account="YanYongChun",Password="YanYongChun09392",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddMinutes(-50) }};
27         }
28 
29         /// <summary>
30         /// 查找指定主鍵的用戶實例對象。
31         /// </summary>
32         /// <param name="id">用戶的主鍵。</param>
33         /// <returns>返回查找到的用戶實例對象。</returns>
34         public User FindUser(int id)
35         {
36             return dataList.FirstOrDefault(user => user.ID == id);
37         }
38 
39         /// <summary>
40         /// 獲取所有用戶的實例集合。
41         /// </summary>
42         /// <returns>返回所有的用戶實例。</returns>
43         public IEnumerable<User> UserAll()
44         {
45             return dataList;
46         }
47     }
48 }


                  (2)、在Visual Studio 2019中增加Git賬號。
                            如果沒有在Visual Studio 2019種添加賬號,那就增加一下,方便進行Git相關操作。

                            【1】、點擊 Visual Studio 2019 【幫助】菜單,選擇【註冊產品】,打開添加賬號窗口。
                                      
                            【2】、點擊【所有賬戶】右邊的【+添加】菜單,將 GitHub 賬號增加進來。
                                       

                            【3】、如果已經添加過賬號,會顯示出來。
                                    如果沒有GitHub賬號,趕緊去申請一個,畢竟,我們要使用Git作爲我們的源代碼管理工具。說明:賬號的確認頁面,不要使用Microsoft Edge瀏覽器,因爲這個瀏覽器總是驗證(驗證圖標總是轉圈),換個瀏覽器,我使用的是 Firefox ,很快就添加成功,具體原因我還沒找到。

                  (3)將項目推送至Git服務器。

                             【1】、在【解決方案】上點擊右鍵,選擇【Git創建遠程倉庫】,打開創建倉庫的窗體。
                                      

                             【2】、打開【創建GIT存儲庫】頁面,進行設置,去掉【專用】選項,很簡單就不多說了。
                                     

                             【3】、點擊按鈕【創建並推送】,完成操作。
                                     完成操作,已經將我們的項目成功推送到 Github服務器

                  (4)、檢查Github服務器上是否存在我們的項目。
                            

三、開始搭建環境

             1、準備4臺服務器,構建企業級別 CI/CD 環境。

        (1)、Jenkins 持續集成服務器,地址:192.168.127.146。

        (2)、Docker Harbor 私服服務器,地址:192.168.127.143。

        (3)、Docker 鏡像構建服務器,地址:192.168.127.144。

        (4)、發佈服務器,地址:192.168.127.145。

             2、搭建 Jenkins 持續集成服務器,服務器地址【192.168.127.146】。
        要想搭建持續集成的環境,Jenkins是一個繞不過的話題。這臺服務器也是我們企業級持續集成環境的核心,它搭建好了,也就完成了60%配置的任務了,廢話不多說,我們開始吧,環節很多,大家要好好的看了。

                  (1)、開始安裝 Jenkins,這裏就省略了,如果想看安裝步驟,請看我的《如何在Linux(CentOS7)環境搭建 Jenkins 服務器環境》。

                            網頁地址:http://192.168.127.146:8084
                            登錄賬號:Administrator
                            登錄密碼:***********

                  (2)、登錄Jenkins服務器,點擊【Manage Jenkins--》【Global Tool Configuration】按鈕,打開【Global Tool Configuration】配置頁面。
              第一次登陸 Jenkins ,主要是爲了兩項全局配置,第一項是查看 Java 的 JDK 是否安裝好,第二項是查看 Git 是否安裝好。
                              【1】、增加JDK設置,配置JDK信息。                             
                    

                              【2】、增加Git,配置GIT執行路徑。
                                        


                              【3】、Git 執行路徑如何獲取。
                                        命令:#whereis git
                  
                  Java 的 JDK 安裝路徑可以通過命令:#which java 查看。
                  
                              
                  (3)、繼續配置,點擊【Manage Jenkins--》【Manage Plugins】,檢查Git是否安裝。
                              


                  (4)、配置 Jenkins 從 GitHub上拉取源碼,這是手動拉取的。

                            【1】、點擊【Dashboard】菜單,【新建Item】,在右側打開【Create a Job】頁面。
                                         

                            【2】、創建一個任務。
                                        
                                        工作列表如下
                                         
                            【3】、開始配置工作。
                                       
                            【4】、配置源代碼管理。
                                       

                            【5】、爲源代碼管理配置認證。
                                       

                            【6】、開始構建,從 GitHub 服務器上拉取源碼。
                                       

                            【7】、我的工作任務正在拉取源碼。
                                        

                            【8】、成功拉取源碼。
                                       
                  

                            【9】、點擊【Dashboard】--》【項目名稱】--》【工作空間】可以查看項目源碼。
                                       

                            【10】、我們要實現在 Visual Studio 2019 裏面,修改源碼,自動同步到 Jenkins 服務器。
                                         我們開始配置GitHub Server,在桌面【Dashboard】,點擊【Manage Jenkins】--》【System Configuration】--》【Configure System】,打開【Configure System】頁面。在這裏我們主要配置 GitHub,其他保持默認。

                                          1)、增加GitHub Server
                                                 

                      然後,我們點擊【管理Hook】,進入配置 Hook 頁面,點擊【覆蓋 Hook Url】,由於我們這個地址是內網地址,所以這個url不能直接使用(外網地址就不用穿透了),要通過內網穿透實現,下邊有實現方法。

                       
                        這個地址可以直接保存,後面,我把這個內網地址穿透就可以。

                                          2)、增加認證。
                                                  

                                          3)、我們獲取認證 Token,我們必須登錄 GitHub.com 服務器。

                                                  1》、點擊系統【Settings】菜單,進入設置頁面。
                                                          

                                                  2》、點擊【Developer settings】,進入設置頁面。
                                                          

                                                  3》、點擊【Personal access tokens】菜單,繼續點擊【Generate new token】按鈕。
                                                          


                                                  4》、進入【New personal access token】頁面,進入相關設置。
                                                         

                                                  5》、回到【Personal access tokens】頁面,點擊【複製】就可以獲取Token,這個 Tokens 是爲了建立 GitHub Server 通信憑據使用的,也就是步驟 2)裏面要寫的祕密文本。
                                                         


                            【11】、GitHub Server Url 不能直接用,可以通過【Nat內網穿透】實現。
                             
                                       1)、https://natapp.cn/,登錄官網,註冊賬號。
                                                

                                       2)、https://natapp.cn/,官網下載客戶端工具。
                                                  

                                       3)、登錄官網,購買【免費隧道】
                                                  

                      


                                       4)、點擊【我的隧道】--》【配置】,配置我的隧道。
                                                
                                                  開始配置。
                                                 

                      
                   

                                       5)、運行客戶端程序,登錄App,必須在APP的當前目錄。
                                              命令:#natapp -authtoken=9b25a6fb003b7a36               //每次重新執行獲取的地址都不一樣,該窗口如果長時間打開,該地址也會刷新,改變地址。
                                                 
                                    
                                       6)、獲取外網的地址。
                                                 

                                       7)、將 NatAPP 獲取的網址配置到 GitHub.Com 的 WebHook,這樣就可以通過外網訪問 Http://192.168.127.146:8084/github-webhook/。
                    

                  (5)、配置 WebHook 完成觸發 Jenkins 拉取新的源碼到本地工作空間。

                             【1】、在GitHub 右側,點擊用戶賬號圖標,選擇【Your Repositories】菜單,打開所有倉庫列表。
                                       

                             【2】、進入目標倉庫【PatrickLiu.CICD.Demo】後,點擊該項目的【Settings】菜單。
                                       
                                       進入項目,然後點擊項目的【Settings】菜單。
                                       

                             【3】、然後選擇左側【Webhooks】,然後點擊右側【Add webhook】,增加一個 Hook。
                                                               

                                       將(12)步驟中通過內網穿透生成的Url地址增加進去。
                  

                             【4】、WebHook 增加成功,恭喜,還好成功了。
                                        

                  (6)、配置 Jenkins 裏面的項目,點擊左側【My Views】,在右側點擊項目名稱旁邊的下拉菜單【配置】,進入配置頁面。
                               

                             我們要配置【構建觸發器】,選擇完畢,確認無誤後點擊【應用】,最後點擊【保存】。
                                

                  (7)、測試是否可以自動生成、拉取,看看是否能觸發我們 Hook

             經過以上步驟,我們的 Hook 配置成功,當VS2019 修改代碼,並提交到 Github 上,並觸發 Hook ,促使 Jenkins 自動拉取 Github 上的源碼到 Jenkins 中。

                                    【1】、在 Visual Studio2019 修改我們的代碼,然後提交,最後推到服務器上。

                                       

                 修改完畢,然後全部提交,最後推送到GitHub服務器。       

                         

                                    【2】、在 Jenkins 裏面,點擊左側【My Views】,然後點擊右側項目的名稱,進入該項目頁面。

                                      

                                    【3】、點擊【Build History】或者【相關鏈接】第一條記錄,進入【Build】頁面詳情。

                                       

                                    【4】、點擊左側【控制檯輸出】,在右側可以看到詳情。

                                        

                                    【5】、也可以點擊【工作空間】,右側點擊【查看】,查看項目源碼。
                  

                                 【6】、最後我們來看看源碼,是否修改了。

                  
                  源碼如下:
                  


          3、搭建 Docker Harbor 私服服務器,服務器地址【192.168.127.143】。

        我們有了私服,就不用去遠程服務器拉取有些需要的鏡像,當然,我們可以事先把一些有用的鏡像退到我們私服服務器,以後使用更方便,速度更快。

                  (1)、檢查 Docker 是否安裝,Docker-compose 是否安裝,具體安裝步驟就不寫了,因爲這個不是重點。
                              檢查 Docker 環境是否安裝,如果沒有就安裝。

              命令:#Docker --version                           

              [root@localhost143 ~]# docker --version
              Docker version 20.10.2, build 2291f61

               

              命令:yum install -y docker,執行該命令安裝 Docker,安裝完成,需要升級,因爲該版本太低。如果想升級 Docker ,可以查看我的這篇文章《如何將Docker升級到最新版本

                  (2)、檢查 Docker-compose 是否安裝,如果沒有那就安裝。
                              命令:#Docker-compose --version

                       [root@localhost143 ~]# docker-compose --version
               docker-compose version 1.25.0, build 0a186604
                                    

               以上說明已經安裝,如果提示 -bash: docker-compose: 未找到命令,說明沒有安裝。

                  (3)、如果還沒有安裝,那就安裝 Docker-compose,執行以下命令。
                              命令:#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
               命令:#chmod +x /usr/local/bin/docker-compose
              
              說明:Docker-compose 的安裝比較麻煩,所以在這裏就不詳說了,大家可以查看我的《 如何安裝快速 Docker 和 Docker-Compose 服務》,裏面有具體的安裝方法。

                  (4)、下載 Harbor,開始安裝和配置私服服務器。

                              【1】、檢查是否安裝了 Wget 命令,如果沒有安裝,要安裝可以執行以下命令。

                              命令:# yum install -y wget  
                                    

              【2】、下載 Harbor,別直接下,最好用下載工具,因爲文件太大,有 533 M(我直接保存下載,太慢,最後才用工具下載)

                                 文件地址:https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz

                                 官網:https://github.com/vmware/harbor/releases

                                 wget命令下載:#wget https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz(下載太慢,不建議,文件有533M),我是使用迅雷下載,然後在上傳到服務器吧。
                     
                  (5)、將文件上傳到服務器,文件名:harbor-offline-installer-v2.1.3.tgz
                              服務器目錄:
                                 [root@localhost143 privatefiles]# pwd
                  /root/privatefiles

                  

              文件保存:
                 [root@localhost143 ~]# ls
                /root/privatefiles/harbor-offline-installer-v2.1.3.tgz                     

                

                  (6)、進入文件保存路徑,然後,解壓文件。
                              命令:#tar xf harbor-offline-installer-v2.1.3.tgz
                              

                  (7)、進入 Harbor 目錄。
                              命令:# cd harbor
                              

                  (8)、修改 harbor.yml.tmpl文件名爲harbor.yml文件名,並進行相關配置。

                            【1】、將 harbor.yml.tmpl 文件名改成 harbor.yml。
                                        命令:#cp harbor.yml.tmpl harbor.yml
                                        

                            【2】、修改配置文件: 配置 hostname 0.0.0.0,沒有vim 就安裝:yum install vim -y 強制安裝。
                                        命令:#vim harbor.yml
                                                                     
                                        修改:hostname:192.168.127.143,註釋掉關於https 的配置。
                   

                            【3】、其他配置內容,可以熟悉一下。
                                        

                            【4】、保存退出 Vim。
                                      命令:#wq
                  
                  (9)、安裝 Harbor

                            【1】、開始安裝,執行以下命令。
                                        命令:#./install.sh
                                        
                  中間很多過程省略了。。。。
                  
                            
                            【2】、默認端口號:80,訪問地址:http://192.168.127.143:80
                                        

                  (10)、配置Harbor 私服。

                             【1】、登錄Harbor,賬號默認:admin,密碼:Harbor12345。
                                           

                             【2】、新建項目。
                                        
                  新建項目。。。
                  
                              
                             【3】、爲我們的私服服務器增加私服地址配置。

                                       1)、查看所有harbor 是否都運行在 docker 裏面。
                                               命令:# docker ps -a
                                               

                                       2)、查看Docker 後端配置文件。
                                               命令:#cat /etc/docker/daemon.json。
                                               

                                       3)、增加地址,"insecure-registries":["192.168.127.143"]。
                                               命令:#vim /etc/docker/daemon.json
                                               

                                       4)、 重新加載守護進程,加載配置。
                                               命令:#systemctl daemon-reload
                                               

                                       5)、重新啓動 Docker 服務。
                                               命令:#systemctl restart docker
                    

                             【4】、驗證 Harbor 私服是否正常運行,所有服務都不能運行。

                                       1)、網頁不能運行 。
                      

                                       2)、Harbor 服務也運行失敗。  
                                                       

                                 正常順序應該是先配置 Harbor 私服,在運行私服。
     
                             【5】、重新部署 Harbor 私服,必須在 Harbor 安裝的當前目錄,執行以下命令。

                                         1)、先關閉所有服務。
                                               命令:#docker-compose down
                                               

                                           2)、重啓所有服務。
                                               命令:#docker-compose up –d
                                               

                             【6】、查看服務和網頁是否正常運行,正常纔是成功。
                                           
                                           重新刷新頁面,頁面顯示正常頁面。
                                           

                  (11)、將鏡像推向 Harbor 私服,必須遵守以下規則,新鏡像名稱:harbar 私服IP地址:端口號/項目名/新鏡像名稱:版本號。

                             【1】、拉去一個測試的鏡像。
                                         命令:#docker pull nginx
                                         

                             【2】、給鏡像重新命名,格式:harbar 私服IP地址:端口號/項目名/新鏡像名稱:版本號
                                         命令:#docker tag nginx:latest 192.168.127.143/patrickliu.microservices/nginx:v1
                                           

                             【3】、將重新的鏡像推送至 Harbor 私服。
                                         命令:# docker push 192.168.127.143/patrickliu.microservices/nginx:v1
                                         

                             【4】、如果提示未登錄:

                        命令:#docker login 192.168.127.143
                     username:admin
                        password:Harbor12345

                             

                             【5】、再次將鏡像推向 Harbor推送。
                                       命令:# docker push 192.168.127.143/patrickliu.microservices/nginx:v1
                                        

                             【6】、檢查 Nginx 鏡像是否推送成功。
                                        
                   
                  
                   
                                                                                        
                             【7】、拉取ASP.NET CORE 鏡像,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像。
                                        #docker pull registry.cn-hangzhou.aliyuncs.com/newbe36524/aspnet:5.0-buster-slim
                    #docker tag registry.cn-hangzhou.aliyuncs.com/newbe36524/aspnet:5.0-buster-slim mcr.microsoft.com/dotnet/core/aspnet:5.0-buster-slim
                                        
                  
                  
                                                           
                             【8】、拉取Net Core SDK鏡像,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                                        #docker pull registry.cn-hangzhou.aliyuncs.com/newbe36524/sdk:5.0-buster-slim
                    #docker tag registry.cn-hangzhou.aliyuncs.com/newbe36524/sdk:5.0-buster-slim mcr.microsoft.com/dotnet/core/sdk:5.0-buster-slim
                  
                  
                  

                             【9】、將 mcr.microsoft.com/dotnet/core/aspnet:5.0-buster-slim 修改 tag,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                                        #docker tag mcr.microsoft.com/dotnet/core/aspnet:5.0-buster-slim 192.168.127.143/patrickliu.microservices/aspnet-core5:v1
                  
                  
                             【10】、推送 ASP.NET Runtime鏡像去 Harbor 私服,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                                        #docker push 192.168.127.143/patrickliu.microservices/aspnet-core5:v1
                  
                                                                                  
                             【11】、將 mcr.microsoft.com/dotnet/core/sdk:5.0-buster-slim 修改tag,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                                        #docker tag mcr.microsoft.com/dotnet/core/sdk:5.0-buster-slim 192.168.127.143/patrickliu.microservices/sdk-core5:v1
                                        

              【12】、推送 ASP.NET Runtime 鏡像去 Harbor 私服,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                                        #docker push 192.168.127.143/patrickliu.microservices/sdk-core5:v1
                                         

              【13】、檢查 Harbor 上是否已經成功推送了 ASP.NET Runtime 和 SDK 鏡像,這裏這樣做是爲了 Docker 構建服務器使用該鏡像構建我們的Net5.0鏡像
                  

                                         


          4、搭建 Docker 鏡像構建服務器,地址是【192.168.127.144】。

         構建服務器主要的功能就是把 Jenkins 拉取的代碼打包成 Docker 鏡像,並推送到 Harbor 私服服務器,便於我們的發佈服務器從私服服務器拉取鏡像,並部署鏡像。

                   (1)、編輯 Docker 配置文件:/usr/lib/systemd/system/docker.service 開啓 2376 端口。

                                   【1】、命令:#vim /usr/lib/systemd/system/docker.service,在 ExecStart 模塊增加 -H tcp://0.0.0.0:2376。

                        

                【2】、重新加載配置。

                    命令:#systemctl daemon-reload
                    

               【3】、重啓 Docker 服務。

                         命令:#systemctl restart docker
                     

               【4】、配置 docker 的 daemon.json 文件,增加我們的 Harbor 私服地址。

                       命令:#vim /etc/docker/daemon.json                              
                    "insecure-registries":["192.168.127.143"],如果是新文件,格式這樣:{"insecure-registries":["192.168.127.143"]}
                    

                       記得重啓相關服務。

                        

                【5】、檢查 Docker 鏡像構建服務器是否成功配置 Harbor 私服服務器。

                       
              
                          【6、檢查2376 端口,是否成功打開。
                                             命令:#netstat -anp |grep 2376
                                   

                  (2)、在構建服務器上要配置 Harbor 私服服務器:192.168.127.143
              

                   (3)、確定 Jenkins 是否安裝了 Docker-plugin 插件,【Dashboard】--->【Manage Jenkins】--->【插件管理】
                      

              【1】、升級站點:在右側點擊【高級】,拉到最後,看到【升級站點】,將鏡像地址更換爲騰訊或者清華都可以。然後點擊【可更新】或者【可選插件】,有數據,說明站點升級成功。

                      https://updates.jenkins.io/update-center.json           

                      騰訊:http://mirror.xmlssion.com/jenkins/updates/update-center.json

                      清華:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

                     

 

              【2】、安裝 Docker 插件,點擊【已安裝】插件,輸入 Docker 關鍵字,看看是否安裝 Docker 插件,如果沒有就安裝插件,點擊【可選插件】,在文本框輸入Docker ,在查詢結果中,選擇要安裝的插件。

                     

                    

                    


                  (4)、登錄 Jenkins,點擊【Dashboard--》【Manage Jenkins--》【Configure System】,進入配置頁面。
                               

              在右側,一直向下拉,看到【Cloud】菜單結束。
              

             【1】、Configure Clouds
                    

                              1)、Docker 鏡像構建服務器:192.168.127.144,進入服務器,檢查端口 2376 是否打開。

                          命令:#netstat -anp |grep 2376

                          

                              2)、點擊【Add a new cloud】菜單,然後選擇【Docker】菜單,因爲我們沒有安裝 K8s 插件,雲裏面只有一個 Docker。

                         

                              3)、如果安裝了 K8s,點擊【Add Docker Templates...】按鈕,就會生成一個列表,供你選擇。但是我們沒有安裝 K8s,所以我們選擇【Docker Cloud details...】

                           
                          開始配置。

                                                     

                                    如果提示:java.net.NoRouteToHostException: 沒有到主機的路由,沒有主機路由問題提到的大多是防火牆問題。可以查看我的文章《java.net.NoRouteToHostException: 沒有到主機的路由》。

                     (5)、在 .Net5.0 的項目中增加 Dockerfile 文件,這個文件必須放在解決方案的本目錄,便於以後的配置,該文件中的地址換成我們的私服服務器地址(遠程服務器下載太慢)                                
              

                     (6)、在 Jenkins 系統中,配置我們的項目,不是源碼項目,是在 Jenkins 中創建的項目,以此項目進行構建。

                              【1】、點擊【Dashboard】菜單,然後點擊右側【項目名稱】,出現下拉菜單,選擇【配置】,進入配置頁面。    

                     

              【2】、進入【配置】頁面,選擇【增加構建步驟】菜單,出現下拉菜單,然後選擇【Build/Publish Docker image】菜單。

                     

              【3】、進入【Build/Publish Docker Image】 頁面,開始配置信息。                     
                    

              【4】、選擇【Build Now】,開始構建鏡像。
                  

             【5】、生成我們的項目。
                  
             【6】、最後生成了我們的鏡像。
                  
             【7】、檢查我們的構建服務器,看看是否成功生成我們的鏡像和拉取了相關鏡像。

                   
                  完美,是不是很開心,反正我是很開心,終於成功了。還有差一步,繼續努力。


          5、搭建發佈服務器,地址是【192.168.127.145】。

                  (1)、先檢查我們是否成功安裝了 Docker 環境,沒有就安裝。
              

                  (2)、配置 Harbor 私服鏡像地址:192.168.127.143,並啓動相關的服務。
              
              
              

                  (3)、Jenkins 系統中,安裝 Publish Over SSH 插件,用於連接發佈服務器。
              

              

                  (4)、Jenkins 系統中,配置 Publish over SSH 環境,連接發佈服務器:192.168.127.145。

            

              
                  (5)、在 Jenkins 系統中,配置項目,【構建後操作】-->【Send Build artifacts over SSH】,增加【Exec command】就可以。
              
              
              

 1 echo '=========================================================='
 2 
 3 CONTAINER_NAME=net-2021113
 4 
 5 docker pull 192.168.127.143/patrickliu.microservices/$CONTAINER_NAME:v1
 6 
 7 echo '====================Remote 自動容器 start =========================='
 8 
 9 cid=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
10 
11 if [ "$cid" != "" ] ; then
12         docker rm -f $cid
13         sleep 3s
14 fi
15 
16 docker run -d --name $CONTAINER_NAME -p 10000:80 192.168.127.143/patrickliu.microservices/$CONTAINER_NAME:v1
17 
18 echo '============= Remote 自動容器 end ==========================='



        (6)、開始構建我們的項目。
            

        (6)、項目成功生成併發布到了發佈服務器。
             

       (7)、通過客戶端檢查我們的項目是否發不成功,鏡像文件已經生成,鏡像已經成功啓動了實例,對外端口:10000。
            
            

       (8)、我們通過網頁打開我們發佈的項目,地址是:http://192.168.127.145:10000/api/users/all,192.168.127.145是我們的發佈服務器。

              

            太開心了。測地成功了


四、結束
    
今天就寫到這裏了,這篇文章可能是我寫的所有文章中最長的一篇,大家看的時候要有耐心。既然是企業級別的持續集成環境,當然不會只有一臺服務器。我這裏選擇了四臺服務器,分別是:192.168.127.146【Jenkins服務器】
,192.168.127.143【Harbor 私服服務器】,192.168.127.144【Docker 鏡像構建服務器】,192.168.127.145【發佈服務器】,這是臺服務器,除了 Jenkins 服務器,其他三臺服務器都需要配置私服服務器的地址,而且每天服務器都要安裝Docker 環境。配置這個過程很漫長,我大概經過了兩個星期才未完成,經歷了很多坑,最終都解決了。十分開心,不忘初心,每天進步一點點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章