【问题标题】:Get gradle variables in jenkins pipeline script在 jenkins 管道脚本中获取 gradle 变量
【发布时间】:2016-08-25 08:52:44
【问题描述】:

我正在尝试使用 groovy 构建脚本将我的构建管道迁移到“管道插件”。

我的管道通常是:

  1. 测试(gradle)
  2. IntegrationTest (gradle)
  3. 构建(gradle)
  4. 发布(人工)

我想在我的 jenkins 构建脚本中使用版本/组等 gradle 变量来发布到 artifactory 中的正确文件夹。过去,人工插件会为我处理一些事情。如何实现?

对于单个 gradle 项目,我使用如下内容:

node('master')
{
    def version = 1.0
    def gitUrl = 'some.git'
    def projectRoot = ""
    def group = "dashboard/frontend/"
    def artifactName = "dashboard_ui"
    def artifactRepo = "ext-release-local"

    stage "git"

    git branch: 'develop', poll: true, url: "${gitUrl}"

    dir(projectRoot)
    {

        sh 'chmod +x gradlew'
        stage "test"
        sh './gradlew clean test'

        stage "build"
        sh './gradlew build createPom'

        stage "artifact"
        def server = Artifactory.server('artifactory_dev01')
        def uploadSpec = """{
          "files": [
            {
              "pattern": "build/**.jar",
              "target": "${artifactRepo}/$group/${artifactName}/${version}/${artifactName}-${version}.jar"
            },
            {
              "pattern": "pom.xml",
              "target": "${artifactRepo}/$group/${artifactName}/${version}/${artifactName}.pom"
            }
         ]
        }"""
        def buildInfo1 = server.upload spec: uploadSpec
        server.publishBuildInfo buildInfo1
    }
}

【问题讨论】:

  • 你好,你可以做一个shell脚本来获取gradle版本./gradlew -version,你需要解析响应字符串来得到你需要的版本。

标签: jenkins gradle groovy jenkins-pipeline


【解决方案1】:

这里有一个更现代的声明性管道示例供将来参考:

pipeline {
    agent any
    stages {
        stage('somestage') {
            steps {
                script {
                    def version = sh (
                        script: "./gradlew properties -q | grep \"version:\" | awk '{print \$2}'",
                        returnStdout: true
                    ).trim()
                    sh "echo Building project in version: $version"

                }
            }
        }
    }
}

另见:

【讨论】:

  • 是否需要致电trim(),或者只是最佳实践/建议?
  • 优秀的答案!为了使其完美,我建议使用\"^version:\" 而不是\"version:\"。有时,如果您有另一个 Gradle 属性,如我所观察到的 some_dubious_library_version: 1.2.3,它可能会干扰。
【解决方案2】:

我认为您实际上有两种不同的方法来解决这个问题:

1。从 sh 脚本获取版本/组

找到一种从 gradle 构建工具(例如gradle getVersion(),但我对 Gradle 不熟悉)获取 Gradle 版本的方法,然后使用 shell 脚本获取此版本。如果获取版本的 Gradle 命令是gradle getVersion(),您可以在管道中执行:

def projectVersion = sh script: "gradle getVersion()", returnStdout: true
def projectGroup= sh script: "gradle getGroup()", returnStdout: true

然后在您当前的管道中注入您的 $projectVersion$projectGroup 变量。

2。配置 Gradle 构建脚本以发布到 Artifactory

​​>

这是我个人更喜欢的相反方法:与其将所有 Gradle 项目信息都提供给 Artifactory,不如将你的 Artifactory 设置提供给 Gradle,并使用 Gradle 目标轻松发布到 Artifactory。

JFrog 在其Working with Gradle 部分中对此解决方案提供了很好的文档。基本上,您将遵循以下步骤:

  1. 使用 Gradle Build Script Generator 从 Artifactory 生成兼容的 Gradle 构建脚本,并将其包含到您的项目构建脚本中
  2. 使用 Gradle 目标 gradle artifactoryPublish 将您当前的工件简单地发布到 Artifactory

【讨论】:

  • 如果不写任务 getVersion 和 getGroup,第一种方法是行不通的。更多的 gradle 输出很难解析。第二种方法很好,但我不想将工件存储库凭据存储在 gradle 文件中。我将凭证/令牌/证书存储在 CI(詹金斯凭证)服务器中,我需要一种方法将其传递给发布任务。
【解决方案3】:

对于其他使用 Google 搜索的人,如果您有 Pipeline Utility Steps plugin 并将您需要的内容存储在您的 gradle.properties 文件中,您可以在环境块中执行类似的操作:

MY_PROPS = readProperties file:"${WORKSPACE}/gradle.properties"
MY_VERSION = MY_PROPS['version']

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2018-02-06
    • 2021-12-14
    • 2019-01-04
    • 2019-09-24
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多