Jenkins使用Pipeline部署項目到遠程windows

因為工作需要,依舊還有一些主機為windows,在網(wǎng)上相關資料也不多,總結一下我的方式供各位參考.
使用ssh進行jenkins主節(jié)點與目標部署服務器進行通信,文件傳輸走scp協(xié)議,執(zhí)行執(zhí)行使用ssh命令遠程到目標主機進行執(zhí)行.

ssh調(diào)用命令腳本

使用ssh命令遠程服務器進行腳本調(diào)用的時候的流程是:

  1. 在本級ssh到目標主機
  2. 調(diào)用目標主機的腳本啟動tomcat,假如我們調(diào)用的是bin目錄下startup.bat
  3. 本機的終端窗口有輸出,遠程主機的tomcat啟動成功
  4. 關閉本級的ssh終端
  5. 遠程的tomcat隨之關閉

要解決的問題

ssh調(diào)用的進程的生命周期問題

查閱資料發(fā)現(xiàn)

image-20190704223510253.png

針對上述情況在linux下的解決方案很多,這里描述下winsows的解決方案.

在這個回答下,采取了將tomcat做成Windows服務的方式,問題得到解決,具體的配置方式如下:

設置tomcat的環(huán)境變量

下載安裝版的Windows版tomcat,在bin目錄下分別為server.bat凛辣、startup.bat、shutdown.bat設置環(huán)境變量,如下所示

image-20190704224910131.png

將tomcat注冊為服務

進入bin文件夾下執(zhí)行

service install 服務名稱

[圖片上傳中...(image-20190704230244896.png-4869a1-1562942345129-0)]

服務的啟動與停止

net stop server-name
net start server-name
image-20190704230244896.png

將這兩條指令做成bat腳本,放在bin目錄下,供之后jenkins直接調(diào)用.

image-20190704230544740.png

jenkins的終端輸出亂碼

在linux下遠程調(diào)用Windows的終端的時候,在jenksin的控制臺總是亂碼.查閱資料多數(shù)是說設置Jenkins的編碼為U8,但是我安裝的jenkins本身設置就是U8,后來發(fā)現(xiàn)在遠程調(diào)用的bat腳本第一行設置為

chcp 65001

表示切換到utf-8模式即可,之后輸出默認為英文且不會再亂碼.

是否有必要每次重啟Tomcat

場景

在實際使用的過程中,每次部署假如都需要重啟tomcat的話使得整個系統(tǒng)變得不穩(wěn)定,那么是否每次更新都要重啟tomcat呢?

首先我描述一下我遇到的一個問題,在jenkins中設置了一個重啟tomcat的腳本,腳本如下:

pipeline {
    environment {
        // 部署遠程主機ip地址,需要通過密鑰的方式設置免密登錄
        remoteIp = "127.0.0.1"
        remotePort='22'
        // 失敗通知Email
        email = "test@haigeek.cn"
        // 遠程tomcat位置(windows要使用/來表示路徑)
        tomcatPath = "E:/tomcat/apache-tomcat-8.5"
        tomcatPathDisk = "E:"
    }
    agent any
    tools {
        maven 'maven-3.6.1'
    }
    stages {
        stage('Deploy') {
            steps {
                withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
                    sh '''
                        export BUILD_ID=dontKillMe
                        echo "開始使用scp傳輸文件"
                        echo "開始調(diào)用遠程tomcat進行重啟"
                        ssh  -p ${remotePort} administrator@${remoteIp} "cd ${tomcatPath}/bin && ${tomcatPathDisk} && restart"
                    '''
                }
            }
        }
    }
}

上面的腳本核心功能就是調(diào)用遠程tomca下的restart腳本來重啟動tomcat,因為使用net stop tomcat 來關閉tomcat需要比較長時間,加上我們tomcat上運行的是dubbo項目,因此我直接使用taskkill的方式,根據(jù)dubbo端口來殺進程,結論是每次都可以成功殺死進程并重啟tomcat,如下圖,kill的腳本如下:

@echo off
chcp 65001
REM 設置dubbo端口號
 set port=30109
 for /f "tokens=5" %%i in ('netstat -aon ^| findstr ":%port%"') do (
    set n=%%i
 )
 taskkill /pid %n% -F

jenkins的輸出如下:

image-20190712221521459.png

但是當我將這個腳本集成在完整的pipeline中,會出現(xiàn)taskkill失敗的情況,報錯為PIDxxx為系統(tǒng)進程,無法殺死.

分析

分析了一下,唯一不同的是我在殺死tomcat之前將最新打包出的war包移動到了tomcat下,此時tomcat開始自動解壓并重新部署,注意此時進程已經(jīng)不是tomcat的進程id,而是切換為系統(tǒng)的進程.

在后期的測試中發(fā)現(xiàn)war包可以自動幫助我們熱更新,這個功能可以大大減少我們更新的速度.

解決

解決方法很簡單,將kill tomcat的指令放在移動war包之前,不再報錯.

完整Pipeline

// 持續(xù)集成腳本职烧,勿動

pipeline {
    environment {
        // 部署遠程主機ip地址,需要通過密鑰的方式設置免密登錄
        remoteIp = "127.0.0.1"
        remoteName = "administrator"
        remotePort='22'
        // 遠程tomcat位置(使用/來表示路徑)
        tomcatPath = "C:/tomcat/apache-tomcat-8"
        tomcatPathDisk = "C:"
    }
    agent any
    tools {
        maven 'maven-3.6.1'
    }
    stages {
         stage('pullcode'){
            steps{
                git branch: 'dev', credentialsId: 'xxx', url: 'http://xxx.git'
            }
        }

        stage('Build') {
            steps {
                sh '''
                    echo "開始編譯打包過程"
                    echo "PATH = ${PATH}"
                    echo "M2_HOME = ${M2_HOME}"
                    mvn clean && mvn package -DskipTests=true
                '''
            }
        }
          stage('Test'){
            steps {
                sh 'echo "Test stage"'
            }
        }

        stage('Deploy') {
            steps {
                withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
                    sh '''
                        export BUILD_ID=dontKillMe
                        echo "關閉tomcat,此步非必須,可使用war進行熱部署"
                        ssh  -p ${remotePort} administrator@${remoteIp} "cd ${tomcatPath}/bin && ${tomcatPathDisk} && dubbokill"
                        echo "開始使用scp傳輸文件"
                        warfile1=$(ls 項目名稱/target/*.war)
                        scp -P ${remotePort} "${warfile1}"  ${remoteName}@${remoteIp}:${tomcatPath}/webapps
                        warfile2=$(ls 項目名稱/target/*.war)
                        scp -P ${remotePort} "${warfile2}"  ${remoteName}@${remoteIp}:${tomcatPath}/webapps
                        echo "開始調(diào)用遠程tomcat進行重啟,此步驟非必須"
                        ssh  -p ${remotePort} administrator@${remoteIp} "cd ${tomcatPath}/bin && ${tomcatPathDisk} && servicestart"
                    '''
                }
            }
        }
    }
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扁誓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚀之,更是在濱河造成了極大的恐慌蝗敢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件足删,死亡現(xiàn)場離奇詭異前普,居然都是意外死亡,警方通過查閱死者的電腦和手機壹堰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骡湖,“玉大人贱纠,你說我怎么就攤上這事∠煸蹋” “怎么了谆焊?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浦夷。 經(jīng)常有香客問我辖试,道長辜王,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任罐孝,我火速辦了婚禮呐馆,結果婚禮上,老公的妹妹穿的比我還像新娘莲兢。我一直安慰自己汹来,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布改艇。 她就那樣靜靜地躺著收班,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谒兄。 梳的紋絲不亂的頭發(fā)上摔桦,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音承疲,去河邊找鬼邻耕。 笑死,一個胖子當著我的面吹牛纪隙,可吹牛的內(nèi)容都是我干的赊豌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绵咱,長吁一口氣:“原來是場噩夢啊……” “哼碘饼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悲伶,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤艾恼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麸锉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钠绍,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年花沉,在試婚紗的時候發(fā)現(xiàn)自己被綠了柳爽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡碱屁,死狀恐怖磷脯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娩脾,我是刑警寧澤赵誓,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響俩功,放射性物質(zhì)發(fā)生泄漏幻枉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一诡蜓、第九天 我趴在偏房一處隱蔽的房頂上張望熬甫。 院中可真熱鬧,春花似錦万牺、人聲如沸罗珍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽覆旱。三九已至,卻和暖如春核无,著一層夾襖步出監(jiān)牢的瞬間扣唱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工团南, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留噪沙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓吐根,卻偏偏與公主長得像正歼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拷橘,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容