首页 > 解决方案 > 如何强制 Jenkins 共享库在同一主机上运行?

问题描述

我有詹金斯管道,并且有多个用管道语法编写的阶段。其中一个阶段是拉动 git repo 的结帐阶段,接下来是运行共享库的构建阶段。但似乎共享库有时在不同的节点上运行,与执行 git checkout 的节点相比,因为在共享库中运行 groovy 脚本的构建阶段没有找到执行某些操作所需的 git 文件。我该如何解决这个问题?以下是我的管道:

@Library("my-shared-library2-temp") _
pipeline {
  agent any

  environment {
    SVC_ACCNT = credentials('abc')

  }

  stages {

    stage('Git') {
      steps {

        withCredentials([file(credentialsId: 'abc.json', variable: 'metadata')]) {

          script {

            sh 'cat $metadata > outFile'
            def metadataJson = readFile 'outFile'

            def res = tgsJsonParser("${REPOSITORY}", metadataJson)

            env.gitURL = res;
          }

        }
      }
    }
    stage('Checkout') {
      steps {
        script {

          sh "echo $env.gitURL"

          def url = "abc.com"
          sh "git clone --single-branch --branch test $url"

        }

      }

    }

    stage('Build') {
      steps {
        script {
          fxn('Prod')
        }
      }
    }
  }

}

Checkout 和 Build 似乎在不同的节点上运行,这就是为什么 build 中的 fxn 无法通过 Checkout 阶段访问 repo checkout。如何解决这个问题?共享库中的 Groovy 脚本需要读取 git 文件的所有名称并执行一些操作。

当共享库中的 groovy 脚本尝试访问应签出路径中的文件时,出现以下错误:

java.io.FileNotFoundException: /usr/mware/.jenkins/workspace/Deployment/test@2/abc
    at org.codehaus.groovy.runtime.ResourceGroovyMethods.checkDir(ResourceGroovyMethods.java:1043)
    at org.codehaus.groovy.runtime.ResourceGroovyMethods.eachFile(ResourceGroovyMethods.java:1062)
    at org.codehaus.groovy.runtime.dgm$937.doMethodInvoke(Unknown Source)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:47)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:19)
    at tgsDeploy.deployProd(/opt/nfs/.jenkins-HOST/jobs/Deployment/jobs/test/builds/222/libs/my-shared-temp/vars/mygroovy.groovy:85)
    at tgsDeploy.call(/opt/nfs/.jenkins-HOST/jobs/Deployment/jobs/test/builds/222/libs/my-shared-library2-temp/vars/mygroovy.groovy:61)

最后一个语句中使用的 HOST 是 master,但作业在 slave 上运行。即使我在获取奴隶后加载库,仍然存在相同的错误

标签: jenkinsjenkins-groovygroovy-console

解决方案


推荐阅读