Jenkins in Action :GitLab 部署 Maven 專案

散拾兄發表於2019-02-18

隨著專案進展接近尾聲,服務端自動化部署也逐漸提上日程。按照初期想法,採用 Jenkins 實現自動化部署。

Jenkins 是開源 CI/CD 軟體領導者, 提供超過1000個外掛來支援構建、部署、自動化, 滿足任何專案的需要。

順便插播一句廣告,歡迎參與 Jenkins 中文字地化建設。

配置需求

  • 1c 2g 伺服器 1 臺

嘗試 Vultr、Amazon aws 和阿里雲 ECS 後,得出結論: 若 Git Provider 為 GitHub,由於網路原因,應選用 Vultr 等 VPS 或 aws 等國外伺服器。 但價格相對較國內雲提供商較貴,若使用 1c 1g 伺服器在構建中伺服器容易崩潰。 Gitee 是國內連線速度最快的 Git Provider,但 Jenkins 對於 Gitee 的外掛支援少。 所以採用 GitLab + 阿里雲 Ecs 解決方案。

在明確需求之後,則需要參考官方文件著手部署 Jenkins 伺服器。

Jenkins 會在 Build 完成之後 kill 掉指令碼中開啟的程式,所以建議使用 nohup java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war & 執行 Jenkins

伺服器準備

  • git

Jenkins 需要從 GitLab 向 Jenkins 伺服器拉取程式碼。

  • jdk1.8

Jenkins 需要執行在 Java 8 環境下

  • maven

該專案需要使用 Maven 打包

Jenkins 外掛

  • Maven Integration

Jenkins 需要建立一個 Maven Item

  • Publish Over SSH

在 mvn 打包後需要部署到目標伺服器上

  • GitLab Plugin

需要從 GitLab 拉取專案

  • GitLab Hook Plugin

配置 GitLab 觸發器

Jenkins 配置

配置好外掛後,需要對 Jenkins 進行一定的配置。

Publish Over SSH 配置

Manage Jenkins->Configure System 找到 Publish Over SSH 。 在 SSH ServersAdd 一個 SSH Server,正確填寫專案部署伺服器資訊。 點選 Advanced,勾選 Use password authentication, or use a different key,正確填寫密碼,測試並儲存。

專案配置

  • 新建專案

選擇 Maven ProjectSource Code Management 選擇 Git,填入專案地址,賬戶資訊以及目標分支。

  • 配置觸發器。

Build Triggers 中選擇 Build when a change is pushed to GitLab,記下後面 GitLab webhook URL,根據需求配置 Advanced 中資訊。

  • 配置構建後動作。

Post-build Actions 中選擇已配置好的伺服器,根據實際情況填寫 Transfers 中資訊。

e.g.

選項名稱 填寫引數 說明
Source files **/workhelper*.jar Jenkins 會找到目錄下符合該正規表示式的檔案
Remove prefix target/ 通常 Maven 打包後檔案都會在 target 目錄下
Remote directory 該目錄相對於 Publish Over SSH 中配置的 Remote Directory
Exec command 見下文程式碼 部署後命令,是專案傳輸後執行的指令碼
#!/bin/bash
#Exec command 中的程式碼段
cd /root/project/
./stop.sh
./replace.sh
echo "Execute shell Finish"
BUILD_ID=dontKillMe /root/project/startup.sh
複製程式碼
  • GitLab 配置

GitLab 專案中 Settings->Integrations,URL 填寫上文記錄的 GitLab webhook URL,根據需求選擇觸發器,點選 Add webhook
Jenkins 中 Manage Jenkins->Configure System 找到 GitLab,取消 Enable authentication for '/project' end-point

Jenkinsfile 樣例

Jenkins 需要找到專案中的 Jenkinsfile 才能按照需求工作,Jenkinsfile 位於專案根目錄下。

node {
  checkout scm
  echo "current branch: $BRANCH_NAME"
  if (BRANCH_NAME.startsWith("release")) {
    sh "mvn clean install"
  }
}
複製程式碼

這裡 Jenkinsfile 使用 Groovy 語法。

指令碼樣例

在專案通過 Publish Over SSH 傳輸到伺服器上之後,需要一定的操作才能正確部署。

stop.sh

#!/usr/bin/env bash
port=8848
#根據埠號查詢對應的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');

#殺掉對應的程式,如果pid不存在,則不執行
if [  -n  "$pid"  ];  then
    kill  -9  $pid;
fi
複製程式碼

replace.sh

#!/usr/bin/env bash
cp /root/workhelper-0.0.1-SNAPSHOT.jar /root/project/workhelper-0.0.1-SNAPSHOT.jar
複製程式碼

startup.sh

#!/usr/bin/env bash
nohup java -jar workhelper-0.0.1-SNAPSHOT.jar >log.log 2>&1 &
複製程式碼

相關文章