This is an automated email from the ASF dual-hosted git repository.

shunping pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new 720fa2fcb5f Track ReplaceTokens values as processResources inputs 
(#40133)
720fa2fcb5f is described below

commit 720fa2fcb5f8f08b7c0385de4279b0e3f871c74e
Author: Shunping Huang <[email protected]>
AuthorDate: Wed Sep 16 09:48:50 2026 -0400

    Track ReplaceTokens values as processResources inputs (#40133)
    
    Gradle treats the `tokens:` map passed to the ReplaceTokens content
    filter as a filter argument, not a task input, so it affects neither
    the up-to-date check nor the build cache key. The filtered sources
    contain only unsubstituted placeholders and are byte identical
    regardless of what the tokens expand to, so nothing invalidates
    processResources when a token value changes.
    
    In a shared checkout where build/ survives branch switches, the task
    stays UP-TO-DATE and the previous branch's substituted resource is
    left behind. Switching master -> a former release branch left
    dataflow.properties holding master's container version, so pipelines
    ran against a wrong version of beam-master SDK harness. The same
    staleness also poisons the build cache, since both branches compute
    the same key for different correct outputs, so `clean` is not a
    reliable workaround.
    
    This can be fixed by declaring the token map as an input property.
---
 runners/google-cloud-dataflow-java/arm/build.gradle      | 5 ++++-
 runners/google-cloud-dataflow-java/build.gradle          | 5 ++++-
 sdks/java/extensions/sql/jdbc/build.gradle               | 5 ++++-
 sdks/java/maven-archetypes/examples/build.gradle         | 5 ++++-
 sdks/java/maven-archetypes/gcp-bom-examples/build.gradle | 5 ++++-
 sdks/java/maven-archetypes/starter/build.gradle          | 5 ++++-
 6 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/runners/google-cloud-dataflow-java/arm/build.gradle 
b/runners/google-cloud-dataflow-java/arm/build.gradle
index 531300bb63e..b1e1ae59e9b 100644
--- a/runners/google-cloud-dataflow-java/arm/build.gradle
+++ b/runners/google-cloud-dataflow-java/arm/build.gradle
@@ -52,11 +52,14 @@ 
evaluationDependsOn(":runners:google-cloud-dataflow-java:worker")
 evaluationDependsOn(":sdks:java:container:java11")
 
 processResources {
-  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+  // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+  def resourceTokens = [
     'dataflow.fnapi_environment_major_version' : 
project(':runners:google-cloud-dataflow-java').ext.dataflowFnapiEnvironmentMajorVersion,
     'dataflow.fnapi_container_version' : 
project(':runners:google-cloud-dataflow-java').ext.dataflowFnapiContainerVersion,
     'dataflow.container_base_repository' : 
project(':runners:google-cloud-dataflow-java').ext.dataflowContainerBaseRepository,
   ]
+  inputs.property('resourceTokens', resourceTokens)
+  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }
 
 // Exclude tests that need a runner
diff --git a/runners/google-cloud-dataflow-java/build.gradle 
b/runners/google-cloud-dataflow-java/build.gradle
index b513b1aa207..fae0ab53c70 100644
--- a/runners/google-cloud-dataflow-java/build.gradle
+++ b/runners/google-cloud-dataflow-java/build.gradle
@@ -57,13 +57,16 @@ ext.dataflowFnapiContainerVersion = 'beam-master-20260909'
 ext.dataflowContainerBaseRepository = 'gcr.io/cloud-dataflow/v1beta3'
 
 processResources {
-  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+  // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+  def resourceTokens = [
     'dataflow.legacy_environment_major_version' : 
project.ext.dataflowFnapiEnvironmentMajorVersion,
     'dataflow.fnapi_environment_major_version' : 
project.ext.dataflowFnapiEnvironmentMajorVersion,
     'dataflow.legacy_container_version' : 
project.ext.dataflowLegacyContainerVersion,
     'dataflow.fnapi_container_version' : 
project.ext.dataflowFnapiContainerVersion,
     'dataflow.container_base_repository' : 
project.ext.dataflowContainerBaseRepository,
   ]
+  inputs.property('resourceTokens', resourceTokens)
+  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }
 
 // Exclude tests that need a runner
diff --git a/sdks/java/extensions/sql/jdbc/build.gradle 
b/sdks/java/extensions/sql/jdbc/build.gradle
index 91c48b635d5..334da329308 100644
--- a/sdks/java/extensions/sql/jdbc/build.gradle
+++ b/sdks/java/extensions/sql/jdbc/build.gradle
@@ -63,9 +63,12 @@ dependencies {
 }
 
 processResources {
-  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+  // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+  def resourceTokens = [
           'beam.version': version,
   ]
+  inputs.property('resourceTokens', resourceTokens)
+  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }
 
 shadowJar {
diff --git a/sdks/java/maven-archetypes/examples/build.gradle 
b/sdks/java/maven-archetypes/examples/build.gradle
index 1edb55a10f9..c3c203410c8 100644
--- a/sdks/java/maven-archetypes/examples/build.gradle
+++ b/sdks/java/maven-archetypes/examples/build.gradle
@@ -25,7 +25,8 @@ example pipelines from the Apache Beam Java SDK."""
 
 processResources {
   dependsOn 'generateSources'
-  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+  // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+  def resourceTokens = [
     'project.version':  version,
     'bigquery.version': 
dependencies.create(project.library.java.google_api_services_bigquery).getVersion(),
     'google-api-client.version': 
dependencies.create(project.library.java.google_api_client).getVersion(),
@@ -49,6 +50,8 @@ processResources {
     'maven-surefire-plugin.version': 
dependencies.create(project.library.maven.maven_surefire_plugin).getVersion(),
     'flink.artifact.name': 
'beam-runners-flink-'.concat(project(":runners:flink:${project.ext.latestFlinkVersion}").getName()),
   ]
+  inputs.property('resourceTokens', resourceTokens)
+  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }
 
 /*
diff --git a/sdks/java/maven-archetypes/gcp-bom-examples/build.gradle 
b/sdks/java/maven-archetypes/gcp-bom-examples/build.gradle
index f9fabcfe19b..845cf5aa5c9 100644
--- a/sdks/java/maven-archetypes/gcp-bom-examples/build.gradle
+++ b/sdks/java/maven-archetypes/gcp-bom-examples/build.gradle
@@ -26,7 +26,8 @@ using the Beam Google Cloud Platform BOM"""
 
 processResources {
     dependsOn 'generateSources'
-    filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+    // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+    def resourceTokens = [
             'project.version':  version,
             'bigquery.version': 
dependencies.create(project.library.java.google_api_services_bigquery).getVersion(),
             'google-api-client.version': 
dependencies.create(project.library.java.google_api_client).getVersion(),
@@ -48,6 +49,8 @@ processResources {
             'maven-surefire-plugin.version': 
dependencies.create(project.library.maven.maven_surefire_plugin).getVersion(),
             'flink.artifact.name': 
'beam-runners-flink-'.concat(project(":runners:flink:${project.ext.latestFlinkVersion}").getName()),
     ]
+    inputs.property('resourceTokens', resourceTokens)
+    filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }
 
 /*
diff --git a/sdks/java/maven-archetypes/starter/build.gradle 
b/sdks/java/maven-archetypes/starter/build.gradle
index 7c8c02bd559..3bb4a311fca 100644
--- a/sdks/java/maven-archetypes/starter/build.gradle
+++ b/sdks/java/maven-archetypes/starter/build.gradle
@@ -24,10 +24,13 @@ ext.summary = """A Maven archetype to create a simple 
starter pipeline to
 get started using the Apache Beam Java SDK."""
 
 processResources {
-  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
+  // Filter arguments are not tracked by Gradle, so declare the tokens as an 
input property.
+  def resourceTokens = [
     'project.version': version,
     'slf4j.version': 
dependencies.create(project.library.java.slf4j_api).getVersion(),
     'maven-compiler-plugin.version': 
dependencies.create(project.library.maven.maven_compiler_plugin).getVersion(),
     'maven-exec-plugin.version': 
dependencies.create(project.library.maven.maven_exec_plugin).getVersion(),
   ]
+  inputs.property('resourceTokens', resourceTokens)
+  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: resourceTokens
 }

Reply via email to