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

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

本文假定讀者瞭解基本的 docker 操做git

構建咱們本身的 Jenkins 鏡像

創建一個 Dockerfile,將下面的內容複製進去github

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 這些經常使用的軟件工具。web

值得注意的是第 30 行,我建立了一個用戶組叫作 docker,用戶組 id 跟宿主機的 docker 用戶組 id 是一致的;而後把 jenkins 用戶添加進了這個用戶組,這麼作是爲了讓 jenkins 運行 docker 命令的時候不須要 root 權限。docker

建立 Dockerfile 以後,就開始真正的構建鏡像:shell

docker build -t auto-jenkins .

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

運行 Jenkins

持久化 Jenkins 的配置文件

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

運行 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 通訊mvc

運行完這條指令後,jenkins 就運行起來了,能夠訪問本機的 8080 端口來登陸 Jenkinsapp

在第一次登陸 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

至此,持續部署的目標已經達成了,雖然功能很簡陋,可是對於我的項目來講,仍是挺好用的。

相關文章
相關標籤/搜索