Jenkins 流水線

采用Jenkins的自由風(fēng)格構(gòu)建的項目我碟,適合用于測試和學(xué)習(xí),主要問題有:

  1. 構(gòu)建過程中整體流程是不可見的,無法確認每個流程花費的時間
  2. 出現(xiàn)問題不方便快速的定位
  3. 無法進行版本化管理
  4. 多個任務(wù)中有很多步驟需要重復(fù)搭建

Jenkins的Pipeline可以讓項目的發(fā)布整體流程可視化虱朵,明確執(zhí)行的階段余境,可以快速的定位問題。并且整個項目的生命周期可以通過一個Jenkinsfile文件管理毁渗,而且Jenkinsfile文件是可以放在git中維護的践磅。

創(chuàng)建流水線項目

image.png

定義流水線

image.png

這里有兩種類型:

  • pipeline script : 表示直接在jenkins任務(wù)中維護腳本,用于初期測試還是比較好的
  • pipeline script from SCM:表示在版本管理工具中去拉取Jenkinsfile文件灸异,然后執(zhí)行構(gòu)建府适,線上已辦采用這種

這里我們先選擇pipeline script,然后寫一個hello world肺樟。

image.png

image.png

pipeline語法

// 所有腳本命令包含在pipeline{}中檐春,表示一條流水線
pipeline {  
    // 指定任務(wù)在哪個Jenkins節(jié)點執(zhí)行(Jenkins支持分布式)
    agent any
    
    // 配置全局環(huán)境,指定變量名=變量值信息
    environment{
        host = '192.168.11.11'
    }

    // 存放所有任務(wù)的合集
    stages {
        // 單個任務(wù)
        stage('任務(wù)1') {
            // 實現(xiàn)任務(wù)的具體流程
            steps {
                echo 'do something'
            }
        }
        // 單個任務(wù)
        stage('任務(wù)2') {
            // 實現(xiàn)任務(wù)的具體流程
            steps {
                echo 'do something'
            }
        }
        // ……
    }
}

在我們剛剛建的任務(wù)重么伯,寫一個測試例子:

pipeline {
    agent any

    // 存放所有任務(wù)的合集
    stages {
        stage('拉取Git代碼') {
            steps {
                echo '拉取Git代碼'
            }
        }

        stage('Maven構(gòu)建打包') {
            steps {
                echo 'Maven構(gòu)建打包'
            }
        }

        stage('制作Docker鏡像') {
            steps {
                echo '制作Docker鏡像'
            }
        }

        stage('Docker鏡像推送Harbor') {
            steps {
                echo 'Docker鏡像推送Harbor'
            }
        }

        stage('目標服務(wù)器拉取鏡像部署服務(wù)') {
            steps {
                echo '目標服務(wù)器拉取鏡像部署服務(wù)'
            }
        }
    }
}
image.png

這里我們可以看到每個階段的耗時疟暖、日志等信息。

自動生成命令

點擊流水線語法可以生成腳本命令

image.png

git拉取項目代碼命令

image.png
image.png

分支名稱使用${branch}替換蹦狂,最后生成腳本如下:

stage('拉取Git代碼') {
    steps {
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee_ssh_key', url: 'git@gitee.com:xiaolyuh/test.git']]])
        echo '拉取Git代碼成功'
    }
}

新增shell命令

image.png

新增sshPublisher: Send build artifacts over SSH命令

image.png
image.png

完整的腳本

定義參數(shù):


image.png
image.png
image.png

完整腳本

pipeline {
    agent any

    // 存放所有任務(wù)的合集
    stages {
        stage('拉取Git代碼') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee_ssh_key', url: 'git@gitee.com:xiaolyuh/test.git']]])
            }
        }

        stage('Maven構(gòu)建打包') {
            steps {
                sh ' /var/jenkins_home/maven/apache-maven-3.8.8/bin/mvn clean package -DskipTests'
            }
        }

        stage('制作Docker鏡像') {
            steps {
                sh '''mv **/target/*.jar docker/app.jar
                    echo "build Image start"
                    docker build -t $JOB_BASE_NAME:$tag docker/
                    echo "build Image success"'''
            }
        }

        stage('Docker鏡像推送Harbor') {
            steps {
                sh '''password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
                    echo "$password" | docker login $harbor_url --username \'robot$devops\' --password-stdin
                    docker tag $JOB_BASE_NAME:$tag $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                    echo "push Image start"
                    docker push $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                    echo "push Image success"'''
            }
        }

        stage('目標服務(wù)器拉取鏡像部署服務(wù)') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'test-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''harbor_url=$harbor_url
                port=$port
                tag=$tag
                project_name=$JOB_BASE_NAME
                imageName=$harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                
                containerId=`docker ps -a | grep ${project_name} | awk \'{print $1}\'`
                if [ "$containerId" != "" ] ; then
                    docker stop $containerId
                    docker rm $containerId
                    echo "Delete Container Success $containerId"
                fi
                
                imageId=`docker images | grep ${project_name} | awk \'{print $3}\'`
                
                if [ "$imageId" != "" ] ; then
                    docker rmi -f $imageId
                    echo "Delete Image Success $imageId"
                fi
                
                password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
                echo "$password" | docker login 192.168.232.7:80 --username \'robot$devops\' --password-stdin
                
                docker pull $imageName
                docker run -d -p $port --name $project_name $imageName
                echo "Start Container Success"
                echo $project_name''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'echo 1')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}
image.png

通過Jenkinsfile實現(xiàn)流水線任務(wù)

在代碼庫中新增Jenkinsfile文件

image.png

在代碼庫中新增Jenkinsfile文件誓篱,文件內(nèi)容和上面一樣,這樣的好處是Jenkinsfile可以通過版本管理工具管理凯楔,將整個構(gòu)建流程代碼化窜骄,方便管理。

使用Pipeline script from SCM流水線

image.png
image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摆屯,一起剝皮案震驚了整個濱河市邻遏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虐骑,老刑警劉巖准验,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異廷没,居然都是意外死亡糊饱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門颠黎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來另锋,“玉大人滞项,你說我怎么就攤上這事∝财海” “怎么了文判?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長室梅。 經(jīng)常有香客問我戏仓,道長,這世上最難降的妖魔是什么亡鼠? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任赏殃,我火速辦了婚禮,結(jié)果婚禮上间涵,老公的妹妹穿的比我還像新娘嗓奢。我一直安慰自己,他們只是感情好浑厚,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布股耽。 她就那樣靜靜地躺著,像睡著了一般钳幅。 火紅的嫁衣襯著肌膚如雪物蝙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天敢艰,我揣著相機與錄音诬乞,去河邊找鬼。 笑死钠导,一個胖子當著我的面吹牛震嫉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牡属,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼票堵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逮栅?” 一聲冷哼從身側(cè)響起悴势,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎措伐,沒想到半個月后特纤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侥加,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年捧存,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡昔穴,死狀恐怖短蜕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傻咖,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布岖研,位于F島的核電站卿操,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孙援。R本人自食惡果不足惜害淤,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拓售。 院中可真熱鬧窥摄,春花似錦、人聲如沸础淤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸽凶。三九已至币砂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玻侥,已是汗流浹背决摧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凑兰,地道東北人掌桩。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像姑食,于是被迫代替她去往敵國和親波岛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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