Jenkins安裝並部署Java項目完整流程

記錄Centos系統上安裝Jenkins部署Spring Boot項目流程,並通過github Webhooks通知Jenkins代碼更新信息並自動重新部署項目。

準備環境

  • JDK1.8

    yum install java-1.8.0-openjdk* -y
    java -version
    
    能顯示版本即安裝成功,無需再配置環境
  • Git

    yum install git
    
  • Maven

    個人的Maven安裝目錄是/usr/bin/maven
    mkdir /usr/bin/maven
    wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    tar xzvf apache-maven-3.6.3-bin.tar.gz
    cd /usr/bin/maven/apache-maven-3.6.3/conf
    
    將settings.xml倉庫更改爲阿里雲倉庫並配置服務器倉庫路徑,如本地已有Maven配置文件,直接把本地文件上傳到服務器並更改倉庫路徑即可(推薦FinalShell,可直接拖到文件到指定文件夾)在這裏插入圖片描述
    配置Maven環境變量vi /etc/profile
    export M2_HOME=/usr/bin/maven/apache-maven-3.6.3
    PATH=$M2_HOME/bin:$PATH

    Ctrl+C輸入:wq保存退出,source /etc/profile重載環境變量,mvn -v能正確顯示maven版本即配置成功
    在這裏插入圖片描述
  • Jenkins

    執行以下命令安裝jenkins:
    wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
    rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
    yum install -y jenkins
    
    修改配置文件vi /etc/sysconfig/jenkins並將端口號配置爲8500:JENKINS_PORT=“8500”
    jenkins啓動相關指令:
    service jenkins start #啓動
    service jenkins restart #重啓
    service jenkins stop#停止
    
    初始密碼在/var/lib/jenkins/secrets/initialAdminPassword文件中,訪問http://ip:8500/安裝推薦插件。

Jenkins配置(Manage Jenkins)

  • System Configuration

    配置maven、git、email並Save,其中maven與git配置爲必須,maven配置用於jenkins找到mvn指令位置,git用於jenkins從倉庫拉取文件:
    在這裏插入圖片描述
  • Global Tool Configuration

    配置全局工具路徑,主要配置JDK、Git、Maven並Save:
    在這裏插入圖片描述
    注:java地址可通過ls -lrt /etc/alternatives/java查找,如下圖:
    在這裏插入圖片描述
  • Manage Plugins

    如果需要構建Jenkins的Maven項目則需安裝Maven Integration插件,但使用jenkins maven插件創建的項目執行mvn install後就會顯示sucess,如需再執行指令設置構建unstable的話使用Freestyle項目也可。由於Freestyle的把控性更強且更自由,配置了maven環境後也可通過maven指令構建而不需再按照Jenkins Maven Integration插件,所以該文着重介紹Freestyle且更推薦使用Freestyle構建。
    在這裏插入圖片描述

Jenkins項目配置(New Item)

1. 配置項目github地址,git Credentials可使用用戶名密碼或SSH key
在這裏插入圖片描述
2. 配置執行腳本

BUILD_ID=DONTKILLME
# 獲取正在運行的ecs-application程序pid
pid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')
if [ ${#pid} != 0 ]
    then kill -9 $pid
fi
cd /var/lib/jenkins/workspace/ecs-application
mvn clean package
nohup java -jar /var/lib/jenkins/workspace/ecs-application/target/ecs-application.jar -Xmx512m -Xms512m -Xss4m &
pid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')
# 獲取正在運行的ecs-application的pid並判斷其字符串長度,0爲不存在(即構建失敗)
if [ ${#pid} == 0 ]
    then
     echo "*****  BUILD FAILED  ******"
     exit 1
     else
     echo "*****  BUILD SUCCESS  *****"
fi

需要注意的是Jenkins執行腳本中若不添加BUILD_ID=DONTKILLME的話則會在執行完腳本後會把腳本中的程序關閉。jenkins創建的所有項目都可以在/var/lib/jenkins/workspace中找到。爲了避免程序運行失敗結果卻顯示成功,當執行程序後pid不存在則exit 1,且需設置build unstable符號值,如下圖:
在這裏插入圖片描述
如有郵箱發送需求也可在Post-build Actions設置Email Notification
3.構建
在這裏插入圖片描述
直接在項目Build Now或在jenkins主頁面中點擊項目最右側符號即可。通過項目Workspace可查看/var/lib/jenkins/workspace當前項目中的所有文件,將日誌文件配置爲該workspace目錄下文件時即可查看當前程序的運行日誌,如在jenkins查看當前項目日誌/var/lib/jenkins/workspace/ecs-application/logs/info.log
在這裏插入圖片描述
附日誌配置文件logback-spring.xml(爲了出錯更容易定位添加error.log配置):

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true">

    <!-- 文件輸出格式 -->
    <property name="PATTERN"
              value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) %-5level [%thread] %c [%L] : %msg%n"/>
    <!-- log文件路徑 -->
    <property name="LOG_PATH" value="/var/lib/jenkins/workspace/ecs-application/logs"/>

    <!--彩色日誌定義-->

    <property name="CONSOLE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %([%thread])  %cyan(%logger) : %msg%n"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/info.log</File>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符 -->
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>

    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/error.log</File>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>

    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
</configuration>

4. 配置Webhook
每次推完代碼之後都要上Jenkins重新點擊啓動項目,這肯定是很麻煩的,但可以通過安裝Webhook插件,讓github或gitlab接收到代碼更新後把該信息發送到服務器jenkins上,讓jenkins自動去拉代碼重新部署項目。在Jenkins插件管理安裝以下插件:
Webhook插件
當然了,只裝不看就沒有用了,點擊插件看一下了解一下用法:
Webhook插件Doc
該Webhook插件的一個規則是接收所有HTTP請求,接收地址爲JenkinsURL/generic-webhook-trigger/invoke 。既然有接收地址自然有發送地址,github配置Webhook入口在項目的Settings菜單下,配置如下:
在這裏插入圖片描述
雖然配置了github Webhooks,但Jenkins接收到github的消息後仍不知要更新哪個項目,因爲可能jenkins下有多個同一github地址下的項目,此時就需要對Jenkins的項目進行Webhook配置了。上圖中的URL地址欄添加了token參數,該參數是根據Jenkins的Webhook插件規則配置的。Jenkins安裝Webhook插件後Jenkins項目Configure中的Build Triggers中會出現Generic Webhook Trigger選項,勾選該選項Jenkins即可監聽到該項目對應的github倉庫代碼更新後自動重新部署項目。爲了提高安全性可以在地址欄參數或header添加Token。
Generic
注:如果沒有硬件防護建議開啓防火牆只暴露有需要的端口,避免服務器被挖礦(親身體驗),相關指令如下(在本文中的服務器是進行了8500端口的開放):
重啓:firewall-cmd --reload
永久開放端口:firewall-cmd --zone=public --add-port={port}/tcp --permanent
永久關閉端口:firewall-cmd --remove-port={port}/tcp --permanent
查看開放端口:firewall-cmd --list-ports
關閉防火牆命令:systemctl stop firewalld.service
開啓防火牆:systemctl start firewalld.service
更多指令可通過tab鍵或firewall-cmd -h查看

結語

在實際生產中如果項目只有幾個人負責沒有更多的要求的話按以上流程就基本可以完成項目的自動部署流程了(曾經工作過的小公司大致流程跟以上差不多,開發公衆號時自己一個負責也就沒有太多的Jenkins鑑權管理),當然git的分支也可能需要切換,當項目有一定規模開發人員有一定數量時則必須做好權限的管理了,把分支的整合部署集權在少數人少,避免每次的小更改都需重新部署。以上流程看看就好,因爲沒必要記住自己喫過多少麪包片,瞭解喫法就好
麪包片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章