在容器中運行 Jenkins Pipeline 任務(資料)

 

Jenkins企業持續集成+網站自動部署(從0開始)html

  1. 企業網站,WEB網站,後臺基於Apache、Nginx對外發布的,發佈目錄;
  2. 發佈目錄存放的內容,網站的真實數據,更新網站就對網站發佈目錄數據進行替換;
  3. 開發提交一個需求,給一個網站zip|war包,如何去部署呢?
  4. 運維SA拿到zip、war包,找到要替換的服務器網站發佈目錄,對網站發佈目錄進行備份;
  5. 經過工具CRT、xshell、RZ上傳war包,上傳至服務器臨時目錄,解壓壓縮包;
  6. 經過cp命令、mv命令,將上傳war數據cp到網站發佈目錄;
  7. 重啓WEB服務器,讓網站最新的代碼生效,給測試人員、開發人員發一封郵件;

 

 

 

持續集成中的 pipeline 技術和 docker 都是當前正在發展的主流方向,固然把它們結合起來在 CI/CD 過程當中發揮出更強大的威力也是你們共同的目標。本文將介紹如何在 Jenkins pipeline 中集成使用 docker,好在當前的 Jenkins 已經默認經過插件實現了與 docker 的集成,因此這將是一段輕鬆愉快的旅程。java

添加 linux 主機做爲 build agentnode

簡單起見,咱們使用一臺安裝了 docker 的 linux 虛機,並經過 ssh 將其啓動爲 Jenkins server 的 build agent。主要操做步驟以下:linux

在 linux 機器上建立一個用戶 jenkins, 密碼爲 123456git

建立目錄 /var/jenkins, 並把 owner 修改成 jenkinsgithub

安裝 jre,注意:必須安裝docker

咱們經過下面的腳本一次搞定這些操做:shell

#!/bin/bash
# run this script like this: sudo./addsudouser.sh

useradd -m jenkins -d/home/jenkins -s /bin/bash;
echo 'jenkins:xA123456' | sudochpasswd
usermod -a -G sudo jenkins;
usermod -a -G docker jenkins;
echo 'jenkins   ALL=(ALL:ALL) NOPASSWD: ALL' >>/etc/sudoers;
sudo mkdir /var/jenkins
sudo chown jenkins/var/jenkins
sudo apt-get -y installdefault-jre

在 linux 虛機上執行上面的腳本,而後在 Jenkins 中添加 node(build agent):windows

其中的 「Remote rootdirectory」 就是剛纔建立的 /var/jenkins 目錄。」Launch method」 選擇 「Launchslave agents via SSH」。Host 爲 linux 虛機的 IP,Credentials則爲剛纔建立的 jenkins 用戶。centos

運行簡單的 demo

先來運行一個簡單的 demo。建立一個 pipeline 類型的 job,並輸入下面的 pipeline script:

pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

運行該任務,執行結果以下:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
[myjob] Running shell script
+ node --version
v7.10.1[Pipeline] }
[Pipeline] // stage[Pipeline] }

其中的命令 node —version 就是在容器中執行的。

經過 label 指定運行 stage 的 agent

Jenkins 默認會把任務分配給任何可用的 agent,若是咱們要指定任務執行的 agent,能夠在 docker 的配置中指定 label,這樣該任務只會被分配到具備某個 label 的 agent 上運行:

agent {
    docker {
        image 'node:7-alpine'
        label 'xxxxxx'
    }
}

在 Folder 級別指定 label 和 registry 信息

咱們還能夠在 folder 級別指定 label,這樣的設置會應用在 folder 內全部沒有設置 label 的任務上:

除了 label,還能夠設置 docker registry URL 及其身份認證的憑據。

運行多個不一樣的容器

咱們還能夠在不一樣的 stage 中運行不一樣的容器,其實就是每一個 stage 用本身的容器鏡像建立容器並執行任務,stage 之間沒啥關係:

pipeline {
    agent none
    stages {
        stage('Back-end') {
            agent {
                docker { image'appropriate/curl' }
            }
            steps {
                sh 'curl www.google.com'
            }
        }
        stage('Front-end') {
            agent {
                docker { image 'node:7-alpine'}
            }
            steps {
                sh 'node --version'
            }
        }
    }
}

使用 Dockerfile

經過指定 Dockerfile 文件,在 build agent 上直接構建容器鏡像,而後生成容器並執行命令。下面的 demo 中咱們經過 Dockerfile 建立一個包含 curl 工具的容器鏡像,而後經過該鏡像啓動容器並執行 HTTP 請求。該 demo 一共包含三個文件:Dockerfile 、entrypoint.sh 和 Jenkinsfile,你們能夠直接從這裏下載它們。

先看一下 Dockerfile 文件的內容:

FROM alpine:latest
RUN apk add —update curl&& rm -rf /var/cache/apk/*
COPY entrypoint.sh /
ENTRYPOINT[「/entrypoint.sh」]
CMD [「curl」]

其中的 entrypoint.sh 內容以下:

#!/bin/sh
set -e
# Prepend "curl" ifthe first argument is not an executableif ! type -- "$1"&> /dev/null; then
    set -- curl "$@"fi
exec "$@"

Jenkinsfile 的內容以下:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile'
            dir 'curl'
            label 'docker'
        }
    }
    stages {
        stage('Test') {
            steps {
                sh 'curl http://www.cnblogs.com/sparkdev/p/8795141.html'
            }
        }
    }
}

注意,該文件中咱們設置了 dir 爲 curl 目錄,這是由於此項目的 Dockerfile 文件不是在代碼庫的根目錄下,因此須要指定其相對目錄的路徑。
而後在 Jenkins 中建立 pipeline 類型的 job,並把 pipeline 的Definition 設置爲 「Pipeline script from SCM」 。接下來設置好代碼倉庫的路徑就能夠了。運行該任務,從日誌上能夠看到取完代碼後先經過 Dockerifle 文件構建了容器鏡像:並在容器中運行了 curl http://www.cnblogs.com/sparkdev/p/8795141.html 命令。

把生成的容器鏡像推送到倉庫中

上面的例子中咱們經過 Dockerfile 生成了容器鏡像,而且完成了相關的測試(經過 curl 請求了測試網頁)。接下來就是把生成的容器鏡像推送到鏡像倉庫中。下面將演示如何在 pipeline 中把構建的鏡像推送的鏡像倉庫。首先在 Folder 的配置界面中添加訪問 dockerhub.com 憑據以下:

若是是訪問 dockerhub 就不須要填寫 「Docker registry URL」。而後添加下面的Pipeline script:

node {
    checkout([$class: 'GitSCM', branches:[[name: '*/master']], userRemoteConfigs: [[url:'https://github.com/sparkdevo/ctools.git']]])
    docker.withRegistry('','9e70c1eb-814c-4cf2-97e9-5bfc20461231') {
        def customImage =docker.build("ljfpower/curl:${env.BUILD_ID}","./curl")
        customImage.inside {
            sh 'curlhttp://www.cnblogs.com/sparkdev/p/8795141.html'
        }
        customImage.push()
        customImage.push('latest')
    }
}

注意,9e70c1eb-814c-4cf2-97e9-5bfc20461231 剛纔建立的憑據的 ID,能夠從 foder 的 Credentials 界面中得到。運行這個任務,執行成功後去 dockerhub.com 上看一下,是否是已經把新構建的鏡像推送上去了:

 

總結

從本文的幾個簡單 demo 能夠看出,jenkins pipeline 和 docker 集成的已經很好了。固然你還能夠實現更多更復雜的用例,趕忙動手吧!

 

連接:

jenkins:https://www.iyunv.com/thread-536240-1-1.html

jenkins pipeline 語法詳解:https://www.cnblogs.com/fengjian2016/p/8227532.html

 

Jenkins pipeline 入門到精通系列文章   :  https://www.cnblogs.com/itech/p/5875428.html

Jenkins入門總結   :  https://www.cnblogs.com/itech/archive/2011/11/23/2260009.html

設置jenkins代理   : https://www.cnblogs.com/itech/p/5939741.html 

jenkins和docker 使用docker做爲slave     :  https://www.cnblogs.com/itech/p/5692218.html

jenkins和docker 在docker裏運行jenkins   : https://www.cnblogs.com/itech/p/5666615.html

 

jenkins插件 build timeout和build timestamp  :  https://www.cnblogs.com/itech/p/5694728.html

jenkins 插件開發資料  :  https://www.cnblogs.com/itech/p/5715252.html

 

jenkins2 pipeline 語法快速參考   :  https://www.cnblogs.com/itech/p/5679002.html

jenkins2 pipeline插件的10個最佳實踐   :  https://www.cnblogs.com/itech/p/5678643.html

jenkins2 pipeline實例  :  https://www.cnblogs.com/itech/p/5663676.html

jenkins2 groovy腳本參考  :  https://www.cnblogs.com/itech/p/5660717.html

jenkins2 Jenkinsfile和load  :   https://www.cnblogs.com/itech/p/5660628.html

jenkins2 multibranch    :  https://www.cnblogs.com/itech/p/5660244.html

jenkins2 Jenkinsfile   :  https://www.cnblogs.com/itech/p/5659997.html

jenkins2 pipeline高級    :   https://www.cnblogs.com/itech/p/5646219.html

jenkins2 pipeline入門    :  https://www.cnblogs.com/itech/p/5633948.html

jenkins插件 查看job修改歷史   :  https://www.cnblogs.com/itech/p/5629998.html

jenkins插件 查看job下次運行時間    :   https://www.cnblogs.com/itech/p/5629860.html

jenkins2 groovy語法  :  https://www.cnblogs.com/itech/p/5627968.html

jenkins2 javahelloworld    :   https://www.cnblogs.com/itech/p/5627640.html

 

jenkins2 pipeline介紹  :        https://www.cnblogs.com/itech/p/5621257.html

jenkins2 hello pipeline           :    https://www.cnblogs.com/itech/p/5611888.html

jenkins2 插件安裝   :  

Jenkins2 - 下載與啓動   :  https://www.cnblogs.com/itech/p/5603952.html

配置sonar和jenkins進行代碼審查  :  https://www.cnblogs.com/itech/p/5192557.html

Jenkins配置基於角色的項目權限管理   : https://www.cnblogs.com/itech/p/5192545.html

Jenkins和maven自動化構建java程序     :  https://www.cnblogs.com/itech/p/5192540.html

Jenkins修改workspace和build目錄                   :  https://www.cnblogs.com/itech/p/5192162.html

 

centos中安裝tomcat6   :  https://www.cnblogs.com/itech/p/3506011.html

centos安裝tomcat7   :  https://www.cnblogs.com/itech/p/3515846.html

centos中安裝tomcat+jenkins    :  https://www.cnblogs.com/itech/p/3506079.html

 

在centos中安裝jenkins master爲service    :  https://www.cnblogs.com/itech/p/3504906.html

在centos中安裝jenkins master測試環境   :  https://www.cnblogs.com/itech/p/3504722.html

 

 

Jenkins入門總結            : https://www.cnblogs.com/itech/archive/2011/11/23/2260009.html

Jenkins插件之有用  :  https://www.cnblogs.com/itech/archive/2011/11/23/2259994.html

Jenkins插件之Dashboard和wall display       :  https://www.cnblogs.com/itech/archive/2011/11/22/2259044.html

Jenkins插件之Deploy   :  https://www.cnblogs.com/itech/archive/2011/11/21/2257487.html

Jenkins插件之Publish Over SSH/CIFS/FTP   :  https://www.cnblogs.com/itech/archive/2011/11/21/2257377.html

Jenkins插件之VShpere Cloud  :  https://www.cnblogs.com/itech/archive/2011/11/21/2257038.html

Jenkins插件之Workspace cleanup + Copy to slave    :   https://www.cnblogs.com/itech/archive/2011/11/21/2256937.html

Jenkins插件之環境變量插件EnvInject   :    https://www.cnblogs.com/itech/archive/2011/11/18/2254188.html

Jenkins插件之構建與MSBuild   :  https://www.cnblogs.com/itech/archive/2011/11/17/2252916.html

Jenkins插件之trigger   :   https://www.cnblogs.com/itech/archive/2011/11/17/2252647.html

Jenkins插件之Perforce訪問    :  https://www.cnblogs.com/itech/archive/2011/11/15/2249723.html

Jenkins的受權和訪問控制   :   https://www.cnblogs.com/itech/archive/2011/11/15/2249457.html

Jenkins中執行batch和Python   :  https://www.cnblogs.com/itech/archive/2011/11/14/2248507.html

Jenkins最佳實踐  :  https://www.cnblogs.com/itech/archive/2011/11/14/2248460.html

Jenkins Master/Slave架構  :  https://www.cnblogs.com/itech/archive/2011/11/11/2245849.html

Jenkins的Linux的Slave的配置   :  https://www.cnblogs.com/itech/archive/2011/11/10/2244690.html

Jenkins的Windows Slave的配置    :   https://www.cnblogs.com/itech/archive/2011/11/09/2243025.html

Jenkins master在windows上安裝    :  https://www.cnblogs.com/itech/archive/2011/11/02/2233343.html

 

Jenkins的配置   :    https://www.cnblogs.com/itech/archive/2011/11/04/2236230.html

Jenkins 構建JavaHelloWorld          :   https://www.cnblogs.com/itech/archive/2011/11/03/2234662.html

在容器中運行 Jenkins pipeline 任務         :         https://www.jianshu.com/p/b9a421b21253

 

 

 

Jenkins :   https://www.cnblogs.com/hanmk/category/1001104.html

相關文章
相關標籤/搜索