From ea89f0cf9462c075bd311d8dee1259631cfb3d66 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 25 Jul 2025 07:42:30 -0400 Subject: [PATCH 1/7] nightly metadata updater github action --- .github/workflows/metadata-update.yml | 78 ++++++++++++++++++ instrumentation-docs/ci-collect.sh | 22 +++++ instrumentation-docs/collect.sh | 95 +-------------------- instrumentation-docs/instrumentations.sh | 100 +++++++++++++++++++++++ 4 files changed, 202 insertions(+), 93 deletions(-) create mode 100644 .github/workflows/metadata-update.yml create mode 100755 instrumentation-docs/ci-collect.sh create mode 100644 instrumentation-docs/instrumentations.sh diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml new file mode 100644 index 000000000000..18c8b3550f45 --- /dev/null +++ b/.github/workflows/metadata-update.yml @@ -0,0 +1,78 @@ +name: Metadata Update + +on: + workflow_dispatch: # allow this to be manually triggered + schedule: + - cron: "00 1 * * *" # daily at 1:00 UTC + +permissions: + contents: read + +jobs: + update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Free disk space + run: .github/scripts/gha-free-disk-space.sh + + - name: Set up JDK for running Gradle + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + distribution: temurin + java-version-file: .java-version + + - name: Set up gradle + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + with: + cache-read-only: true + + - name: Check out main branch + run: git fetch origin main && git checkout main && git pull origin main + + - name: Collect telemetry + run: ./instrumentation-docs/ci-collect.sh + + - name: Run documentation analyzer + run: ./gradlew :instrumentation-docs:runAnalysis + + - name: Check for diff + id: diffcheck + run: | + git add docs/instrumentation-list.yaml + if ! git diff --cached --quiet; then + echo "::set-output name=has_diff::true" + else + echo "::set-output name=has_diff::false" + fi + + - name: Use CLA approved github bot + if: steps.diffcheck.outputs.has_diff == 'true' + # IMPORTANT do not call the .github/scripts/use-cla-approved-bot.sh + # since that script could have been compromised in the PR branch + run: | + git config user.name otelbot + git config user.email 197425009+otelbot@users.noreply.github.com + + - name: Create PR if changes detected + if: steps.diffcheck.outputs.has_diff == 'true' + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="metadata-update-automation-$(date +%s)-$RANDOM" + git checkout -b "$BRANCH_NAME" + git add docs/instrumentation-list.yaml + git commit -m "chore: update instrumentation list [automated]" + git push origin "$BRANCH_NAME" + gh pr create \ + --title "chore: update metadata files [automated]" \ + --body "This PR was created automatically by the metadata update workflow." \ + --head "$BRANCH_NAME" \ + --base main \ + --assignee jaydeluca \ + --label "automation" || echo "PR already exists or failed to create." diff --git a/instrumentation-docs/ci-collect.sh b/instrumentation-docs/ci-collect.sh new file mode 100755 index 000000000000..d8cc130b8d99 --- /dev/null +++ b/instrumentation-docs/ci-collect.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# Runs selected Gradle test tasks to regenerate *.telemetry output for +# individual OpenTelemetry Java agent instrumentations. + +set -euo pipefail + +source "$(dirname "$0")/instrumentations.sh" + +ALL_TASKS=() +for task in "${INSTRUMENTATIONS[@]}"; do + ALL_TASKS+=(":instrumentation:${task}") +done +for task in "${COLIMA_INSTRUMENTATIONS[@]}"; do + ALL_TASKS+=(":instrumentation:${task}") +done + +echo "Processing instrumentations..." +./gradlew "${ALL_TASKS[@]}" \ + -PcollectMetadata=true \ + --rerun-tasks --continue +echo "Telemetry file regeneration complete." diff --git a/instrumentation-docs/collect.sh b/instrumentation-docs/collect.sh index ad614060ddb2..e13da3732201 100755 --- a/instrumentation-docs/collect.sh +++ b/instrumentation-docs/collect.sh @@ -2,102 +2,11 @@ # Runs selected Gradle test tasks to regenerate *.telemetry output for # individual OpenTelemetry Java agent instrumentations. Some instrumentation test suites don't run -# on Apple Silicon, so we use colima to run them in an x86_64 container. +# on ARM, so we use colima to run them in an x86_64 container. set -euo pipefail -readonly INSTRUMENTATIONS=( - # : : [ gradle-task-suffix ] - "activej-http-6.0:javaagent:test" - "akka:akka-http-10.0:javaagent:test" - "armeria:armeria-grpc-1.14:javaagent:test" - "apache-httpasyncclient-4.1:javaagent:test" - "alibaba-druid-1.0:javaagent:test" - "alibaba-druid-1.0:javaagent:testStableSemconv" - "apache-dbcp-2.0:javaagent:test" - "apache-dbcp-2.0:javaagent:testStableSemconv" - "apache-httpclient:apache-httpclient-2.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.3:library:test" - "apache-httpclient:apache-httpclient-5.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "c3p0-0.9:javaagent:test" - "c3p0-0.9:javaagent:testStableSemconv" - "clickhouse-client-0.5:javaagent:test" - "clickhouse-client-0.5:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:test" - "google-http-client-1.19:javaagent:test" - "http-url-connection:javaagent:test" - "java-http-client:javaagent:test" - "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" - "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" - "jodd-http-4.2:javaagent:test" - "netty:netty-3.8:javaagent:test" - "netty:netty-4.0:javaagent:test" - "netty:netty-4.1:javaagent:test" - "okhttp:okhttp-2.2:javaagent:test" - "okhttp:okhttp-3.0:javaagent:test" - "pekko:pekko-http-1.0:javaagent:test" - "play:play-ws:play-ws-1.0:javaagent:test" - "play:play-ws:play-ws-2.0:javaagent:test" - "play:play-ws:play-ws-2.1:javaagent:test" - "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" - "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:test" - "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" - "hikaricp-3.0:javaagent:test" - "hikaricp-3.0:javaagent:testStableSemconv" - "tomcat:tomcat-jdbc:javaagent:test" - "tomcat:tomcat-jdbc:javaagent:testStableSemconv" - "oshi:javaagent:test" - "oshi:javaagent:testExperimental" - "vibur-dbcp-11.0:javaagent:test" - "vibur-dbcp-11.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-rest-7.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-5.3:javaagent:test" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" - "apache-httpclient:apache-httpclient-5.2:library:test" - "armeria:armeria-1.3:javaagent:test" - "async-http-client:async-http-client-1.9:javaagent:test" - "async-http-client:async-http-client-2.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "finagle-http-23.11:javaagent:test" - "finatra-2.9:javaagent:test" -) - -readonly COLIMA_INSTRUMENTATIONS=( - "elasticsearch:elasticsearch-rest-6.4:javaagent:test" - "elasticsearch:elasticsearch-rest-5.0:javaagent:test" - "oracle-ucp-11.2:javaagent:test" - "oracle-ucp-11.2:javaagent:testStableSemconv" -) +source "$(dirname "$0")/instrumentations.sh" readonly TELEMETRY_DIR_NAME=".telemetry" diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh new file mode 100644 index 000000000000..e9b4efed597f --- /dev/null +++ b/instrumentation-docs/instrumentations.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This file is sourced by collect.sh and ci-collect.sh + +readonly INSTRUMENTATIONS=( + # : : [ gradle-task-suffix ] + "activej-http-6.0:javaagent:test" + "akka:akka-http-10.0:javaagent:test" + "armeria:armeria-grpc-1.14:javaagent:test" + "apache-httpasyncclient-4.1:javaagent:test" + "alibaba-druid-1.0:javaagent:test" + "alibaba-druid-1.0:javaagent:testStableSemconv" + "apache-dbcp-2.0:javaagent:test" + "apache-dbcp-2.0:javaagent:testStableSemconv" + "apache-httpclient:apache-httpclient-2.0:javaagent:test" + "apache-httpclient:apache-httpclient-4.0:javaagent:test" + "apache-httpclient:apache-httpclient-4.3:library:test" + "apache-httpclient:apache-httpclient-5.0:javaagent:test" + "apache-dubbo-2.7:javaagent:testDubbo" + "c3p0-0.9:javaagent:test" + "c3p0-0.9:javaagent:testStableSemconv" + "clickhouse-client-0.5:javaagent:test" + "clickhouse-client-0.5:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-1.11:javaagent:test" + "google-http-client-1.19:javaagent:test" + "http-url-connection:javaagent:test" + "java-http-client:javaagent:test" + "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" + "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" + "jodd-http-4.2:javaagent:test" + "netty:netty-3.8:javaagent:test" + "netty:netty-4.0:javaagent:test" + "netty:netty-4.1:javaagent:test" + "okhttp:okhttp-2.2:javaagent:test" + "okhttp:okhttp-3.0:javaagent:test" + "pekko:pekko-http-1.0:javaagent:test" + "play:play-ws:play-ws-1.0:javaagent:test" + "play:play-ws:play-ws-2.0:javaagent:test" + "play:play-ws:play-ws-2.1:javaagent:test" + "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" + "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" + "spring:spring-webflux:spring-webflux-5.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" + "vertx:vertx-redis-client-4.0:javaagent:test" + "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" + "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" + "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" + "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" + "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-2.2:javaagent:test" + "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" + "hikaricp-3.0:javaagent:test" + "hikaricp-3.0:javaagent:testStableSemconv" + "tomcat:tomcat-jdbc:javaagent:test" + "tomcat:tomcat-jdbc:javaagent:testStableSemconv" + "oshi:javaagent:test" + "oshi:javaagent:testExperimental" + "vibur-dbcp-11.0:javaagent:test" + "vibur-dbcp-11.0:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" + "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-rest-7.0:javaagent:test" + "elasticsearch:elasticsearch-transport-5.0:javaagent:test" + "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" + "elasticsearch:elasticsearch-transport-5.3:javaagent:test" + "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" + "apache-httpclient:apache-httpclient-5.2:library:test" + "armeria:armeria-1.3:javaagent:test" + "async-http-client:async-http-client-1.9:javaagent:test" + "async-http-client:async-http-client-2.0:javaagent:test" + "apache-dubbo-2.7:javaagent:testDubbo" + "finagle-http-23.11:javaagent:test" + "finatra-2.9:javaagent:test" +) + +# Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64 +# container. +readonly COLIMA_INSTRUMENTATIONS=( + "elasticsearch:elasticsearch-rest-6.4:javaagent:test" + "elasticsearch:elasticsearch-rest-5.0:javaagent:test" + "oracle-ucp-11.2:javaagent:test" + "oracle-ucp-11.2:javaagent:testStableSemconv" +) From 632e48fd5bd4ba62fee532497c1e7640ce39322f Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 25 Jul 2025 08:15:04 -0400 Subject: [PATCH 2/7] shell check --- instrumentation-docs/ci-collect.sh | 1 + instrumentation-docs/collect.sh | 1 + instrumentation-docs/instrumentations.sh | 2 ++ 3 files changed, 4 insertions(+) mode change 100644 => 100755 instrumentation-docs/instrumentations.sh diff --git a/instrumentation-docs/ci-collect.sh b/instrumentation-docs/ci-collect.sh index d8cc130b8d99..dec93c26ea62 100755 --- a/instrumentation-docs/ci-collect.sh +++ b/instrumentation-docs/ci-collect.sh @@ -5,6 +5,7 @@ set -euo pipefail +# shellcheck source=instrumentation-docs/instrumentations.sh source "$(dirname "$0")/instrumentations.sh" ALL_TASKS=() diff --git a/instrumentation-docs/collect.sh b/instrumentation-docs/collect.sh index e13da3732201..f707b5f1207a 100755 --- a/instrumentation-docs/collect.sh +++ b/instrumentation-docs/collect.sh @@ -6,6 +6,7 @@ set -euo pipefail +# shellcheck source=instrumentation-docs/instrumentations.sh source "$(dirname "$0")/instrumentations.sh" readonly TELEMETRY_DIR_NAME=".telemetry" diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh old mode 100644 new mode 100755 index e9b4efed597f..2e676d441392 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -4,6 +4,7 @@ set -euo pipefail # This file is sourced by collect.sh and ci-collect.sh +# shellcheck disable=SC2034 readonly INSTRUMENTATIONS=( # : : [ gradle-task-suffix ] "activej-http-6.0:javaagent:test" @@ -92,6 +93,7 @@ readonly INSTRUMENTATIONS=( # Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64 # container. +# shellcheck disable=SC2034 readonly COLIMA_INSTRUMENTATIONS=( "elasticsearch:elasticsearch-rest-6.4:javaagent:test" "elasticsearch:elasticsearch-rest-5.0:javaagent:test" From cfa825fc751161a370d5f4e4fafa0bbe6b77ba90 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 25 Jul 2025 08:20:19 -0400 Subject: [PATCH 3/7] token --- .github/workflows/metadata-update.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml index 18c8b3550f45..1a85b4ba57c7 100644 --- a/.github/workflows/metadata-update.yml +++ b/.github/workflows/metadata-update.yml @@ -51,6 +51,13 @@ jobs: echo "::set-output name=has_diff::false" fi + - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + if: steps.diffcheck.outputs.has_diff == 'true' + id: otelbot-token + with: + app-id: 1295839 + private-key: ${{ secrets.OTELBOT_JAVA_INSTRUMENTATION_PRIVATE_KEY }} + - name: Use CLA approved github bot if: steps.diffcheck.outputs.has_diff == 'true' # IMPORTANT do not call the .github/scripts/use-cla-approved-bot.sh From d992c155c0eba6da58038f4f48184863ff86dce0 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 31 Jul 2025 08:14:37 -0400 Subject: [PATCH 4/7] review updates --- .github/workflows/metadata-update.yml | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml index 1a85b4ba57c7..94a3a467b8b4 100644 --- a/.github/workflows/metadata-update.yml +++ b/.github/workflows/metadata-update.yml @@ -12,8 +12,8 @@ jobs: update: runs-on: ubuntu-latest permissions: - contents: write - pull-requests: write + contents: write # for git push to PR branch + pull-requests: write # for creating PRs steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -29,11 +29,6 @@ jobs: - name: Set up gradle uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - with: - cache-read-only: true - - - name: Check out main branch - run: git fetch origin main && git checkout main && git pull origin main - name: Collect telemetry run: ./instrumentation-docs/ci-collect.sh @@ -51,20 +46,15 @@ jobs: echo "::set-output name=has_diff::false" fi - - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + - name: Use CLA approved github bot if: steps.diffcheck.outputs.has_diff == 'true' + run: .github/scripts/use-cla-approved-bot.sh + + - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 id: otelbot-token with: - app-id: 1295839 - private-key: ${{ secrets.OTELBOT_JAVA_INSTRUMENTATION_PRIVATE_KEY }} - - - name: Use CLA approved github bot - if: steps.diffcheck.outputs.has_diff == 'true' - # IMPORTANT do not call the .github/scripts/use-cla-approved-bot.sh - # since that script could have been compromised in the PR branch - run: | - git config user.name otelbot - git config user.email 197425009+otelbot@users.noreply.github.com + app-id: ${{ vars.OTELBOT_APP_ID }} + private-key: ${{ secrets.OTELBOT_PRIVATE_KEY }} - name: Create PR if changes detected if: steps.diffcheck.outputs.has_diff == 'true' @@ -80,6 +70,16 @@ jobs: --title "chore: update metadata files [automated]" \ --body "This PR was created automatically by the metadata update workflow." \ --head "$BRANCH_NAME" \ - --base main \ - --assignee jaydeluca \ - --label "automation" || echo "PR already exists or failed to create." + --base main + + - name: Add label to PR + if: steps.diffcheck.outputs.has_diff == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_URL=$(gh pr list --state open --head "$BRANCH_NAME" --json url -q '.[0].url') + if [ -n "$PR_URL" ]; then + gh pr edit "$PR_URL" --add-label "automation" --add-assignee jaydeluca + else + echo "No open PR found for branch $BRANCH_NAME." + fi From 703856dfb22c3bc54f63dd840378dc76620342ff Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 31 Jul 2025 11:19:03 -0400 Subject: [PATCH 5/7] code review updates --- .github/workflows/metadata-update.yml | 65 ++++++++++++++++++++------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml index a7cc34dc4377..97a356253b7b 100644 --- a/.github/workflows/metadata-update.yml +++ b/.github/workflows/metadata-update.yml @@ -8,12 +8,17 @@ on: permissions: contents: read +# Should only be one job running at a time to avoid conflicts with the metadata update branch +concurrency: + group: metadata-update + cancel-in-progress: true + jobs: update: runs-on: ubuntu-latest permissions: contents: write # for git push to PR branch - pull-requests: write # for creating PRs + pull-requests: write # for adding label and assignee to PR steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -41,9 +46,9 @@ jobs: run: | git add docs/instrumentation-list.yaml if ! git diff --cached --quiet; then - echo "::set-output name=has_diff::true" + echo "has_diff=true" >> $GITHUB_OUTPUT else - echo "::set-output name=has_diff::false" + echo "has_diff=false" >> $GITHUB_OUTPUT fi - name: Use CLA approved github bot @@ -51,32 +56,62 @@ jobs: run: .github/scripts/use-cla-approved-bot.sh - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + if: steps.diffcheck.outputs.has_diff == 'true' id: otelbot-token with: app-id: ${{ vars.OTELBOT_APP_ID }} private-key: ${{ secrets.OTELBOT_PRIVATE_KEY }} - - name: Create PR if changes detected + - name: Find or create metadata update branch if: steps.diffcheck.outputs.has_diff == 'true' + id: findbranch env: GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} run: | - BRANCH_NAME="metadata-update-automation-$(date +%s)-$RANDOM" - git checkout -b "$BRANCH_NAME" - git add docs/instrumentation-list.yaml - git commit -m "chore: update instrumentation list [automated]" - git push origin "$BRANCH_NAME" - gh pr create \ - --title "chore: update instrumentation list [automated]" \ - --body "This PR was created automatically by the metadata update workflow." \ - --head "$BRANCH_NAME" \ - --base main + BRANCH_NAME="metadata-update-main" + echo "branch=$BRANCH_NAME" >> $GITHUB_OUTPUT + if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then + git fetch origin "$BRANCH_NAME" + git checkout "$BRANCH_NAME" + else + git checkout -b "$BRANCH_NAME" + fi - - name: Add label to PR + - name: Commit and push changes + if: steps.diffcheck.outputs.has_diff == 'true' + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" + git commit -m "chore: update instrumentation list [automated]" || echo "No changes to commit." + git push origin "$BRANCH_NAME" --force-with-lease + + - name: Create PR if needed if: steps.diffcheck.outputs.has_diff == 'true' + id: createpr + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" + PR_EXISTS=$(gh pr list --state open --head "$BRANCH_NAME" --label automation --json url -q '.[0].url') + if [ -z "$PR_EXISTS" ]; then + gh pr create \ + --title "chore: update instrumentation list [automated]" \ + --body "This PR was created automatically by the metadata update workflow." \ + --head "$BRANCH_NAME" \ + --base main + echo "new_pr=true" >> $GITHUB_OUTPUT + else + echo "PR already exists: $PR_EXISTS" + echo "new_pr=false" >> $GITHUB_OUTPUT + fi + + - name: Add label to PR + if: steps.createpr.outputs.new_pr == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" PR_URL=$(gh pr list --state open --head "$BRANCH_NAME" --json url -q '.[0].url') if [ -n "$PR_URL" ]; then gh pr edit "$PR_URL" --add-label "automation" --add-assignee jaydeluca From 5d35f4d182beff3565dab911d84e1017e85c9eb7 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 31 Jul 2025 12:25:41 -0400 Subject: [PATCH 6/7] always merge main on the branches --- .github/workflows/metadata-update.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml index 97a356253b7b..55a3d19ebd60 100644 --- a/.github/workflows/metadata-update.yml +++ b/.github/workflows/metadata-update.yml @@ -73,8 +73,9 @@ jobs: if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then git fetch origin "$BRANCH_NAME" git checkout "$BRANCH_NAME" + git merge origin/main --no-edit else - git checkout -b "$BRANCH_NAME" + git checkout -b "$BRANCH_NAME" origin/main fi - name: Commit and push changes From 61cf5ad85c5602548406cc388bba63f292a64373 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 31 Jul 2025 12:44:17 -0400 Subject: [PATCH 7/7] always merge main on the branches --- .github/workflows/metadata-update.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml index 55a3d19ebd60..572141d9fb2a 100644 --- a/.github/workflows/metadata-update.yml +++ b/.github/workflows/metadata-update.yml @@ -85,7 +85,7 @@ jobs: run: | BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" git commit -m "chore: update instrumentation list [automated]" || echo "No changes to commit." - git push origin "$BRANCH_NAME" --force-with-lease + git push origin "$BRANCH_NAME" - name: Create PR if needed if: steps.diffcheck.outputs.has_diff == 'true'