Nexus-REST API-[artifact上传与制品库集成]

root
233
文章
0
评论
2021年10月26日21:49:31 评论 6961字阅读23分12秒

Nexus-REST API-[artifact上传与制品库集成]

以maven制品为例子

Build.groovy 

package hwf.devops


//Maven
def MavenBuild(){
    def buildTools = ["maven": "/data/apache-maven-3.8.3"]
    sh "${buildTools["maven"]}/bin/mvn clean package -DskipTests -f demo/pom.xml \
                        -s settings.xml"
}

//Gradle
def GradleBuild(){
    def buildTools = ["gradle": "/data/gradle-7.2"]
    sh "${buildTools["gradle"]}/bin/gradle clean && ${buildTools["gradle"]}/bin/gradle build -x test"
}

//Ant
def AntBuild(configPath="./build.xml"){
    sh "ant -f ${configPath}"
}

//Golang
def GoBuild(){
    def buildTools = ["go": "/data/go" ]
    sh "${buildTools["go"]}/bin/go build demo.go"
}

//Npm
def NpmBuild(){
    def buildTools = ["npm": "/data/node-v14.18.0-linux-x64" ]
    sh """
                    export PATH=\$PATH:${buildTools["npm"]}/bin
                    ${buildTools["npm"]}/bin/npm install
                    ${buildTools["npm"]}/bin/npm run build
    """
}

//Yarn
def YarnBuild(){
    sh "yarn install && yarn build "
}

//Main
def CodeBuild(type){
    switch(type){
        case "maven":
            MavenBuild()
            break;
        case "gradle":
            GradleBuild()
            break;
        case "npm":
            NpmBuild()
            break;
        case "yarn":
            YarnBuild()
            break;
        default:
            error "No such tools ... [maven/ant/gradle/npm/yarn/go]"
            break
    }
}

 

Checkout.groovy

package hwf.devops
//下载代码
 def GetCode(srcUrl, branchName){
    checkout([$class: 'GitSCM', 
            branches: [[name: branchName]], 
            extensions: [], 
            userRemoteConfigs: [[
            credentialsId: 'fe149331-7ec9-4a5b-b3bf-557beb0caa42', 
            url: srcUrl]]])
}

 

Nexuspackage.groovy

package hwf.devops

def Upload(prository,groupId,artifaceId,file,version,type,pkgName){
     withCredentials([usernamePassword(credentialsId: 'c2b82aec-d6d7-42c4-a97d-b78fc07c050b', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {
        sh """
            curl -X 'POST' \
            "http://192.168.1.110:8081/nexus/service/rest/v1/components?repository=${prository}" \
            -H 'accept: application/json' \
            -H 'Content-Type: multipart/form-data' \
            -F "maven2.groupId=${groupId}" \
            -F "maven2.artifactId=${artifaceId}" \
            -F "maven2.version=${version}" \
            -F "maven2.packaging=${type}" \
            -F "maven2.asset1=@${file}" \
            -F "maven2.asset1.extension=${pkgName}" \
            -u "${USER}":"${TOKEN}"
        """
    }
 
}

 

Sonar.groovy

package hwf.devops

def SonarRequest(apiUrl,method){
    withCredentials([string(credentialsId: "d0dd7a55-6222-40d3-87ef-f07a5ecc4086", variable: 'SONAR_TOKEN')]) {
        sonarApi = "http://192.168.1.110:9000/api"
        response = sh  returnStdout: true, 
            script: """
            curl --location \
                 --request ${method} \
                 "${sonarApi}/${apiUrl}" \
                 --header "Authorization: Basic ${SONAR_TOKEN}"
            """
        // json格式化
        try {
            response = readJSON text: """ ${response - "\n"} """
        } catch(e){
            response = readJSON text: """{"errors" : true}"""
        }
        return response
        
    }
}

//查找项目
def SearchProject(projectName){
    apiUrl = "projects/search?projects=${projectName}"
    response = SonarRequest(apiUrl,"GET")
    if (response.paging.total == 0){
        return false
    }
    return true 
}


//创建项目
def CreateProject(projectName){
    apiUrl = "projects/create?name=${projectName}&project=${projectName}"
    response = SonarRequest(apiUrl,"POST")
    try{
        if (response.project.key == projectName ) {
            println("Project Create success!...")
            return true
        }
    }catch(e){
        println(response.errors)
        return false
    }
}

// 更新质量阈
def UpdateQualityProfiles(lang, projectName, profileName){
    apiUrl = "qualityprofiles/add_project?language=${lang}&project=${projectName}&qualityProfile=${profileName}"
    response = SonarRequest(apiUrl,"POST")
    
    if (response.errors != true){
        println("ERROR: UpdateQualityProfiles ${response.errors}...")
        return false
    } else {
        println("SUCCESS: UpdateQualityProfiles ${lang} > ${projectName} > ${profileName}" )
        return true
    }
}

def SonarJava(projectName, groupName ){
    withCredentials([string(credentialsId: '3edb6a73-c10f-4d36-b6aa-c37abd4570b6', variable: 'AUTH_TOKEN')]) {
        sh """
            sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \
                -Dsonar.projectKey=${projectName} \
                -Dsonar.projectName=${projectName} \
                -Dsonar.projectVersion=${BUILD_ID} \
                -Dsonar.login=${AUTH_TOKEN} \
                -Dsonar.ws.timeout=30 \
                -Dsonar.projectDescription="my first project!" \
                -Dsonar.links.homepage=http://192.168.1.110:9080/${groupName}/${projectName} \
                -Dsonar.links.ci=http://192.168.1.110:8080/job/${groupName}/job/${projectName}/ \
                -Dsonar.sources=./demo/src \
                -Dsonar.sourceEncoding=UTF-8 \
                -Dsonar.java.binaries=./demo/target/classes \
                -Dsonar.java.test.binaries=./demo/target/test-classes 
        """
    }
}


def SonarWeb(projectName, groupName ){
    withCredentials([string(credentialsId: '3edb6a73-c10f-4d36-b6aa-c37abd4570b6', variable: 'AUTH_TOKEN')]) {
        sh """
            sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \
                -Dsonar.projectKey=${projectName} \
                -Dsonar.projectName=${projectName} \
                -Dsonar.projectVersion=${BUILD_ID} \
                -Dsonar.login=${AUTH_TOKEN} \
                -Dsonar.ws.timeout=30 \
                -Dsonar.projectDescription="my first project!" \
                -Dsonar.links.homepage=http://192.168.1.200/${groupName}/${projectName} \
                -Dsonar.links.ci=http://192.168.1.200:8080/job/${groupName}/job/${projectName}/ \
                -Dsonar.sources=src \
                -Dsonar.sourceEncoding=UTF-8 
        """
    }
}

//Main
def CodeSonar(type, projectName, groupName){
    if (SearchProject(projectName)){
        println("${projectName} exists....")
    } else {
        // 项目不存在
        println("${projectName} not found....")

        //创建项目
        CreateProject(projectName)
    }
    //质量配置
    profileMap = ["maven": "java", "npm": "js"]
    UpdateQualityProfiles(profileMap[type], projectName, groupName)

    switch(type){
        case "maven":
            
            SonarJava(projectName, groupName)
            break;
        case "gradle":
            SonarJava(projectName, groupName)
            break;
        case "npm":
            SonarWeb(projectName, groupName)
            break;
        default:
            println("No such tools ... [maven/ant/gradle/npm/yarn/go]")
            break
    }
}

 

UnitTest.groovy 

package hwf.devops

//Maven
def MavenTest(){
    def buildTools = ["maven": "/data/apache-maven-3.8.3"]
    sh """
    ${buildTools["maven"]}/bin/mvn test -f demo/pom.xml -s settings.xml

    """
}

//Gradle
def GradleTest(){
    def buildTools = ["gradle": "/data/gradle-7.2"]
    sh """
        ${buildTools["gradle"]}/bin/gradle test
      junit 'build/test-results/test/*.xml'
    """
}

//Ant
//def AntBuild(configPath="./build.xml"){
//    sh "ant -f ${configPath}"
//}

//Golang
//def GoTest(){
    //sh " go test"
//}

//Npm
def NpmTest(){
    def buildTools = ["npm": "/data/node-v14.18.0-linux-x64" ]
    sh """
            export PATH=\$PATH:${buildTools["npm"]}/bin
            ${buildTools["npm"]}/bin/npm test"
    """
}

//Yarn
//def YarnTest(){
//    sh "yarn test "
//}

//Main
def CodeTest(type){
    switch(type){
        case "maven":
            MavenTest()
            break;
        case "gradle":
            GradleTest()
            break;
        default:
            println("No such tools ... [maven/ant/gradle/npm/yarn/go]")
            break
    }
}

 

jenkinsfile

@Library("hwf@master") _    

import hwf.devops.*           // 导入库

def checkout = new Checkout()
def build = new Build()
def unittest = new UnitTest()
def sonar = new Sonar()
def nexuspackage =  new Nexuspackage()

pipeline {
    agent { label "build" }

    stages{
        stage("Checkout"){
            steps{
                script {
                    println("GetCode")
                    checkout.GetCode("${env.srcUrl}", "${env.branchName}")
                    sh "ls -l"
                }
            }
        }

        stage("Build"){
            steps{
                script{
                    println("Build")
                    build.CodeBuild("${env.buildTool}")
                    sh "ls -l demo/target/"
                }
            }
        }

        stage("UnitTest"){
            steps{
                script{
                    println("test")
                    unittest.CodeTest("${env.buildTool}")
                }
            }
        }

        stage("SonarScan"){
            steps {
                script{
                    println("sonarqube")
                    groupName = "${JOB_NAME}".split("/")[0]
                    projectName = "${JOB_NAME}".split("/")[-1] //devops03/devops03-maven-service
                    sonar.CodeSonar("${env.buildTool}", projectName, groupName)
                }
            }
        }

        
        stage("PullArtifact"){
            steps{
                script{
                    println("upload nexus")
                    sh "ls -l demo/target/"
                    env.artifaceId='app-test'
                    env.file='demo/target/demo-0.0.1-SNAPSHOT.jar'
                    env.pkgName='demo-0.0.1-SNAPSHOT.jar'
                    env.groupId='hwf.app'
                    env.prository='hwf-maven'
                    env.version='1.12'
                    nexuspackage.Upload("${env.prository}",
                                        "${env.groupId}",
                                        "${env.artifaceId}",
                                        "${env.file}",
                                        "${env.version}",
                                        "${env.type}",
                                        "${env.pkgName}")
                }
            }
        }
    }
}

 

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年10月26日21:49:31
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Nexus-[功能简介|容器方式安装|使用方法] Nexus

Nexus-[功能简介|容器方式安装|使用方法]

Nexus- 工作流定义: 集成流水线: 提交代码,构建,单测,代码扫描,上传制品【生成制品】 制品晋级流水线:输入版本,选择晋级策略。(将制品复制到对应环境的仓库) 发布流水线: 输入版本号, 输入...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: