在先後端分離開發的項目當中爲了不重複構建發佈,咱們須要部署一個持續發佈環境,而目前的開發環境服務器都是基於 CentOS 的,所以每次在本地發佈以後還須要打包,上傳,部署,十分繁瑣。故這裏採用了比較成熟的Jenkins 做爲持續部署環境。html
爲了方便安裝,咱們這裏使用了 Docker 來進行安裝,至於 Docker 安裝的步驟這裏不在贅述,詳情能夠參考這一篇博文。linux
上面安裝的是一個較老的版本,這裏推薦參考Docker 官方文檔來進行安裝。git
安裝好 Docker 以後,拉取 Jenkins 的官方鏡像。執行以下命令:docker
docker pull jenkins/jenkins
拉取完畢以後咱們基於這個鏡像封裝一個新的鏡像出來,可能會問爲何不能直接使用呢?由於這兒的 jenkins鏡像並不包含 docker 環境,因此咱們須要封裝一個新的鏡像讓其可以訪問宿主機的 Docker 程序。
構建 Dockerfile 內容以下:shell
FROM jenkins/jenkins:latest USER root #清除了基礎鏡像設置的源,切換成阿里雲的源 RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \ && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list #更新源並安裝缺乏的包 RUN apt-get update && apt-get install -y libltdl7 ARG dockerGid=999 RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group \ USER jenkins
完成以後執行以下命令構建新的 Docker 鏡像:json
docker build -t docker/jenkins .
下面咱們就開始運行咱們的 Jenkins 容器了:後端
docker run -d -p 8080:8080 -p 50000:50000 \ --name=jenkins -v /root/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ docker/jenkins
這裏咱們將 Jenkins 鏡像裏面的 /var/jenkins_home 映射到了宿主機的 /root/docker/jenkins 文件夾,在這個文件夾裏面都存放的是 Jenkins 的一些配置項等。
注意,這裏可能會出現以下錯誤:centos
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
這是由於在 docker 內部的 jenkins user 用戶沒有權限,由於映射的 /root/docker/jenkins/ 文件夾屬於root 用戶的,而 jenkins user 的 uid 爲 1000,執行以下命令:api
sudo chown -R 1000:1000 /home/docker/jenkins
以後再次運行 Jenkins 的容器,訪問 http://服務器IP:8080/ 站點,會提示你輸入密鑰:
咱們來到宿主機執行如下 shell 命令:服務器
docker container logs jenkins
就能夠看到密鑰其實已經輸出在終端了,複製過來,粘貼進去就能夠了。以後就是選擇你須要安裝的插件,選擇第一個默認便可,可能這裏由於網絡緣由會安裝失敗,能夠多重試幾回,或者直接忽略掉,後面咱們會將如何解決。
安裝完成以後輸入用戶名密碼,就能夠開始使用了,可能你剛纔會由於網絡等緣由形成插件安裝失敗,這裏咱們來到
Jenkins>>系統管理>>管理插件>>高級
而後將 升級站點 地址改成 http://mirror.xmission.com/jenkins/updates/current/update-center.json。以後安裝以前缺失的插件。
這裏咱們項目使用的是 TFS 進行源代碼管理,因此咱們須要安裝 TFS 插件,在 Manage Jenkins 的 Manage Plugin 裏面咱們找到 Team Foundation Server Plug-in 插件,勾選,點擊 Download now and install after restart 按鈕,勾選 Restart Jenkins when installation is complete and no jobs are running 。
安裝完成以後 Jenkins 會重啓,等待重啓完畢以後,來到 Jenkins>>Manage Jenkins>>Configure System 查看 TFS/Team Services 而後添加你的 TFS Collection。
保存以後咱們就能夠新建項目了。
首先,咱們來到首頁,選擇 New Item:
而後選擇自由風格項目,填上名稱.
在 Source Code Management 上選擇 TFS,而且填入你的 TFS 服務器地址,項目路徑,與你的帳號密碼:
而後你就能夠嘗試構建一下,構建成功以後就會在 Workspace 看到你的項目文件被拉下來了。
那麼咱們的代碼如何構建而且部署呢?由於咱們以前在 Jenkins 的 Docker 鏡像啓動的時候掛載了宿主機的 Docker 程序,咱們如今就能夠直接基於微軟的 dotnetcore 鏡像來構建咱們的項目。因此,咱們先拉取微軟的 dotnetcore 鏡像,運行以下命令:
docker pull microsoft/dotnet:latest
拉取鏡像以後,咱們來編寫一個 Dockerfile 文件來讓 Jenkins 來執行 Shell 構建。
若是你還不知道如何編寫 Dockerfile 文件,能夠參考 這篇文章。
FROM microsoft/dotnet:latest WORKDIR /app COPY ./ . ENV ASPNETCORE_URLS http://+:5000 EXPOSE 5000 RUN cd ./HKERP.IdentityServer.Host \ && dotnet restore \ && dotnet build WORKDIR /app/HKERP.IdentityServer.Host ENTRYPOINT ["dotnet","run"]
而後將這個 Dockerfile 放在你的項目裏面,相似於這樣:
而後咱們再回到剛纔 Jenkins 裏面,配置剛纔項目,新建一個 Shell Step,就像這樣:
代碼以下:
#!/bin/sh cd /var/jenkins_home/workspace/API_IdentityServer docker container prune << EOF y EOF docker container ls -a | grep "api_identityserver" if [ $? -eq 0 ];then docker container stop api_identityserver docker container rm api_identityserver fi docker image prune << EOF y EOF docker build -t api_identityserver . docker run -d -p 8083:5000 --name=api_identityserver api_identityserver
步驟就是首先清理掉 docker 處於終止狀態的容器,而後判斷有沒有叫 api_identityserver 的容器在運行,若是有就直接停掉,而後清除全部的虛懸鏡像,使用當前目錄的 dockerfile 構建一個新的 api_identityserver 鏡像,使用 api_identityserver 鏡像運行一個新的容器。
這兒我安裝了 Jenkins 的一個 Blue Ocean 插件,來看一下:
運行一下: