zoukankan      html  css  js  c++  java
  • Jfrog Artifactory jenkins 流水线使用docker的方式培训[暂未成功]

    1. 创建jenkins的流水线 

    2. 创建artifactory的镜像仓库

    3. 创建generic的仓库上传需要的 war包还有tar包.

    4. 修改pipeline的 脚本

    主要修改的地方. 修改war包的原始路径, 将路径修改为步骤3中定义的路径.

    修改后未成形的脚本

    #!/usr/bin/env groovy
    
    node ('master') {
        //Clone example project from GitHub repository
        git url: 'https://github.com/jinanxiaolaohu/swampup.git', branch: 'master'
        def rtServer = Artifactory.server SERVER_ID
        def buildInfo = Artifactory.newBuildInfo()
        def tagName
        buildInfo.env.capture = true
        //Fetch all depensencies from Artifactory
        stage('Dependencies') {
            dir('automation/docker-framework') {
                try {
                    println "Gather Java and Tomcat"
    
                    def downloadSpec = """{
                             "files": [
                              {
                               "pattern": "zhaobsh_generic/jdk-8-linux-x64.tar.gz",
                               "target": "jdk/jdk-8-linux-x64.tar.gz",
                               "flat":"true"
                              },
                              {
                               "pattern": "zhaobsh_generic/apache-tomcat-8.tar.gz",
                               "target": "tomcat/apache-tomcat-8.tar.gz",
                               "flat":"true"
                              }
                              ]
                            }"""
    
                    rtServer.download (downloadSpec, buildInfo)
                    if (fileExists('jdk/jdk-8-linux-x64.tar.gz') && fileExists('tomcat/apache-tomcat-8.tar.gz')) {
                        println "Downloaded dependencies"
                    } else {
                        println "Missing Dependencies either jdk or tomcat - see listing below:"
                        sh 'ls -d */*'
                        throw new FileNotFoundException("Missing Dependencies")
                    }
                } catch (Exception e) {
                    println "Caught exception during resolution.  Message ${e.message}"
                    throw e
                }
            }
        }
        //Build docker image named "docker-framework" with Java 8 and Tomcat  
        stage('Build') {
            dir ('automation/docker-framework') {
                withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                        def rtDocker = Artifactory.docker server: rtServer
                        tagName = "${ARTDOCKER_REGISTRY}/docker-framework:${env.BUILD_NUMBER}"
                        docker.build(tagName)
                        echo tagName
                        sleep 6
                        rtDocker.push(tagName,REPO, buildInfo)
                        sleep 2
                        rtServer.publishBuildInfo buildInfo
                }
            }
        }
        //Test docker image
        stage('Test') {
            dir('automation/docker-framework/framework-test') {
            
                def gradleLatestPath = getLatestGradleWar().trim()
                def gradleWarDownload = """{
                "files": [
                    {
                      "pattern": "zhaobsh_generic/webservice-1.1.2.war",
                      "target": "war/webservice.war",
                      "flat": "true"
                    }
                  ]
                }"""
                echo "Test"
                sh 'rm -f war/*'
                sh "mkdir -p war"
                rtServer.download(gradleWarDownload)
                updateDockerFile()
                def tagDockerFramework = "${ARTDOCKER_REGISTRY}/docker-framework-test:${env.BUILD_NUMBER}"
                docker.build(tagDockerFramework)
                if (testFramework(tagDockerFramework)) {
                    println "Setting property and promotion"
                    updateProperty ("functional-test=pass")
                    sh "docker rmi ${tagName}"
                } else {
                    updateProperty ("functional-test=fail; failed-test=page-not-loaded")
                    currentBuild.result = 'UNSTABLE'
                    sh "docker rmi ${tagName}"
                    return
                }
            }
        }
        //Scan build's Artifacts in Xray
        stage('Xray Scan') {
            if (XRAY_SCAN == "YES") {
                def xrayConfig = [
                    'buildName'     : env.JOB_NAME,
                    'buildNumber'   : env.BUILD_NUMBER,
                    'failBuild'     : false
                ]
                def xrayResults = rtServer.xrayScan xrayConfig
                echo xrayResults as String
            } else {
                println "No Xray scan performed. To enable set XRAY_SCAN = YES"
            }
            sleep 60
        }
        
        //Promote image from local staging repositoy to production repository 
        stage ('Promote') {
            dir ('automation/docker-framework') {
                def promotionConfig = [
                  'buildName'          : env.JOB_NAME,
                  'buildNumber'        : env.BUILD_NUMBER,
                  'targetRepo'         : PROMOTE_REPO,
                  'comment'            : 'Framework test with latest version of application',
                  'sourceRepo'         : SOURCE_REPO,
                  'status'             : 'Released',
                  'includeDependencies': false,
                  'copy'               : true
                ]
                rtServer.promote promotionConfig
                reTagLatest (SOURCE_REPO)
                reTagLatest (PROMOTE_REPO)
             }
        }
    }
    
    def getLatestGradleWar () {
        def response = ''
        def gradleLatestWarSrc = """items.find(
        {
            "repo":{"$eq":"zhaobsh_generic"}, "name":{"$match":"webservice-*.war"}
        }
    ).sort({"$desc" : ["created"]}).limit(1)"""
        withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
            def curlString = "curl -s -u " + env.USERNAME + ":" + env.PASSWORD + " " + SERVER_URL
            def gradleLatestStr = curlString +  "/api/search/aql -X POST -H 'Content-Type: text/plain' -d '" + gradleLatestWarSrc + "' | python -c 'import sys, json; print json.load(sys.stdin)["results"][0]["path"]'"
            println "Curl String is " + gradleLatestStr
            response = sh (script: gradleLatestStr, returnStdout: true)
        }
        println "Curl response: " + response
        return response
    }
    
    def updateDockerFile () {
        def BUILD_NUMBER = env.BUILD_NUMBER
        sh 'sed -i "s/docker-framework:latest/docker-framework:$BUILD_NUMBER/" Dockerfile'
    }
    
    def reTagLatest (targetRepo) {
         def BUILD_NUMBER = env.BUILD_NUMBER
         sh 'sed -E "s/@/$BUILD_NUMBER/" retag.json > retag_out.json'
         switch (targetRepo) {
              case PROMOTE_REPO :
                  sh 'sed -E "s/TARGETREPO/${PROMOTE_REPO}/" retag_out.json > retaga_out.json'
                  break
              case SOURCE_REPO :
                   sh 'sed -E "s/TARGETREPO/${SOURCE_REPO}/" retag_out.json > retaga_out.json'
                   break
          }
          sh 'cat retaga_out.json'
          withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
              def curlString = "curl -u " + env.USERNAME + ":" + env.PASSWORD + " " + SERVER_URL
              def regTagStr = curlString +  "/api/docker/$targetRepo/v2/promote -X POST -H 'Content-Type: application/json' -T retaga_out.json"
              println "Curl String is " + regTagStr
              sh regTagStr
          }
    }
    //test docker image by runnning container
    def testFramework (tag) {
        def result = true
        docker.image(tag).withRun('-p 8181:8181') {c ->
            sleep 10
            def stdout = sh(script: 'curl "http://localhost:8181/swampup/"', returnStdout: true)
            if (stdout.contains("Welcome Docker Lifecycle Training")) {
                println "*** Passed Test: " + stdout
            } else {
                println "*** Failed Test: " + stdout
                result = false
            }
        }
        sh "docker rmi ${tag}"
        return result
    }
    
    def updateProperty (property) {
        withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: CREDENTIALS, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                def curlString = "curl -u " + env.USERNAME + ":" + env.PASSWORD + " " + "-X PUT " + SERVER_URL
                def updatePropStr = curlString +  "/api/storage/${SOURCE_REPO}/docker-framework/${env.BUILD_NUMBER}?properties=${property}"
                println "Curl String is " + updatePropStr
                sh updatePropStr
         }
    }

    5. 修改参数. 增加相关的 流水线中的参数.

     6. 修改docker daemon.json的内容 修改json的文件形式

    {
    "registry-mirrors": ["http://a7d80d83.m.daocloud.io"],
    "insecure-registries":["127.0.0.1:8081","10.24.101.99:8081","CentOS75:8081"]
    }

    7. fork 例子中的github地址,并且进行修改

    https://github.com/jinriyang/swampup
    fock 到自己的
    修改dockerfile的内容
    https://github.com/jinanxiaolaohu/swampup/blob/master/automation/docker-framework/Dockerfile
    
    修改后的内容
    FROM ubuntu:latest
    
    MAINTAINER zhaobsh
    
    RUN /bin/bash -c cd ~; cd /home ; mkdir -p exec
    ADD jdk/jdk-8-linux-x64.tar.gz /home/exec
    RUN /bin/bash -c cd /home/exec; mv /home/exec/jdk* /home/exec/jdk8
    ENV JAVA_HOME=/home/exec/jdk8
    RUN sed "/securerandom.source=/{s/file:/dev/random/file:/dev/urandom/}" /home/exec/jdk8/jre/lib/security/java.security -i
    
    ADD tomcat/apache-tomcat-8.tar.gz /home/exec
    RUN /bin/bash -c cd /home/exec; mv /home/exec/apache-tomcat-8.* /home/exec/tomcat
    ADD tomcat/server.xml /home/exec/tomcat/conf
    ENV CATALINA_HOME=/home/exec/tomcat
    ENV TEST_ENV=2
    
    CMD /bin/bash -c cd /home/exec; /home/exec/tomcat/bin/catalina.sh run

     8. 进行build with parameters 进行处理.

    根据错误信息 进行修改 修改过的主要地方有:

    1. 镜像仓库要准确. 

    2. github中的代码需要修改 commit

    3. 修改groovy中的脚本代码分支.  一般使用master即可.

    4. stage 是 Test 时 可以将 下载 testpass的参数去掉 因为没有进行 单元测试.

    5. /etc/docker/daemon.json 一定要配置对, 写镜像的名称的时候 不能加http 不加上如果也没有修改 增加insecure-registries 的话 就会出现http和https的错乱了.

    6. 但是发现test的部分 总是出问题. 提示错误如图示  暂时未解决.

     这个是个bug jenkins 暂未解决..暂时不搞了

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/9204739.html
Copyright © 2011-2022 走看看