• 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 暂未解决..暂时不搞了

  • 相关阅读:
    js 黑科技操作
    js判断是否是苹果浏览器
    rem750.js
    写过的bug
    mongdb学习
    [刘阳Java]_第一个Java程序_第7讲
    [刘阳Java]_步步窥探JS变量作用域
    [刘阳Java]_Web前端笔试题总结
    [刘阳Java]_酷炫视频播放器制作_JS篇
    [刘阳Java]_酷炫视频播放器制作_界面篇
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/9204739.html
Copyright © 2020-2023  润新知