Jenkins in Action :GitLab 部署 Maven 項目

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

Jenkins 是開源 CI/CD 軟件領導者, 提供超過1000個插件來支持構建、部署、自動化, 知足任何項目的須要。

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

配置需求

  • 1c 2g 服務器 1 臺
嘗試 Vultr、Amazon aws 和阿里雲 ECS 後,得出結論:
若 Git Provider 爲 GitHub,因爲網絡緣由,應選用 Vultr 等 VPS 或 aws 等國外服務器。
但價格相對較國內雲提供商較貴,若使用 1c 1g 服務器在構建中服務器容易崩潰。
Gitee 是國內鏈接速度最快的 Git Provider,但 Jenkins 對於 Gitee 的插件支持少。
因此採用 GitLab + 阿里雲 Ecs 解決方案。

在明確需求以後,則須要參考官方文檔着手部署 Jenkins 服務器。git

Jenkins 會在 Build 完成以後 kill 掉腳本中開啓的進程,因此建議使用 nohup java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war & 運行 Jenkinsweb

服務器準備

  • 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.shell

選項名稱 填寫參數 說明
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 位於項目根目錄下。bash

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

這裏 Jenkinsfile 使用 Groovy 語法。服務器

腳本樣例

在項目經過 Publish Over SSH 傳輸到服務器上以後,須要必定的操做才能正確部署。網絡

stop.shmaven

#!/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 &
相關文章
相關標籤/搜索