Dockerfile+Jenkinsfile+GitLab輕鬆實現.NetCore程式的CI&CD

沛山發表於2020-05-26

一.相關介紹

Dockerfile:關於Dockerfile的使用說明,我在文章《讓.NetCore程式跑在任何有docker的地方》中有說到,這裡不在贅述,需要的可以先看下,本文主要介紹Jenkinsfile結合dockerfile配合使用,自動構建.NetCore應用程式。
 
Jenkinsfile :Jenkinsfile 是 Jenkins 2.x 或更高版本核心特性 Pipeline(流水線) 的指令碼,或者說對於Jenkins 流水線的定義被寫在一個叫Jenkinsfile的文字檔案中,該檔案可以被提交到專案的原始碼的控制倉庫。這是"流水線即程式碼"的基礎; 將CD 流水線作為應用程式的一部分,像其他程式碼一樣進行版本化和審查。 建立 `Jenkinsfile`並提交它到原始碼控制中提供了以下幾個好處:
  • 自動地為所有分支建立流水線構建過程並拉取請求。
  • 在流水線上程式碼複查/迭代 (以及剩餘的原始碼)。
  • 對流水線進行審計跟蹤。
  • 該流水線的真正的原始碼 , 可以被專案的多個成員檢視和編輯。
Jenkinsfile 能使用兩種語法進行編寫,分別是“宣告式”和“指令碼化”,二者語法都是 DSL(Domain-specific language) 語言,二者語法差不多,下面我們具體看下
 
 

.Jenkins和GitLab的安裝

工欲善其事,必先利其器
Jenkins的安裝可以看我之前的一篇文章:https://www.cnblogs.com/peyshine/p/12891935.html
Gitlab的安裝推薦看下這篇文章:https://segmentfault.com/a/1190000021593151
 

三.打通GitLab Webhooks與Jenkins流程

1.這裡先新建一個.net core應用程式,除了新增加了一個Jenkinsfile檔案以外,其他沒有任何程式碼的修改
注意,Jenkinsfile的J需要大寫,我測試了,小寫會提示找不到檔案.
Jenkinsfile中新增了幾行測試程式碼:
pipeline{
    agent any
    stages {
        stage('Build') {
            steps{
                echo 'This is a build step' 
            }
        }
        stage('Test') {
            steps{
                echo 'This is a test step'  
            }
        }
        stage('Deploy') {
            steps{
                echo 'This is a deploy step'    
            }
        }
    }
}

然後將程式檔案push到Gitlab上

 
2.在Jenkins系統管理,系統配置中,在Gitlab處新增相關資訊
 
 
下面點選新增憑據,型別選擇GitLab Api Token,由於這個Token需要由GitLab來提供,所以先到GitLab生成一個Api Token
 
3.生成Api Token
 
 
點選建立之後,Token就生效了
 
將Api Token複製到Jenkins中,點選新增
新增完成後,就可以在Credentials中選擇剛剛新增好的憑據
點選儲存,這樣系統配置中的Gitlab的全域性配置就生效了
 
4.新建流水線任務測試
下面開啟Jenkins,新建一個流水線釋出任務,取名test,然後點選確定.
勾選構建觸發器
由於我們需要達到的目的是在GitLab提交程式碼,Jenkins可以自動構建相關任務,所以我們還需要配置一個觸發器。如圖,點選下面的"高階"按鈕
點選“Generate”,生成一個SecretToken
然後再流水線Tab定義處,下拉選擇“Pipeline script from SCM”,SCM選擇Git,然後填寫程式碼庫的地址和訪問使用者密碼,下面指令碼路徑有個Jenkinsfile,意思就是從我們提交到原始碼管理根目錄下面的Jenkinsfile中讀取相關定義好的的流水線任務流程
點選儲存
 
在Gitlab如下圖地方進入,來配置web鉤子
 
將在Jenkin中截圖的一個url和生成的token分別填寫在下方,在觸發器的地方勾選上 Push events,然後點選下方的“Add webhook” 按鈕。如果你還有其他事件發生時想觸發Jenkins的任務,也可以自行勾選上
新增完成後點選測試
這個時候可以看到上方出現了成功的提示
而另一邊Jenkins中,正在執行任務,並且任務的執行是 GitLab有推送任務
 完成之後,可以看到流水線任務流程圖
下面通過程式碼推送來測一下,我在跟目錄新建一個空的README.md檔案,然後推送,推送完成後可以看到Jenkins開始執行第二次構建任務
至此,從GitLab提交程式碼到Jenkins自動構建的整個流程已經完成了,細心的你會發現,只是流程跑通了,這個Jenkinsfile沒有實質性的內容,下面進入Jenkinsfile
 

四.接入Jenkinsfile,Dockerfile實現自動釋出

編寫Dockerfile如下:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
COPY *.csproj ./app/
WORKDIR /app
RUN dotnet restore

COPY . ./
RUN dotnet publish -o out /p:PublishWithAspNetCoreTargetManifest="false"

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
ENV ASPNETCORE_URLS http://+:80
WORKDIR /app
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "WebApplication_Jenkinsfile.dll"]
 
編寫Jenkinsfile如下:
pipeline{
    agent any
    stages {
        stage('Checkout') {
            steps{
            git credentialsId: '85ca7e47-532e-4901-9828-50a8da071d16', url: 'http://xxx.gitlab.com/webapplication_jenkinsfile.git', branch:'master'
                    echo '---This is a Checkout step---'                 
            }
        }
        stage('Build') {
            steps{
                    sh '''cd WebApplication_Jenkinsfile
            docker rmi -f docker_webapplication_test:1.0
            docker build -t docker_webapplication_test:1.0 .'''
            echo '---This is a Build step---'
            }
        }
        stage('Run') {
            steps{
            sh '''docker rm -f docker_webapplication_test
            docker run --name docker_webapplication_test -d -p 7489:80 docker_webapplication_test:1.0
            '''
                    echo '---This is a run step---'    
            }
        }
    }
}

說明:

stages 必須,包括順序執行的一個或多個stage命令,在pipeline內僅能使用一次,通常位於agent/options後面
steps 必須,steps位於stage指令塊內部,包括一個或多個step。僅有一個step的情況下可以忽略關鍵字step及其{}
這裡為了演示,只新增了幾個核心的步驟,可以根據需要自行新增自動測試,郵件提醒等額外步驟
 
流水線語法,可以參照下圖中的示例步驟點選後,可以生成指令碼資訊,上面Jenkinsfile中的git credentialsId資訊就是在這裡生成的
 
完成之後,將Jenkinsfile和Dockerfile推送到Gitlab,推送成功可以看到如下圖的Jenkins自動構建過程,並且遵照定義規範釋出了應用
 
 
如果需要檢視日誌,或者在釋出失敗後檢視失敗原因,可以通過下面的 Console Output來檢視
Console Output中的詳細日誌資訊如下圖,可以看到構建過程是遵循在Dockerfile中的定義
docker 容器執行狀態檢查
自動部署效果截圖
五.結束總結
在定義web鉤子的時候,我勾選的是push events,所以每次有提交程式碼到master,都會自動去走Jenkinsfile中的流水線任務,在實際生產中,如果不想這樣操作,可以將持續整合流水線與持續釋出流水線獨立開來
其實只需要前期一次將Jenkins和Gitlab觸發器打通之後,後面只需要在原始碼中維護Dockerfile和Jenkinsfile即可,這是比較優雅的一種CI、CD方式,動手試試吧!

 

相關文章