Jenkins声明性管道-如何获取正在使用的Jenkinsfile的路径?

时间:2018-07-16 22:41:41

标签: jenkins groovy jenkins-pipeline jenkins-groovy

我们有一系列相同的Jenkinsfile脚本,除了每个脚本都配置一个环境项以指向保存Jenkinsfile的SCM检出目录中的目录。这用于引用同一目录中的文件。 SCM存储库在不同目录中具有所有这些Jenkinsfile脚本。如果只能检索包含Jenkinsfile的目录的路径,则可以看到一个容易的开口,以使管道脚本在每种情况下都相同。

我尝试了几种不同的操作,例如包含步骤

protected void ButtonAtt_Click(object sender, EventArgs e)
{
    if (FileUploadAtt.HasFile)
    {
        //append id to filename
        string sFilename = DDFindEmp.SelectedValue.ToString() + "-" + FileUploadAtt.FileName;
        string sPath = Server.MapPath("/Training");
        // upload file into filestore directory 
        try
        {
            FileUploadAtt.SaveAs(sPath + sFilename);
        }
        catch (Exception ex)
        {
            LabelAtt.Text = "Error uploading file: " + ex.Message.ToString();
        } 
    }
    else
    {
        LabelAtt.Text = "Please select a file for upload.";
    }
}

script {
    println __FILE__
}

两者均未运行(在script { scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent println scriptDir } 情况下给出了不存在的变量,在第二种情况下给出了权限违反)。我尝试了__FILE__和其他变体。

我需要在steps-sh块中使用该目录,因此我认为它必须位于环境项中。

现在,Jenkins作业配置提供了Jenkins文件的路径,但是我不想重复此操作以在该级别创建另一个环境变量。

已咨询:

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

如果您确实需要此功能,则可以获取"${JOB_URL}config.xml"并解析scriptPath

但这显然不是一个干净的解决方案。

答案 1 :(得分:0)

another thread找到

def currentScriptPath = new File(currentBuild.rawBuild.parent.definition.scriptPath).parent

但这需要批准很多方法。

答案 2 :(得分:-1)

最简单的方法是将Jenkins文件放在存储库的根目录中,并获取Jenkins设置的WORKSPACE环境变量的值。

鉴于Groovy基本上只是Java,您可以这样获得绝对路径:

install prerequisites