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

Gho*_*der 6 git gradle jenkins

我的 github 公共存储库中有 spring boot 应用程序。我使用 gradle 作为这个 Spring Boot 应用程序的构建工具。我使用詹金斯作为 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())
}
Run Code Online (Sandbox Code Playgroud)

我在詹金斯中调用此任务,如下所示。

“versionIncr bootJar docker --warning-mode=all”

这个任务运行得很好。由于以下任务发生在詹金斯服务器中

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

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

有什么方法或 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())
}
Run Code Online (Sandbox Code Playgroud)

aft*_*ner 4

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

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

就我而言,我所需要的只是在 PR 合并到develop或 时自动标记的唯一版本号master,以及分支上每次提交的唯一版本号。为此,我使用了 Git 标签并为其编写了一个脚本。

版本控制的 3 种情况是:

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

你可以在这里找到它,也可以在这里找到 docker 容器。

至于配置 Jenkins 以对存储库进行写访问,您是否按照此处的说明进行操作?这是我在所有存储库中成功完成的操作: Git push using jenkins凭据来自声明性管道