Jenkins 構建自動化 .NET Core 釋出映象

痴者工良發表於2021-06-24

導讀

在本章中,將介紹如何在 Linux 下使用 Docker 部署、啟動 Jenkins,編寫指令碼,自動化構建 .NET Core 應用,最終將 .NET Core 應用打包為 Docker 映象。

部署 Jenkins

請提前在 Linux 上安裝 Docker,在 Linux 中,我們使用 Docker 啟動 Jenkins,這樣可以避免手動安裝大量依賴以及汙染本地環境,也便於快速啟動和故障恢復。

安裝 Docker 完畢後,使用 docker version 檢查 Docker 版本,Docker 版本不能為 1.x、3.x 這種版本,請升級到 18.x 以上版本。一般在 Ubuntu 系統中,下載安裝的是最新版本,但是在 Centos 中因為預設映象源中的版本比較舊, 安裝 Doker 版本較低,需要手動新增新版本的映象源再升級。

請參考:https://www.cnblogs.com/harlanzhang/p/9965534.html

因為會使用到容器提供環境,以及使用 Docker 打包 .NET Core 程式為 Docker 映象,所以需要在 Jenkins 容器中對映 Docker 的 .sock 檔案,以便在容器中,還能使用 Docker 命令。

在宿主機中建立 /var/jenkins_home 目錄,用於備份 Jenkins 中的資料。

在 Linux 中使用 Docker 啟動 Jenkins ,其命令如下:

docker run \
  -u root \
  -itd \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

啟動後,使用 docker logs {容器ID} 檢視日誌獲取 Jenkins 登入密碼,其密碼是一串雜湊字串,例如:1abc12445adcf

最後開啟 8080 埠,即可訪問 Jenkins。

安裝外掛

登入 Jenkins 後,會提示安裝推薦的外掛,請根據提示安裝推薦的外掛,推薦安裝的外掛列表如下:

Folders Plugin
OWASP Markup Formatter Plugin
Build Timeout
Credentials Binding Plugin
Timestamper
Workspace Cleanup
Ant
Gradle
Pipeline
GitHub Branch Source Plugin
Pipeline: GitHub Groovy Libraries
Pipeline: Stage View
Git plugin
SSH Build Agents
Matrix Authorization Strategy Plugin
PAM Authentication
LDAP
Email Extension
Mailer Plugin
Localization: Chinese (Simplified)

另外為了提供容器打包支援等,需要另外手工安裝以下外掛。

plun

# 提供 Docker 支援(必裝)
docker
Docker Pipeline
docker-build-step

# 視覺化設計流水線指令碼的工具(必裝)
Blue Ocean

# 提供對 gitlab 支援,如果不使用可以不安裝
gitlab

# 提供 Git 引數化和鉤子觸發構建支援,不需要可以不安裝
Git Parameter
Generic Webhook Trigger

拉取映象

這裡介紹一下我們後面要用到的兩個映象。

拉取一個 .NET Core SDK,每次啟動流水線時,都會啟動一個 .NET Core SDK 容器,為我們提供構編譯、釋出 .NET Core 程式的環境。

docker pull mcr.microsoft.com/dotnet/sdk:3.1  

拉取一個 ASP.NET Core Runtime,用於製作應用映象的基礎映象。

docker pull mcr.microsoft.com/dotnet/aspnet:3.1

映象列表:

mcr.microsoft.com/dotnet/aspnet   3.1          ac199e8d6dff   2 weeks ago   208MB
mcr.microsoft.com/dotnet/sdk      3.1          82e2a34647f0   2 weeks ago   710MB

製作 Jenkinsfile 指令碼

筆者貼心地給各位同學準備了 Demo 專案,請到 https://github.com/whuanle/DotNetCoreJenkinsDemo 倉庫,fork 到你的倉庫,後續我們使用這個 ASP.NET Core 的 Demo 程式實踐流程。

在專案檔案中,可以找到一個 Jenkinsfile 檔案,此檔案為我們定義流水線的步驟。

我們看一下簡單的 Jenkinsfile 模板:

pipeline {
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

stages 中,定義流水線的階段,在模板中,一個定義了三個階段,分別是 BuildTestDeploy

每個階段都可以定義多個步驟(steps),每個步驟中都可以執行多個不同型別的 step。

    stage('Test') {
        steps {
            echo 'Testing..'
        }
    }

demo 中的 Jenkinsfile 比較簡單,我們可以找個 Publish 階段的內容看一下:

        stage('Publish') { 
            steps {
                sh 'dotnet publish src/WebDemo -c Release'
            }
        }

其實很簡單,每個步驟執行 shell 命令就行,我們可以使用 sh '...' 表示此步驟要執行的 shell 命令。

接著我們看一下 Jenkinsfile 開頭的兩部分內容。

    // 全域性環境變數
    environment {
        IMAGENAME     = 'webdemo'       // 映象名稱
        IMAGETAG      = '1.0.0'         // 映象標籤
        APPPORT       = '8089'          // 應用佔用的埠
        APPDIR        = '/opt/app'      // 應用工作的目錄
    }

    agent {
        docker {
            image 'mcr.microsoft.com/dotnet/sdk:3.1' 
            args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker'
        }
    }

environment 中,可以定義此次構建過程的環境變數。

agent 則是節點選擇器,可以選擇在何種環境下啟動流水線,有 nodedocker 等型別。

構建流水線

登入到 Jenkins 網頁後臺,在左側選單欄中點選 New Item,開始建立流水線。

Jenkins 有多種流水線風格,還可以通過新增外掛,來加入更多的流水線型別,我們主要了解 Freestyle project 、Pipeline、Multibranch Pipeline 即可。

  • Freestyle project

    Freestyle project流水線 使用上比較自由,不需要對專案做更改即可建立流水線,可以新增很多選擇、配置。如果流程需要變化,改動比較麻煩。

  • Pineline、Multibranch Pipeline

    他們都可以同時處理多個分支,這兩種都是依賴於專案中的 Jenkinsfile 檔案。Multibranch Pipeline 好處是可以同時檢查多個分支,為每個分支建立構建Job,而 Pipeline 會把多個分支放到一個 Job 中。

點選 New Item ,建立流水線,選擇 Mutibranch Pipline。

新增 Git 原始碼 倉庫方式,我們可以自由選擇一種型別,建議使用 Single repository & branch

1

由於我們沒有新增金鑰,所以 Jenkins 無法訪問你的 Github 倉庫,所以需要新增一個可訪問的金鑰。

找一臺已經安裝了 git 的電腦,生成公鑰私鑰,為 Jenkins 和 GitHub 之間提供加密連線。

執行命令:

ssh-keygen -t rsa -b 2048 -C "email@example.com"

根據提示,填寫要存放金鑰的路徑,如 D:/id_rsa

執行命令後,會生成兩個檔案, id_rsaid_rsa.pub,複製 id_rsa (私鑰)中的內容到 Jenkins 中。

然後把 id_rsa.pub (公鑰)的內容新增到 Github 你的賬號中。

你可以使用多種方式新增認證方式,最簡單、安全的是金鑰,我們可以選擇 Secret file,然後上傳私鑰,或者使用別的方式,這裡就不贅述了。

然後選擇要釋出的分支,最後直接儲存即可。

然後回到主介面,開啟 我們建立的流水線,點選 Build Now,即可啟動流水線。

構建成功截圖:

在 Linux 伺服器上,檢視映象列表:

root@localhost ~ 19:54:20 # docker images
REPOSITORY                        TAG          IMAGE ID       CREATED         SIZE
webdemo                           1.0.0        79b636ddef73   2 minutes ago   208MB

可以看到,已經自動打包應用為映象,其映象名稱和版本號,都可以在 Jenkinsfile 中設定。

觀察

我們可以在構建介面中,觀察每個步驟的日誌。

在 Open Blue Ocean 中,有更加好看的 UI 和方便的工具。

視覺化設計流水線步驟。

觀察構建過程。

相關文章