Git + Jenkins 自動化 NGINX 釋出簡易實現

東風微鳴發表於2023-01-27

概述

之前基於 GitLab + Jenkins 實現了簡單的 NGINX 的自動化釋出。
具體包含如下的元件:

  1. GitLab
    1. 包括 GItLab 的 WebHook;
  2. Jenkins 及其外掛:
    1. Generic Webhook Trigger
    2. Publish Over SSH

?疑問:

為什麼不用 Ansible?
答:這裡說明下,之所以不用 Ansible,是因為這個環境預設沒有安裝 Ansible,而且 Publish Over SSH 也足夠用了,就沒再用 Ansible 了。

詳細說明

這裡有 3 個幾個自動化 job,如下:

  1. Generic Webhook Trigger 用於和GitLab聯動, 自動觸發 WebHook
  2. Publish Over SSH 用於透過SSH 釋出NGINX配置

說明:

配置 WebHook
test-intranet-nginx 為例進行說明.

  1. 進入該專案 -> 設定 -> 整合. 如下圖:
    gitlab webhook
  2. URL裡填入: https://jenkins.example.com/generic-webhook-trigger/invoke?token=Jdy0bTQafyfUUBxJw33k(假設 jenkins.example.com 是 Jenkins 的控制檯域名,token 可以在對應的 Jenkins 外掛 Generic Webhook Trigger 中找到,這裡 token 是用於區別具體是哪個 job。)
  3. Trigger 選擇: Push events -> master.
  4. 按需取消勾選 Enable SSL verification. 儲存. 如下:
    gitlab webhook 填入 jenkins url 和 token

說明:

URL地址可以在 Jenkins的對應外掛裡找到.
Trigger可以按需調整.

在 Jenkins 的 系統配置裡 -> Publish over SSH:

如下圖:
jenkins 外掛 publish over ssh

填入:

  • Key
  • SSH Server的:
    • name(用於給 jenkins 使用者識別的使用者名稱)
    • Hostname(目標機器的 IP 地址)
    • Username(目標機器的 OS 使用者)
    • Remote Directory(需要把檔案傳送到的目標機器的目錄地址)

說明:

一般情況下,對於 NGINX, 目錄是2個, 為: /etc/nginx(放配置 *.conf) 和 /usr/share/nginx/html(放靜態 web 檔案)

以下圖 Job 為例:

首先配置 原始碼管理, 如下圖:

job 原始碼管理配置

填入:

  1. 倉庫 URL
  2. 認證資訊(如果是公開的庫, 就不需要認證資訊)
  3. 分支: master(按需調整)
  4. 原始碼庫的資訊:
    1. 本例中,型別是: gitlab
    2. URL
    3. GitLab 的 Version

然後配置 構建觸發器, 如下圖:

jenkins-webhook-trigger1.png

說明:

詳細使用請在瀏覽器輸入圖中的 URL 進一步檢視.

  1. Variable (使用預設配置)
  2. Expression (使用預設配置)
  3. Token

jenkins-webhook-trigger2.png

  1. Expression(解釋如下: 用於進行目錄過濾,填入正則後,只有目錄匹配正則且發生變化才會觸發構建)

  1. Text (預設配置)

最後, 是 構建後操作(實際「構建」過程沒做任何事情). 如下圖:

配置 publish over ssh

注意:

如果有多臺 nginx 要同時發, 就要在這裡同時寫上多臺 SSH Server.

  1. Name: 下拉框選擇對應Name
  2. Transfers
    1. Source files: 原始檔, 位於: iaas_web_xxxx/conf/**/*
    2. Remove prefix: 需要移除的字首, 為: iaas_web_xxxx/. 移除後, 示例為: conf/nginx.conf
    3. Remote directory: 不填寫就是之前填寫的目錄, 一般為 /etc/nginx. 那麼示例就釋出到: /etc/nginx + conf/nginx.conf, 即: /etc/nginx/conf/nginx.conf
    4. Exec command: 檔案傳輸過去後需要執行的命令. 為: nginx -t && nginx -s reload(或:sudo systemctl reload nginx). 即, 先 -t 驗證配置是否有語法錯誤, 然後再 reload 釋出. 如果驗證有問題, jenkins pipeline 會異常, 變黃或變紅.

釋出流程

  1. 使用者透過 IDE + Git, 在自己本地修改 NGINX Conf, 並最終 pushmerge(也會觸發push的動作) 到 master
  2. GitLab 接收到 push event, 觸發 webhook 呼叫: https://example.com/generic-webhook-trigger/invoke?token=Jdy0bTQafyfUUBxJw33k
  3. Jenkins 收到 webhook trigger. 並結合 filter 的 Expression 進行判斷,確認匹配,則開始自動啟動一次 Job.
  4. 該 Job 過程為:
    1. 將存有 nginx 配置的倉庫 pull 到 jenkins.
    2. 透過 Publish over SSH, 將相關目錄和檔案傳輸到 SSH Server 的指定目錄
    3. 執行 nginx 命令, 進行釋出.
  5. 結束.

提示:

如果因為其他異常, 導致未自動釋出,那麼也可以手動點選 Job 頁面的: 立即構建 進行手動觸發

可以透過首圖的 rss 訂閱: Atom feed 失敗, 這樣釋出失敗你就會及時收到郵件.

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章