首页 > 解决方案 > 如何在我的 bitbucket-pipelines.yml 文件中使用 build.gradle 文件中的版本

问题描述

目前,当我在我的项目中更改版本号时,我必须在我的 build.gradle 文件和我的 bitbucket-pipelines.yml 中的几个地方定义它。这是因为我有脚本可以将文件上传到我的项目的下载文件夹。有没有办法从 build.gradle 文件中获取版本?当我增加版本时,我只想更新一个文件。

构建.gradle

plugins {
    id 'java'
}

def buildNumber = project.properties['buildNumber'] ?:'0'
group 'edu.csusb.iset'
version "2020.1-BETA"

jar {
    manifest {
        attributes('Main-Class': 'edu.csusb.iset.projectname.Main',
            'Implementation-Title': 'ProjectName',
            'Implementation-Version': "$version, build $buildNumber")
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it)         }
    }
}

task packSrc(type: Tar) {
    archiveAppendix.set("src")
    archiveVersion.set("$project.version")
    archiveExtension.set("tar.gz")
    destinationDirectory = file("$buildDir/dist")
    compression = Compression.GZIP

    from 'build.gradle'
    from 'settings.gradle'
    from('src') {
        include '**/*'
        into "src"
    }
}

repositories {
    mavenCentral()
}

dependencies {
    ...
}

bitbucket-pipelines.yml

image: openjdk:11
pipelines:
  default:
    - step:
        name: Gradle build
        caches:
          - gradle
        script:
          - bash ./gradlew build
    - step:
        name: Deploy downloads
        trigger: manual
        caches:
          - gradle
        script:
          - bash ./gradlew build
          - pipe: atlassian/bitbucket-upload-file:0.1.6
            variables:
              BITBUCKET_USERNAME: $BITBUCKET_USERNAME
              BITBUCKET_APP_PASSWORD: $BITBUCKET_APP_PASSWORD
              FILENAME: build/libs/ProjectName-2020.1-BETA.jar
          - bash ./gradlew packSrc
          - pipe: atlassian/bitbucket-upload-file:0.1.6
            variables:
              BITBUCKET_USERNAME: $BITBUCKET_USERNAME
              BITBUCKET_APP_PASSWORD: $BITBUCKET_APP_PASSWORD
              FILENAME: build/dist/ProjectName-src-2020.1-BETA.tar.gz

标签: bitbucket-pipelines

解决方案


Bitbucket Pipelines 只是在 Unix docker 机器上运行 bash/shell 命令。因此,您可以使用普通的 unix shell 命令,如,从文本文件中提取文本:

利用awk

build.gradle包含一行:

version "2020.1-BETA"
awk '/^version/{gsub(/\"/,"",$2);print $2}' build.gradle
Output: 2020.1-BETA

解释:

另一种方式perl

build.gradle包含一行:

version "2020.1-BETA"
perl -nle 'print $& while m{(?<=version ").*?(?=")}g' build.gradle
Output: 2020.1-BETA

解释:

  • 提取两个单词之间的文本:version "",使用正则表达式
  • perl -nle= 使用正则表达式从文件中的一行中提取文本
  • (?<=version ")= 查找 的开始标签version ",使用负前瞻?<=使捕获从标签的末尾开始
  • .*?= 在第一个标签之后捕获任何字符串
  • (?=")= 查找语音标记的结束标记",使用正向前瞻?=使捕获在标记之前停止
  • g= 在多行文件的所有行上进行全局搜索
  • 更多信息和来源:grep -P 不再有效。如何重写我的搜索? 以及 如何使用 sed/grep 提取两个单词之间的文本?

在 yml 脚本中使用 shell 命令

因此,您可以使用其中一个awkperl在您的 yml 脚本中使用。将输出捕获为名为 的环境变量$APP_VERSION,并重用此环境变量:

script:
  - bash ./gradlew build
  # Extract the version string from build.gradle into an environment variable
  - export APP_VERSION=$(awk '/^version/{gsub(/\"/,"",$2);print $2}' build.gradle)
  - echo $APP_VERSION # debug to print the extracted text of "2020.1-BETA"
  - pipe: atlassian/bitbucket-upload-file:0.1.6
    variables:
      BITBUCKET_USERNAME: $BITBUCKET_USERNAME
      BITBUCKET_APP_PASSWORD: $BITBUCKET_APP_PASSWORD
      FILENAME: "build/libs/ProjectName-$APP_VERSION.jar" # Use the extracted text here

替代方式:

script:
  - bash ./gradlew build
  # Extract the version string from build.gradle into an environment variable
  - export APP_VERSION=$( perl -nle 'print $& while m{(?<=version ").*?(?=")}g' build.gradle )
  - echo $APP_VERSION # debug to print the extracted text of "2020.1-BETA"
  - pipe: atlassian/bitbucket-upload-file:0.1.6
    variables:
      BITBUCKET_USERNAME: $BITBUCKET_USERNAME
      BITBUCKET_APP_PASSWORD: $BITBUCKET_APP_PASSWORD
      FILENAME: "build/libs/ProjectName-${APP_VERSION}.jar" # Use the extracted text here

推荐阅读