bitbucket-pipelines - 如何在我的 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 只是在 Unix docker 机器上运行 bash/shell 命令。因此,您可以使用普通的 unix shell 命令,如awk或perl,从文本文件中提取文本:
利用awk
build.gradle包含一行:
version "2020.1-BETA"
awk '/^version/{gsub(/\"/,"",$2);print $2}' build.gradle
Output: 2020.1-BETA
解释:
awk
= 提取一行文本,使用默认空格字符" "
作为分隔符^
= 正则表达式仅从行首开始version
= 查找单词“version”,区分大小写{gsub(/\"/,"",$2);print $2}
= 去掉所有语音标记字符"
,并打印第 2 列- 更多信息和来源:如何使用 linux 命令提取与文本文件中特定字段匹配的文本
另一种方式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 命令
因此,您可以使用其中一个awk
或perl
在您的 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
推荐阅读
- java - 在 Canvas 中指定的 XY 位置绘制位图
- javascript - 如何使用 html 和 js 创建一个可以在 keypress 上实时运行的应用程序?
- python - 在 Python 中对多维字典进行排序
- python - 根据列表中的匹配项创建列
- php - 只触发一次的 Symfony 身份验证事件?
- javascript - 如何将获取发布请求发送到基于 API 密钥的授权端点?
- command-line-interface - 替换文本->(如何)?
- sql - 根据数量和目标维度数据将数量拆分为多行
- javascript - 使用 Pika CDN 在路径下导入?
- csv - 使用 Neo4j 加载 csv 命令的困难