Jenkins2 學習系列27 -- pipeline 中 Docker 操作

TODO 待補充流程圖

構建任務在指定Docker鏡像中進行

如下面例子捆等,首先pull一個我打包好的基于ubuntu的node鏡像移剪,這個鏡像里面已經包含了nodejs10, wget, zip, curl, python叉庐,chrome,firefox, aws-cli 等常用工具副瀑,可以方便的在里面執(zhí)行npm install想幻,npm run test 啟動瀏覽器跑測試等。

pipeline {
  agent {
    docker {
       image 'finleyma/circleci-nodejs-browser-awscli'
    }
  }
  stage('Checkout') {
       steps {
          git branch: 'develop', credentialsId: 'github-private-key', url: 'git@github.com:your-name/angular-web.git'
     }
  }
  stage('Node modules') {
     steps {
        sh 'npm install'
     }
   }
  stage('Code Lint') {
     steps {
        sh 'npm run lint'
     }
  }
  stage('Unit Test') {
    steps {
      sh 'npm run test'
    }
  }
  // .... build, delpoy
}

pipeline 中操作鏡像

需要安裝 Jenkins docker workflow 插件,
下面的例子展示了:

  • 連接遠程Docker主機
  • 登錄私有Docker 倉庫(阿里云鏡像服務)
  • 根據代碼中的 Dockerfile 構建鏡像并push
  • 刪除Docker遠程主機中構建好的鏡像弥虐,不占用空間
  • 不包含目標主機中部署鏡像
    其實就說上篇文章中的pipeline版本
#!groovy

pipeline {
    agent any
    
    environment {
        // PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
        _docker_remote_server='tcp://192.100.155.155:2375'
        _aliyun_registry='https://registry.cn-zhangjiakou.aliyuncs.com'
    }

    stages {
        stage('debug')  {
            steps {
                script {
                    sh "printenv"
                }
            }
        }

        stage('connect remote docker') {
            steps {
                // 注意 代碼是先拉到了Jenkins主機上扩灯,但是構建鏡像在Docker遠程
                git 'https://github.com/mafeifan/docker-express-demo.git'

                script {
                    docker.withServer("${env._docker_remote_server}") {
                         // 第一個參數是私有倉庫地址,注意要帶http(s)霜瘪,第二個參數是賬號密碼登錄憑證珠插,需要提前創(chuàng)建
                        docker.withRegistry("${env._aliyun_registry}", 'aliyun-docker-registry') {
                            // 使用 ${GIT_PREVIOUS_COMMIT} 取不到 commint_id
                            // https://stackoverflow.com/questions/35554983/git-variables-in-jenkins-workflow-plugin
                            git_commit = sh(returnStdout: true, script: "git rev-parse HEAD").trim()
                            echo git_commit
                            def customImage = docker.build("fineyma/node-demo:${env.BUILD_NUMBER}-${git_commit}")
                            /* Push the container to the custom Registry */
                            customImage.push()
                            // 可以優(yōu)化,用匹配搜索并刪除
                            sh "docker rmi fineyma/node-demo:${env.BUILD_NUMBER}-${git_commit}"
                        }
                    }
                }

                // clean workspace
                cleanWs()
            }
        }
    }
}

這里 customImage.push() 貌似有個bug颖对,構建之后的鏡像有兩個一樣的捻撑,一個帶registry name一個不帶

關于 docker.build, docker.withRegistry 等是Jenkins docker workflow 插件提供的, 可以看源碼,其實是封裝了docker build, docker login缤底,你完全可以寫原生的docker 命令

關于遠程容器部署

既然鏡像已經成功上傳到阿里云的鏡像服務顾患,理論上任何裝有Docker的主機只要docker run就可以完成部署了(需要網絡通)。
實現(xiàn)方法我想到有幾種:

  1. 阿里云的鏡像服務提供觸發(fā)器个唧,即每當push新的鏡像上去描验,可以發(fā)送一個post請求到配置的地址,這樣可以完成容器部署操作坑鱼。Jenkins可以添加一個job膘流,暴露一個觸發(fā)地址給阿里云鏡像服務的觸發(fā)器。
  2. 在pipeline中添加ssh登錄目標主機鲁沥,然后添加 docker run --rm fineyma/node-demo:${env.BUILD_NUMBER}-${git_commit} step 步驟
  3. 目標主機也開放dockerd呼股,這樣連登錄都不需要了,直接docker client 操作遠程Docker完成部署画恰。

參考

https://jenkins.io/doc/pipeline/steps/docker-workflow
https://jenkins.io/doc/book/pipeline/docker

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末彭谁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子允扇,更是在濱河造成了極大的恐慌缠局,老刑警劉巖则奥,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狭园,居然都是意外死亡读处,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門唱矛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罚舱,“玉大人,你說我怎么就攤上這事绎谦」苊疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵窃肠,是天一觀的道長包个。 經常有香客問我,道長冤留,這世上最難降的妖魔是什么碧囊? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮搀菩,結果婚禮上呕臂,老公的妹妹穿的比我還像新娘破托。我一直安慰自己肪跋,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布土砂。 她就那樣靜靜地躺著州既,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萝映。 梳的紋絲不亂的頭發(fā)上吴叶,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音序臂,去河邊找鬼蚌卤。 笑死,一個胖子當著我的面吹牛奥秆,可吹牛的內容都是我干的逊彭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼构订,長吁一口氣:“原來是場噩夢啊……” “哼侮叮!你這毒婦竟也來了?” 一聲冷哼從身側響起悼瘾,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤囊榜,失蹤者是張志新(化名)和其女友劉穎审胸,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體卸勺,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡砂沛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孔庭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尺上。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圆到,靈堂內的尸體忽然破棺而出怎抛,到底是詐尸還是另有隱情,我是刑警寧澤芽淡,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布马绝,位于F島的核電站,受9級特大地震影響挣菲,放射性物質發(fā)生泄漏富稻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一白胀、第九天 我趴在偏房一處隱蔽的房頂上張望椭赋。 院中可真熱鬧,春花似錦或杠、人聲如沸哪怔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽认境。三九已至,卻和暖如春挟鸠,著一層夾襖步出監(jiān)牢的瞬間叉信,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工艘希, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硼身,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓覆享,卻偏偏與公主長得像佳遂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淹真,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • Docker 學習目標: 掌握Docker基礎知識讶迁,能夠理解Docker鏡像與容器的概念 完成Docker安裝與啟...
    執(zhí)筆夢一場閱讀 3,222評論 2 10
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,748評論 1 21
  • 1、傳統(tǒng)我們的項目開發(fā)模式是產品調研提出需求,開發(fā)團隊研究決定開發(fā)方案選型巍糯。然后開始一個周期的開發(fā)啸驯,模塊開發(fā)完成之...
    張熙閱讀 12,395評論 2 42
  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,375評論 1 39
  • 五、Docker 端口映射 無論如何祟峦,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機是訪問不到的罚斗。此外,除了...
    R_X閱讀 1,748評論 0 7