Jenkins 包含 .NET Core 才能進行單元測試

雖然 .NET Core SDK 與 Jenkins 都各自提供官方 Docker image,但實務上使用 Jenkins 做持續整合時,我們會從 Jenkins 將 Git repository clone 下來,然後跑 dotnet test 執行單元測試,但 dotnet test 需要 .NET Core SDK 環境才能執行,因此我們必須建立自己的 Dockerfile,產生包含 .NET Core SDK 的 Docker image。

Version


macOS High Sierra 10.13.3
Docker for Mac 17.12.0-ce-mac55 (23011)
Jenkins 2.89.4
.NET Core SDK 2.1.4

Dockerfile


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM jenkins/jenkins:lts

# Switch to root to install .NET Core SDK
USER root

# Show distro information!
RUN uname -a && cat /etc/*release

# Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install dependency for .NET Core 2
RUN apt-get update
RUN apt-get install -y curl libunwind8 gettext apt-transport-https

# Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install microsoft.qpg
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list'

# Install the .NET Core framework
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.4

# Switch back to the jenkins user.
USER jenkins

第 1 行

1
FROM jenkins/jenkins:lts

jenkins/jenkins:lts 作為 image 的基底。

第 3 行

1
2
# Switch to root to install .NET Core SDK
USER root

因為即將使用 apt-get 安裝 package,所以直接切換到 root 帳號執行以下動作。

第 6 行

1
2
# Show distro information!
RUN uname -a && cat /etc/*release

顯示目前 image 的版本資訊。

此段並非安裝 .NET Core SDK 所必須,但因為 Linux 的 ditribution 眾多,每個 Dockerfile 的寫法也會有所差異,因此這行可以幫助 Dockerfile 撰寫,尤其 jenkins/jenkins:lts 是用 Debian 9 所建立,因此 dependency 又與 Ubuntu 16.04 LTS 不太一樣

第 9 行

1
2
3
4
# Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install dependency for .NET Core 2
RUN apt-get update
RUN apt-get install -y curl libunwind8 gettext apt-transport-https

由於 Jenkins image 是根據 Debian 9 所建立,根據官網的 Install .NET Core SDK on Linux Debian 9,若要在 Debian 9 安裝 .NET Core,還必須安裝以下額外 package :

  • curl
  • libunwind8
  • gettext
  • apt-transport-https

14 行

1
2
3
4
5
# Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install microsoft.qpg
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list'

根據官網的 Install .NET Core SDK on Linux Debian 9 所描述,要安裝 .NET Core SDK 前,必須先將 microsoft.gpg 裝好。

20 行

1
2
3
# Install the .NET Core framework
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.4

所有的 dependency 與 microsoft.gpg 都裝好後,就可以正式安裝 .NET Core SDK 了。

24 行

1
2
# Switch back to the jenkins user.
USER jenkins

由於剛剛是以 root 帳號安裝 .NET Core SDK,最後切回預設的 jenkins 帳號。

建立 Image


1
~/JenkinsCore $ docker build -t oomusou/jenkins-core .

進入 Dockerfile 所在的目錄,使用 docker build 建立自己的 image。

  • -t : Docker image 的名稱
  • . : 將目前目錄的 Dockerfile 建立成 image

jenkins000

  1. 輸入 docker build -t oomusou/jenkins-core .Dockerfile 建立成 oomusou/jenkins-core
  2. uname -a && cat /etc/*release 顯示出為 Debian ,證明 Jenkins image 是由 Debian 建立

建立並執行 Container


1
$ docker run --name MyJenkinsCore -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home oomusou/jenkins-core

使用 docker run 由 image 建立 container 並執行之。

  • —name : 替 container 取一個人能夠識別的名字 MyJenkinsCore (若省略,Docker 將隨機命名,將來不易維護)
  • -p : Docker 外部與 Jenkins 內部所對應的 port,其中左邊為外部 Docker 的 port,右邊為 Jenkins 內部的 port
  • -v : 建立 JENKINS_HOME 環境變數,其目錄在 /var/jenkins_home,為 Jenkins 的工作目錄

jenkins001

  1. 輸入 docker run … 建立並執行 container

測試 .NET Core SDK


1
2
$ docker exec -it MyJenkinsCore bash
root@xxx:/# dotnet --version

使用 docker exec 對已經執行中的 container 下指令。

  • -i : interactive,可對 terminal 輸入資料
  • -t : terminal,可對 terminal 顯示資料
  • MyUbuntuCore : Container 名稱
  • bash : 對 container 下的指令

jenkins002

  1. 輸入 docker exec -it 進入 container 的 terminal
  2. 輸入 dotnet —version 確認 .NET Core SDK 已經安裝成功

Conclusion


  • 由於 Jenkins 是依照 Debian 9 所建立,因此所需要的 dependency 與 Ubuntu 稍有不同

Reference


.NET Core, Install .NET Core SDK on Linux Debian 9