Docker + Jenkins 持續部署 ASP.NET Core 項目


Docker 是個好東西,特別是用它來部署 ASP.NET Core Web 項目的時候,但是僅僅的讓程序運行起來遠遠不能滿足我的需求,如果能夠像 DaoCloud 提供的持續集成服務那樣,檢測 git 倉庫的代碼提交,拉取源碼,然后編譯出來,自動構建新的鏡像,最終部署到一個新的容器里面,那就真是太棒了。
經過幾天的研究,我終於實現了上面的 CD 系統~

本文假定讀者了解基本的 docker 操作

構建我們自己的 Jenkins 鏡像

建立一個 Dockerfile,將下面的內容復制進去

FROM jenkins
USER root

# 將 shell 替換為 bash
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 設置中科大軟件鏡像源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
# upgrade
RUN apt-get update && apt-get upgrade -y

RUN apt-get install -y apt-utils sudo 

# 安裝 dotnet core SDK
RUN apt-get install -y curl libunwind8 gettext \
    && curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=847105\
    && mkdir -p /opt/dotnet && tar zxf dotnet.tar.gz -C /opt/dotnet \
    && ln -s /opt/dotnet/dotnet /usr/local/bin

USER root
# 安裝 yarn
RUN curl -sS http://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - -y
RUN echo "deb http://dl.yarnpkg.com/debian/ stable main" |  tee /etc/apt/sources.list.d/yarn.list

# 安裝一些必要的工具
RUN apt-get update \
    && apt-get install -y openjdk-8-jdk yarn build-essential

# 使 jenkins 運行 docker 不需要 sudo
RUN groupadd -o -g 999 docker && usermod -aG docker jenkins

USER jenkins
# 解決時區問題
ENV JAVA_OPTS -Duser.timezone=Asia/Shanghai

RUN touch ~/.bashrc

ENV NVM_NODEJS_ORG_MIRROR https://mirrors.ustc.edu.cn/node
ENV NODE_VERSION v7.9.0
# 安裝 nvm 和 node
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash \
    && bash ~/.nvm/nvm.sh \
    && bash -c "source ~/.nvm/nvm.sh \
    && nvm install $NODE_VERSION \
    &&  nvm use $NODE_VERSION"

# 設置 npm 的淘寶鏡像
RUN echo "registry=https://registry.npm.taobao.org" > ~/.npmrc

在這個鏡像中,我添加了 dotnet core SDK,JDK,nvm,node,yarn,git 這些常用的軟件工具。

值得注意的是第 30 行,我創建了一個用戶組叫做 docker,用戶組 id 跟宿主機的 docker 用戶組 id 是一致的;然后把 jenkins 用戶添加進了這個用戶組,這么做是為了讓 jenkins 運行 docker 命令的時候不需要 root 權限。

創建 Dockerfile 之后,就開始真正的構建鏡像:

docker build -t auto-jenkins .

至此,我們就構建好了一個單節點的 jenkins 鏡像,可以使用 docker images指令查看剛剛構建出來的鏡像。

運行 Jenkins

持久化 Jenkins 的配置文件

建立一個新的文件夾 ~/ProgramData/docker/jenkins,我們將在這個文件夾存放 jenkins 的插件以及構建目錄,這樣之后更新容器的時候,插件以及構建產物就不容易丟失。

運行 Jenkins 容器

docker run --name my-jenkins -p 8080:8080 -p 50000:50000 \
    -v /home/yourname/ProgramData/docker/jenkins:/var/jenkins_home \
    -v /usr/bin/docker:/bin/docker \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -d auto-jenkins

第一行表示暴露了 jenkins 需要使用的 8080 跟 50000 端口
第二行掛載我們之前創建的配置文件存放目錄到 jenkins 用戶的 home(對的,jenkins 用戶的 home 目錄在 /var 下面)
第三行將宿主機上面的 docker 命令行工具掛載到容器中,使 jenkins 用戶能夠執行 docker 命令
第四行將宿主機上的 docker.sock 掛載到容器中的相應位置,使得容器中的 docker cli 能跟宿主機的 docker 通信

運行完這條指令后,jenkins 就運行起來了,可以訪問本機的 8080 端口來登錄 Jenkins

在第一次登錄 Jenkins 容器的時候需要輸入初始密碼,這個密碼保存在 jenkins 的家目錄中,也就是上面設置的那個文件夾。

創建一個運行在 Docker 容器中的 ASP.NET Core 項目

簡單的使用 dotnet cli 創建一個 Web API 項目

dotnet new mvc

然后把這個項目發布到一個在線的 git 倉庫中,這里我以這個倉庫作為例子

創建完畢之后,為這個項目添加 Dockerfile

FROM microsoft/aspnetcore
WORKDIR /app
COPY bin/Debug/netcoreapp1.1/report.xml /app
COPY bin/Debug/netcoreapp1.1/publish/. /app
CMD ["dotnet", "report.dll"]

配置 Jenkins 上的自動構建任務

登錄 Jenkins,添加一些必要的插件,步驟如下:
image_1bfc86rdcp8oe54ii81ak41dsk9.png-105.7kB

image_1bfc8a3m3n3m3uv1pa114lp1o4f13.png-164kB

image_1bfc8bvfv1g9a1gqs158pona1qvu1g.png-128.2kB

然后回到 Jenkins 首頁

image_1bfc8d2p09qc1o0lm23v3gc381t.png-105.5kB

選擇 FreeStyle,記得隨便起個名字
image_1bfc8dvd217it1otnl5018ej16302a.png-152.5kB

然后你會進入項目配置頁面

配置倉庫地址
image_1bfc8i492et119khi5k1qcoidu2n.png-49.9kB

設置構建觸發器
image_1bfc8jsmvk849b630uspd58p34.png-52.9kB

設置構建腳本
image_1bfc8kjmb1ek17opum546p1d843h.png-49.5kB

我的構建腳本的內容是:

#!/bin/bash
# 獲取短版本號
GITHASH=`git rev-parse --short HEAD`
echo ---------------Restoring...------------------
dotnet restore
echo ---------------Publishing...------------------
dotnet publish
echo ---------------Removing Previous Container...------------------
docker rm -f nightingale-web
echo ---------------Building Docker Image...------------------
docker build -t nightingale:$GITHASH .
docker tag nightingale:$GITHASH nightingale:latest
echo ---------------Launching Container...------------------
docker run --name nightingale-web -d -p 5000:80 --env ASPNETCORE_ENVIRONMENT=Development nightingale:latest

最后點擊底部的保存,自動構建就配置完成了~

嘗試第一次自動構建

直接在 git 倉庫中進行一次 push,稍等1分鍾左右的時間,我們就可以在 Jenkins 的控制面板中看到構建正在執行了~

image_1bfc96m1ghj24ilcf311kk17tv4b.png-134.8kB

等到構建完成之后,檢查宿主機上的容器

image_1bfc9c6pa1fsq1k9r113t16tkgub4o.png-67.8kB

至此,持續部署的目標已經達成了,雖然功能很簡陋,但是對於個人項目來說,還是挺好用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM