在Gitlab上C#專案建立CI機制(上)
只介紹建立gitlab server到git runner的連結
要在Build Server上能建置專案
還需要安裝一些套件與一些設定
總結需要安裝的有:
1. git 套件,2. nuget 套件,3. MSBuild 套件
本篇還會提供解決的問題有:
1. gitlab查看runner結果會亂碼的問題
2. MSBuild 建置時無目標版本問題
在Build Server上
由於需要下載gitlab上的程式進行建置作業
所以Build Server上會需要使用到git的指令
所以第一個需要下載安裝git
安裝過程就是用預設的選項下一步進行安裝
若是未安裝git,則會出現以下這類的錯誤訊息:
亂碼問題下面一點會提到如何解決
第二個需要裝的是nuget
目前C#的專案大部分都透過nuget進行套件管理與參考
因此先到nuget官網下載nuget的執行檔
把下載的nuget.exe放置在一個固定的位置
之後在環境變數path加入nuget的路徑
這邊是把nuget.exe放置在c:\nuget資料夾裡
因此在環境變數就加入此路徑
接著如果需要編譯的是.net core的程式
則只要下載.net core的SDK
網路上有許多文章提到.net core的SDK也可以編譯.net framework的專案
其實不然
舊的.net framework專案的專案檔.csproj的格式與.net core的格式不同
所以舊的.net framework專案是無法直接透過.net core SDK進行編譯
需要調整專案檔.csproj的格式
但這不在我們這次的討論範圍
這裡還是透過傳統的MSBuild來進行.net framework專案的編譯
所以第三個就是要下載MSBuild的安裝檔
以上三項都安裝完之後
就能開始修改ci文件 .gitlab-ci.yml
參考的建置yml如下:
before_script: - chcp 65001
這一段主要是要解決windows中文版,錯誤訊息在gitlab上顯示亂碼的問題
而script: 則分為上述提到的兩塊
nuget restore 專案檔路徑 -PackagesDirectory packages
與
msbuild 專案路徑
FrameworkTest\FrameworkTest.csproj 則是進行測試的專案的相對路徑
正當以為上述都完備後,按下commit之後
會發現雖然gitlab的頁面顯示PASS通過
但細看內部的訊息其實是有問題
雖然已經安裝的MSBuild套件
但對於個別的.net framework版本還是無法進行編譯
需要下載目標套件的.net framwork版本
這邊建議直接下載Developer Pack
其中包含:SDK與Targeting Pack
這時候再進行一次.gitlab-ci.yml的commit
終於能看到建置成功與0個警告與錯誤
在當初放置gitlab runner的目錄下
會產生一個builds的資料夾
裡面會有gitlab runner透過git把程式pull下來的檔案
建置成功
就會在該專案指定的建置目錄產生建置後的檔案
如下所示:
除了專案建置產出的dll外,連同所參考的nuget套件dll也都會一併建置出來了
以上是針對單一專案進行CI建置的方式
script可以再加入多個專案進行建置
以及建置後的佈署機制
這之後就再另開篇幅紀錄了!
請問出現以下錯誤, 可以怎麼排程問題呢, 謝謝
回覆刪除C:\hello\HelloWorld>msbuild HelloWorld.csproj
Microsoft (R) Build Engine version 14.0.23107.0
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 6/17/2021 7:10:00 AM.
Project "C:\hello\HelloWorld\HelloWorld.csproj" on node 1 (default targets).
C:\hello\HelloWorld\HelloWorld.csproj(87,3): error MSB4019: The imported project "C:\Program File
s (x86)\MSBuild\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" wa
s not found. Confirm that the path in the declaration is correct, and that the file exis
ts on disk.