這次整理的文檔是Jenkins+Docker實現自動化部署,很早之前就寫的,今天有時間就搬到博客園做個記錄。
Jenkins是基於Java開發的一種持續集成工具,主要用於持續、自動的構建/測試軟件等相關項目。在Java開發中我們經常能看到使用jenkins來部署,.Net core目前還是比較少見的,但是好的東西我們就應該要拿來使用、借鑒。
1. 安裝JenKins
這里使用Docker來安裝JenKins,當然也可以直接安裝到Linux中。
創建jenkins工作目錄
mkdir /usr/local/jenkins
拉取jenkins鏡像
docker pull jenkins
這里有個小插曲,我用的是jenkins鏡像,默認也是latest一般意味着最后最新版本。很多官方最新鏡像也都是如此命名;直到后來安裝配置完成后,登錄進去提示我不是最新版本,讓我更新,並且很多插件已經不支持此版本了。發現當前版本和最新版本還相差好幾個。心想這不是官方鏡像嗎 怎么還是這么舊的版本,最后通過搜索發現,Jenkins官方最新鏡像現在已改為jenkins/jenkins的了。
所以最新版是:jenkins/jenkins
我們拉取最新lts版本。
docker pull jenkins/jenkins:lts
看如下圖jenkins和jenkins/jenkins兩個鏡像的差別,發現常規下的latest版本並不最新的了,它們的創建時間已經是1年以前了。而jenkins/jenkins 則創建時間在2天不到。
所以常規的latest並不意味着最新版本。
修改jenkins目錄和docker目錄權限,這里1000是容器中Jenkins 的用戶 uid
chown -R 1000:1000 /usr/local/Jenkins
sudo chown -R 1000:1000 /var/run/docker.sock
尤其docker.sock 這個權限很重要,到時候容器里的Jenkins需要執行docker命令需要的
運行Jenkins 注意后面的鏡像名稱和版本lts
docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
參數解釋:
-p 8080:8080 -p 50000:50000 --映射jenkins端口
--name jenkins --容器名稱自己命名
privileged=true --授予容器管理員權限
-v /usr/local/jenkins:/var/jenkins_home --映射jenkins目錄
-v /usr/bin/docker:/bin/docker --映射docke目錄 到時候需要在容器里執行docker命令
-v /var/run/docker.sock:/var/run/docker.sock --映射docker執行命令 到時候需要容器里執行docker命令。
容器是否啟動成功最好還是通過docker ps 或者netstat –ntlp |grep 8080 (查看我們容器映射的端口是否監聽成功) 查看當前容器是否運行成功。
某些情況下,如權限沒有配對,啟動會不成功的。
查看正在運行的容器。
docker ps
2. 配置JenKins
查看容器啟動成功后,我們可以通過地址+端口訪問剛剛運行的Jenkins
例如http://192.168.1.101:8080
安裝成功訪問后會如下圖所示。
提示首次訪問需要密碼,我們通過剛剛映射的Jenkins目錄里查看這個默認密碼。
默認密碼路徑:/usr/local/jenkins/secrets/ (注意前面usr/local/jenkins路徑就是剛剛自己映射的目錄)
查看密碼文件
cat initialAdminPassword
輸入密碼然后繼續下一步。
下一步如果有出現404的,如下圖
網上搜索了解聽說是Jenkins的一個bug;部分版本存在。
解決辦法(以下步驟是解決登錄404的;如果沒有404則可以跳過)
首先回到Jenkins主目錄找到config.xml文件並打開。
將<useSecurity> 修改為false
停止並重新運行jenkins
重啟后一定要重新查看默認密碼,否則舊密碼是登錄不成功的。
登錄進去以后這里默認選擇推薦的插件。
接下來就是等待安裝,這里需要注意,如果jenkins版本比較老,則可能很多插件安裝失敗,直接紅色的。此時可以跳過該界面進入首頁。會有提示讓你升級最新Jenkins版本。
安裝完成后創建一個用戶名和密碼,即可完成安裝進入首頁。
3. 創建項目
1、源代碼編譯發布工程
源代碼發布工程即將源代碼提交到git服務器,jenkins通過git拉取最新的源代碼,並通過Dockerfile里的配置進行編譯發布過程。然后通過Docker構建此鏡像並運行到容器。
創建一個.Net Core Web項目。
創建項目的時候可以選擇啟用Docker支持。
對於之前的項目可以右鍵添加Docker支持。
項目目錄
默認的Dockerfile是有幫我們進行代碼編譯並發布動作的。所以默認的Dockerfile文件是適合和代碼一起提交到服務器然后使用Docker進行構建鏡像。
項目創建完成后隨代碼一起提交到git服務器。(svn等也都可以)
git項目目錄,注意將Dockerfile復制到根目錄。由於到時候構建鏡像的時候就是從根目錄執行的。git目錄如下所示。
2、已編譯的Release工程
已編譯的Release工程,此種方式適合git或svn在局域網的;又不希望源代碼不暴露到外網的需要。此種方式是將項目工程進行進行發布打包操作。例如java常見的打包成一個war包文件。.Net 就是生成對應的DLL 文件。
項目在發布之前我們對項目的Dockerfile文件屬性做個更改,以便在發布時將此文件復制到發布時的目錄。
選擇上面建立的WebTest項目右鍵發布,選擇發布到指定文件夾。
將發布文件發布到自己的git(或svn)目錄,如下圖所示的,一定要包含Dockerfile文件。發布后的文件,可以根據自己需要將沒有更新DLL或者appsetting.json等文件剔除掉。只保留本次要更新的文件即可。
修改Dockerfile文件,因為默認的Dockerfile文件是包含編譯發布的命令,所以這里要將這些相關命令操作刪除掉;保留如下命令配置即可。
保存然后提交到所有文件到git服務器。
提交后的git目錄。
建議:無論是代碼編譯發布工程還是已編譯的Release工程,第一次使用Docker部署時最好先自己手動將這些文件拷貝到服務器,並手動構建對象並運行容器看是否成功;能否訪問網站。也就是先不用Jenkins將這些流程自己手動走一遍,確保一些目錄包括Dockerfile等都是配置正確的。
4. 創建JenKins任務
項目工程創建完成並提交到git服務器后,開始在Jenkins里面創建任務。
輸入項目描述,源代碼管理選擇自己對應的即可。
我這里選擇的git。第一次添加項目時需要添加一種授權方式點擊右邊添加按鈕即可。
選擇添加授權方式 常用的就是用戶名加密碼或者SSH方式。
下一步設置構建環境
設置觸發器,這里主要是設置自動觸發條件,有定時構建、遠程觸發構建、輪詢SCM。
這里只設置輪詢SCM形式的,很簡單的方式。意思是在指定間隔時間內會去輪詢git或svn中版本是否有變化。如果有就立即構建該項目。其實就是做到只要代碼提交了 則立刻就能自動構建項目進行發布;不在需要其他任何操作了。
選擇構建—>執行shell;當然我們這里是linux服務器所有多數選擇執行shell。
添加shell 命令。
注意下面的webtest 改為自己的容器名稱和對應鏡像名稱即可。
#!/bin/bash # 獲取短版本號 GITHASH=`git rev-parse --short HEAD` docker stop webtest docker rm webtest echo ---------------Building Docker Image...------------------ docker build -t webtest:$GITHASH . docker tag webtest:$GITHASH webtest:latest echo ---------------Launching Container...------------------ docker run --name webtest -d -p 8005:80 webtest:latest
使用git提交代碼進行測試。
自動開始構建了 注意jenkins這里時間是默認是utc時間。utc時間轉換我們北京時間是要+8小時的。
藍色圖標代表構建成功,如果失敗會是紅色
查看控制台輸出信息,尤其構建失敗時能夠從里面獲取到失敗原因等。
控制輸出如下圖所示
構建成功后我們到服務器檢查下是否有剛剛構建的鏡像和運行的容器。(當然一般情況下只要構建成功這兩步可以不用檢查)
查看鏡像
查看運行的容器
訪問站點看能否訪問成功。