Docker 是個好東西,特別是用它來部署 ASP.NET Core Web 項目的時候,可是僅僅的讓程序運行起來遠遠不能知足個人需求,若是可以像 DaoCloud 提供的持續集成服務那樣,檢測 git 倉庫的代碼提交,拉取源碼,而後編譯出來,自動構建新的鏡像,最終部署到一個新的容器裏面,那就真是太棒了。
通過幾天的研究,我終於實現了上面的 CD 系統~node
本文假定讀者瞭解基本的 docker 操做git
創建一個 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
創建一個新的文件夾 ~/ProgramData/docker/jenkins
,咱們將在這個文件夾存放 jenkins 的插件以及構建目錄,這樣以後更新容器的時候,插件以及構建產物就不容易丟失。bash
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 的家目錄中,也就是上面設置的那個文件夾。
簡單的使用 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 首頁
選擇 FreeStyle,記得隨便起個名字
而後你會進入項目配置頁面
配置倉庫地址
設置構建觸發器
設置構建腳本
個人構建腳本的內容是:
#!/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 的控制面板中看到構建正在執行了~
等到構建完成以後,檢查宿主機上的容器
至此,持續部署的目標已經達成了,雖然功能很簡陋,可是對於我的項目來講,仍是挺好用的。