使用持續整合系統解放生產力

昊羲發表於2019-03-19

程式猿除了希望寫好程式碼,一定也想著自己的專案可以如何快速的迭代上線,從而可以專注的完成程式碼的編寫,減少繁雜的運維等工作。例如完成一項功能的開發後,推送到 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 的情況下,常常為以下問題感覺不爽:

  1. 部落格更新後推送到 Github 的速度總是很慢,沒有使用國內程式碼託管平臺那樣的流程體驗
  2. 每次想釋出部落格時,還需手動執行一下 hexo deploy 命令,我只想把最新的更新推送到 Git 上後就不再管了

這時候 Jenkins 便派上用場了,以上這些都可以交給它來自動完成。整個釋出流程如下:

使用持續整合系統解放生產力

配置 Jenkins 持續整合任務

安裝外掛

Jenkins 在安裝時已附帶了常用的外掛,由於這需要接收 coding 的推送通知和生成 hexo 靜態檔案,因而需要 Coding WebhookNodeJS 這兩個外掛。可以在 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,現在也有很多新型的工具或平臺可以更方便的完成這些配置。比如 DaoCloudcdsdrone, flowci 等等,可以挑一個最順手的好好研究。

相關文章