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”
这个任务运行得很好。由于以下任务发生在詹金斯服务器中
versionIncr
正在执行并增加版本号并更新"gradle.properties"
jenkins 服务器中工作区中的文件问题:: 对“”文件所做的更改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)
我之前已经通过两种不同的方式解决了您提出的问题。首先,使用 Gradle 插件,类似于nebula-release
上面链接的插件 @sghill。
然而,该插件的工作原理是计算补丁版本的所有提交,通过 Gradle 扩展配置主要和次要以及附加元数据信息,例如分支名称以及是否脏。对于我的需求来说,这似乎过于复杂的工作流程,并且对于不使用 Gradle 的项目没有用处。然而,对于您的情况,这是一个快速现成的解决方案。
就我而言,我所需要的只是在 PR 合并到develop
或 时自动标记的唯一版本号master
,以及分支上每次提交的唯一版本号。为此,我使用了 Git 标签并为其编写了一个脚本。
版本控制的 3 种情况是:
version.json
更改,则会发生主要或次要碰撞,并且补丁版本将重置为 0。git describe
分支上的唯一版本:分支名称的输出,例如,0.1.0-x-branch-name
其中x
是默认分支之前的提交数量。至于配置 Jenkins 以对存储库进行写访问,您是否按照此处的说明进行操作?这是我在所有存储库中成功完成的操作: Git push using jenkins凭据来自声明性管道