gpt4 book ai didi

git - 如何在我的代码仓库中包含 Gradle 自动递增的版本号?

转载 作者:行者123 更新时间:2023-12-03 03:41:10 26 4
gpt4 key购买 nike

我的 github 公共(public)存储库中有 spring boot 应用程序。我已经使用 gradle 作为这个 spring boot 应用程序的构建工具。我正在使用 jenkins 作为 CI/CD。

我的 build.gradle 文件中有以下任务,用于自动递增内部版本号,以便我生成的可执行 jar 在生成的 jar 文件中具有唯一的版本名称。

task versionIncr {
Properties props = new Properties()
File propsFile = new File('gradle.properties')
props.load(propsFile.newDataInputStream())
Integer nextbuildnum = ( ((props.getProperty('artifactBuildNumber')) as BigDecimal) + 1 )
props.setProperty('artifactBuildNumber', nextbuildnum.toString())
props.store(propsFile.newWriter(), null)
props.load(propsFile.newDataInputStream())
}

我在 jenkins 中调用这个任务如下。

"versionIncr bootJar docker --warning-mode=all"

此任务运行良好。由于以下任务发生在 jenkins 服务器中

  1. jenkins 将 git $branch pull 入 jenkins 服务器工作区
  2. task =>versionIncr 正在执行并递增版本号并更新 jenkins 服务器工作区中的 "gradle.properties" 文件
  3. 生成可执行jar文件
  4. 使用新生成的可执行 jar 文件创建 docker 镜像

问题::对“gradle.properties”文件所做的更改保留在 jenkins 服务器工作区中,更新后的版本号不会反射(reflect)在 git hub 分支中。由于 jenkins 在本地进行了更改,因此当我将任何更改推送到 github 并运行 jenkins 作业时,"gradle.properties" 文件中的版本号仍将保持不变。我不想每次推送提交时都手动更新版本号。我希望 jenkins 为我处理版本更改。

有什么方法或 gradle 插件或 jenkins 插件可以用来将修改后的 "gradle.properties" 文件从 jenkins 工作区推送回 "github" 存储库。另外,如果可能的话,我想知道使用 github username/password 或使用 SSH 实现的方法。

如果我需要在这里发布更多信息,请告诉我。

更新:发布我的 build.gradle 文件,以防有人对我的工作方式感兴趣。构建.gradle

buildscript {
repositories {
jcenter()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE")
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4+"
}
}

plugins {
id 'org.springframework.boot' version '2.2.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'maven-publish'
id 'com.palantir.docker' version '0.25.0'
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
//apply plugin: 'io.spring.gradle.dependencymanagement.DependencyManagementPlugin'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
//apply plugin: 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'

group 'com.javasree'
version project.properties.containsKey("releaseVersion") ? "${artifactMajorVersion}" : "${artifactMajorVersion}-${artifactBuildNumber}"
sourceCompatibility = 1.8

ext {
springCloudVersion ='Greenwich.RELEASE'
artifactName ='<artifact>'
artifactory = 'http://localhost:8081/artifactory/'
artifactoryRepo = 'gradle-lib-release'
artifactorySnapShotRepo = 'gradle-lib-snashot'
artifactoryRepo3pp = 'pub-gradle-remote'
artifactoryUser = System.getProperty("user", "")
artifactoryPassword = System.getProperty("password", "")
}

repositories {
mavenCentral()
maven {
url "${artifactory}${artifactoryRepo3pp}"
allowInsecureProtocol = true
credentials { // Optional resolver credentials (leave out to use anonymous resolution)
username = "admin" // Artifactory user name
password = "password" // Password or API Key
}
}
}

publishing.publications {
maven(MavenPublication) {
artifact bootJar
// groupId 'gatewayengine'
// artifactId artifactName
// version '1.0-SNAPSHOT'
from components.java
}
}

publishing.repositories {
maven {
allowInsecureProtocol = true
credentials {
username = "admin" // Artifactory user name
password = "password" // Password or API Key
}
if(project.version.endsWith('-SNAPSHOT')) {
url "${artifactory}${artifactorySnapShotRepo}"
} else {
url "${artifactory}${artifactoryRepo}"
}
}
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
//mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
}
}

docker {
name "localhost:5000/${project.name}:${project.version}"
files tasks.bootJar.outputs
//tag 'localhost:5000/${project.name}:${project.version}'
dockerfile file('Dockerfile')
//buildArgs([HOST_APP_JAR_LOC: 'version'])
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web',
'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:2.2.2.RELEASE',
'org.springframework.cloud:spring-cloud-starter-netflix-zuul:2.2.2.RELEASE'
}




task versionIncr {
Properties props = new Properties()
File propsFile = new File('gradle.properties')
props.load(propsFile.newDataInputStream())
Integer nextbuildnum = ( ((props.getProperty('artifactBuildNumber')) as BigDecimal) + 1 )
props.setProperty('artifactBuildNumber', nextbuildnum.toString())
props.store(propsFile.newWriter(), null)
props.load(propsFile.newDataInputStream())
}

最佳答案

我之前以两种不同的方式解决了您提出的问题。首先,通过使用 Gradle 插件,类似于上面链接的 nebula-release 插件@sghill。

但是,该插件通过计算补丁版本的所有提交来工作,通过 Gradle 扩展配置主要和次要版本并附加元数据信息,例如分支名称以及它是否脏。对于我的需求来说,这似乎过于复杂的工作流程,并且对于不使用 Gradle 的项目没有用处。但是,对于您的情况,这是一个快速现成的解决方案。

就我而言,我所需要的只是在 PR 被 merge 到 developmaster 时自动标记的唯一版本号,以及分支上每个提交的唯一版本号.为此,我确实使用了 Git 标签并为它编写了一个脚本。

版本控制的 3 种情况是:

  • 一个新的、未初始化的 repo => 生成一个带有默认分支的新 version.json 文件(master,但可以根据 repo 更改,主要和次要版本来配置这些凹凸)
  • 任何 merge 到默认分支的提交都会生成一个新版本并对其进行标记。如果 version.json 中的主要或次要版本已更改,则会发生主要或次要颠簸并将补丁版本重置为 0。
  • 分支上的唯一版本:git describe 的输出和分支名称,例如0.1.0-x-branch-name 其中 x 是默认分支之前的提交次数。

你可以找到它here和 docker 容器 here

至于将 Jenkins 配置为对 repo 具有写入权限,您是否按照此处的说明进行操作?这就是我在所有 repo 中成功做的事情: Git push using jenkins credentials from declarative pipeline

关于git - 如何在我的代码仓库中包含 Gradle 自动递增的版本号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61734609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com