前言
在前后端分離開發的項目當中為了避免重復構建發布,我們需要部署一個持續發布環境,而目前的開發環境服務器都是基于 centos 的,因此每次在本地發布之后還需要打包,上傳,部署,十分繁瑣。故這里采用了比較成熟的jenkins 作為持續部署環境。
為了方便安裝,我們這里使用了 docker 來進行安裝,至于 docker 安裝的步驟這里不在贅述,詳情可以參考這一篇博文。
上面安裝的是一個較老的版本,這里推薦參考docker 官方文檔來進行安裝。
安裝好 docker 之后,拉取 jenkins 的官方鏡像。執行如下命令:
1
|
docker pull jenkins /jenkins |
拉取完畢之后我們基于這個鏡像封裝一個新的鏡像出來,可能會問為什么不能直接使用呢?因為這兒的 jenkins鏡像并不包含 docker 環境,所以我們需要封裝一個新的鏡像讓其能夠訪問宿主機的 docker 程序。
構建 dockerfile 內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 鏡像:
1
|
docker build -t docker /jenkins . |
下面我們就開始運行我們的 jenkins 容器了:
1
2
3
4
5
|
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 的一些配置項等。
注意,這里可能會出現如下錯誤:
1
2
|
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,執行如下命令:
1
|
sudo chown -r 1000:1000 /home/docker/jenkins |
之后再次運行 jenkins 的容器,訪問 http://服務器ip:8080/ 站點,會提示你輸入密鑰:
我們來到宿主機執行以下 shell 命令:
1
|
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 鏡像,運行如下命令:
1
|
docker pull microsoft /dotnet :latest |
拉取鏡像之后,我們來編寫一個 dockerfile 文件來讓 jenkins 來執行 shell 構建。
如果你還不知道如何編寫 dockerfile 文件,可以參考 。
1
2
3
4
5
6
7
8
9
10
11
12
|
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,就像這樣:
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/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 插件,來看一下:
運行一下:
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/myzony/p/8434121.html