程式猿除了希望寫好程式碼,一定也想著自己的專案可以如何快速的迭代上線,從而可以專注的完成程式碼的編寫,減少繁雜的運維等工作。例如完成一項功能的開發後,推送到 Git 等程式碼管理系統後,剩下的測試、部署、上線等工作可以交給一個系統來自動化完成,這時便可以靠持續整合系統了。這裡記錄下我使用老牌的 Jenkins 持續整合系統來幫助自己完成的工作。
部署 Jenkins
使用 docker 部署 Jenkins
Jenkins 已有官方的 docker 映象,通過 docker 可以快速完成 jenkins 系統的部署。
我使用的 Jenkins 部署命令:
docker run --name=jenkins -td -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai jenkins/jenkins:lts
複製程式碼
解釋下各個執行選項
- --name=jenkins 將容器命名為 jenkins
- -td 分配一個偽 tty 終端,在後臺執行
- -v jenkins_home:/var/jenkins_home 將 jenkins_home 儲存卷掛載到容器 /var/jenkins_home,這樣在刪除或升級容器後資料也可以存在
- -p 8080:8080 -p 50000:50000 將容器的 8080 和 50000 埠對映到主機對應埠上
- -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai 配置環境變數 JAVA_OPTS=-Duser.timezone=Asia/Shanghai 這樣在 Jenkins 中顯示的時區才是中國地區的
nginx 反代設定
由於我在自己的域名下使用了 nginx 反代 Jenkins 埠,這裡再分享下我的 nginx 配置
upstream jenkins {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
server_name your.site.com;
return 301 https://your.site.com$request_uri;
}
server {
listen 443 ssl http2;
server_name your.site.com;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://jenkins;
proxy_redirect http:// https://;
# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header 'X-SSH-Endpoint' 'your.site.come:50022' always;
}
}
複製程式碼
初始化 Jenkins
第一次安裝 Jenkins 後,進入網頁還需要配置下 Jenkins 的首次執行設定。基本上按預設的一直點下一步就可以了,網上教程也很多,有問題可以自行搜尋。
配置持續整合專案
Jenkins 搭建完畢後,這裡就詳細演示下的通過 Jenkins 來完成釋出基於 hexo 的部落格的一系列流程。
為何需要 Jenkins
我基於 hexo 搭建了一個部落格,部落格程式碼託管於 Github,生成的靜態內容託管於 coding page,在沒有 Jenkins 的情況下,常常為以下問題感覺不爽:
- 部落格更新後推送到 Github 的速度總是很慢,沒有使用國內程式碼託管平臺那樣的流程體驗
- 每次想釋出部落格時,還需手動執行一下
hexo deploy
命令,我只想把最新的更新推送到 Git 上後就不再管了
這時候 Jenkins 便派上用場了,以上這些都可以交給它來自動完成。整個釋出流程如下:
配置 Jenkins 持續整合任務
安裝外掛
Jenkins 在安裝時已附帶了常用的外掛,由於這需要接收 coding 的推送通知和生成 hexo 靜態檔案,因而需要 Coding Webhook
和 NodeJS
這兩個外掛。可以在 Jenkins 首頁 -> 系統管理 -> 外掛管理
中選擇安裝。
配置 Jenkins
為了讓 Jenkins 有許可權拉取和推送程式碼,需要為 Jenkins 生成一個拉取程式碼的 ssh 金鑰,並新增到程式碼專案中。生成 ssh 金鑰的方法很多,一般可以在 Liunx 系統通過
ssh-keygen -t rsa
來建立,建立好後新增到 系統管理 -> 憑據 -> 系統 -> 全域性憑據
中,使每個專案都可以使用。之後還需將公鑰新增到對應的 Git 專案中。
為了可以編譯 hexo 專案生成靜態專案,還需要配置 NodeJS 外掛生成 hexo 外掛執行環境。可在 系統管理 -> 全域性工具配置
NodeJS 配置項中按如下配置新增 NodeJS 10.14.2 執行環境,並自動安裝 hexo。
配置任務
在完成一系列的準備工作後,可以建立執行具體流程的任務了。點選首頁左側的新任務,輸入一個喜歡的任務名,選擇構建一個自由風格的軟體專案。在 General 選項頁面,可以配置丟棄舊的構建節省空間。
Source Code Management 選項頁面需要配置託管程式碼的 Git 地址,這裡因為我們想配置 Jenkins 自動推送程式碼到 Github,因而需要配置兩個地址。
Build Triggers 選項頁面需要配置何時觸發這個專案,這裡我們配置為通過 coding webhook 來觸發。每次推送程式碼後,coding 便會通過一個 webhook 來通知 Jenkins 開始執行任務。
之後在 coding 專案的 設定 -> webhook
頁面配置好專案觸發地址和條件。
Build Environment 選項頁面配置任務所需的環境,這裡由於由於 hexo deploy 時需要 push 靜態頁面到 coding,也需要之前 git 倉庫認證的金鑰檔案,可以勾選 Use secret text(s) or file(s)
,將金鑰檔案提取出來以備接下來使用。同時在這裡配置 nodeJS 執行環境,並且勾選了在控制檯列印資訊中新增時間戳以便除錯。
Build 選項頁面配置任務需要執行的命令,這裡配置好 hexo 生成靜態頁面和部署所需各項命令。
Post-build Actions 選項頁面可配置任務執行前後需要執行的動作,這裡我們便可以通過 Git Publisher 推送程式碼到 Github 中,並通過傳送郵件告知任務執行結果。
後記
活用好此類持續整合工具,可以幫助我們完成開發流程中的很多事,極大的提升我們的開發效率。除了老牌的 Jenkins,現在也有很多新型的工具或平臺可以更方便的完成這些配置。比如 DaoCloud,cds,drone, flowci 等等,可以挑一個最順手的好好研究。