如何建立含有 .NET Core SDK 的 Jenkins Docker Image ?
雖然 .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 | FROM jenkins/jenkins:lts |
第 1 行
1 | FROM jenkins/jenkins:lts |
以 jenkins/jenkins:lts
作為 image 的基底。
第 3 行
1 | # Switch to root to install .NET Core SDK |
因為即將使用 apt-get
安裝 package,所以直接切換到 root
帳號執行以下動作。
第 6 行
1 | # Show distro information! |
顯示目前 image 的版本資訊。
此段並非安裝 .NET Core SDK 所必須,但因為 Linux 的 ditribution 眾多,每個
Dockerfile
的寫法也會有所差異,因此這行可以幫助Dockerfile
撰寫,尤其jenkins/jenkins:lts
是用 Debian 9 所建立,因此 dependency 又與 Ubuntu 16.04 LTS 不太一樣
第 9 行
1 | # Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current |
由於 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 | # Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current |
根據官網的 Install .NET Core SDK on Linux Debian 9 所描述,要安裝 .NET Core SDK 前,必須先將 microsoft.gpg
裝好。
20 行
1 | # Install the .NET Core framework |
所有的 dependency 與 microsoft.gpg
都裝好後,就可以正式安裝 .NET Core SDK 了。
24 行
1 | # Switch back to the jenkins user. |
由於剛剛是以 root
帳號安裝 .NET Core SDK,最後切回預設的 jenkins
帳號。
建立 Image
1 | ~/JenkinsCore $ docker build -t oomusou/jenkins-core . |
進入 Dockerfile
所在的目錄,使用 docker build
建立自己的 image。
- -t : Docker image 的名稱
- . : 將目前目錄的
Dockerfile
建立成 image
- 輸入
docker build -t oomusou/jenkins-core .
將Dockerfile
建立成oomusou/jenkins-core
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 的工作目錄
- 輸入
docker run …
建立並執行 container
測試 .NET Core SDK
–1
2$ docker exec -it MyJenkinsCore bash
root@xxx:/# dotnet --version
使用 docker exec
對已經執行中的 container 下指令。
-i
:i
nteractive,可對 terminal 輸入資料-t
:t
erminal,可對 terminal 顯示資料MyUbuntuCore
: Container 名稱bash
: 對 container 下的指令
- 輸入
docker exec -it
進入 container 的 terminal - 輸入
dotnet —version
確認 .NET Core SDK 已經安裝成功
Conclusion
- 由於 Jenkins 是依照 Debian 9 所建立,因此所需要的 dependency 與 Ubuntu 稍有不同