From deeddd325029696b0145a48629c29a5506810ebb Mon Sep 17 00:00:00 2001 From: Julien Carsique Date: Mon, 16 Mar 2026 10:00:33 +0100 Subject: [PATCH 1/4] BUILD-10591 Leverage JFrog CLI summary in build-npm, build-yarn, build-poetry and promote Generate the JFrog CLI job summary explicitly rather than relying on the setup-jfrog-cli post-step, which fails and conflicts with the CLI. build-npm, build-yarn, build-poetry (action.yml): - Set JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR in the build step env so that JFrog CLI writes command summary data during execution - Add explicit 'Generate JFrog CLI summary' step (if: always()) that calls 'jf generate-summary-markdown' with JF_URL set, and appends the resulting markdown to GITHUB_STEP_SUMMARY build-npm/build.sh, build-yarn/build.sh, build-poetry/build.sh: - Add 'jf config use repox' after 'jf config add' to explicitly activate the server configuration in case of other existing configurations promote/action.yml: - Add repox-url and repox-artifactory-url inputs (forwarded from callers) - Add ARTIFACTORY_URL env var to the Promote artifacts step - Add JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR in the Promote artifacts step env - Add explicit 'Generate JFrog CLI summary' step promote/promote.sh: - Make ARTIFACTORY_URL a required variable (was optional with default URL) - Add 'jf config use repox' to explicitly activate the server configuration Other: - Upgrade renovatebot/pre-commit-hooks to 43.76.3 in .pre-commit-config.yaml (support the managerFilePatterns field...) - Fix trailing spaces in deprecation warning messages (cache/action.yml, config-npm/action.yml, build-npm/action.yml, build-yarn/action.yml) - Minor doc fix in build-maven/build.sh and promote/promote.sh Co-Authored-By: Claude Sonnet 4.6 --- .pre-commit-config.yaml | 2 +- build-gradle/action.yml | 1 + build-maven/build.sh | 2 +- build-npm/action.yml | 18 +++++++++++++++++- build-npm/build.sh | 1 + build-poetry/action.yml | 16 ++++++++++++++++ build-poetry/build.sh | 2 ++ build-yarn/action.yml | 17 ++++++++++++++++- build-yarn/build.sh | 1 + cache/action.yml | 2 +- config-npm/action.yml | 2 +- promote/action.yml | 24 ++++++++++++++++++++++++ promote/promote.sh | 5 +++-- 13 files changed, 85 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a885a572..def65c16 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,7 +30,7 @@ repos: hooks: - id: markdownlint - repo: https://github.com/renovatebot/pre-commit-hooks - rev: 731b86757c909f5eb4753ce1e743c64bd18f5ea8 # 37.418.1 + rev: 99eaa5b893df4f917fe21b5705cc42f28cb3d842 # 43.76.3 hooks: - id: renovate-config-validator - repo: https://github.com/rhysd/actionlint diff --git a/build-gradle/action.yml b/build-gradle/action.yml index b1ea809a..9c8e2fec 100644 --- a/build-gradle/action.yml +++ b/build-gradle/action.yml @@ -121,6 +121,7 @@ runs: (github.event.repository.visibility == 'public' && 'public-deployer' || 'qa-deployer') }} run: | echo "ARTIFACTORY_DEPLOYER_ROLE=${ARTIFACTORY_DEPLOYER_ROLE}" >> "$GITHUB_ENV" + - uses: SonarSource/vault-action-wrapper@3d5c87cb535e4a2c7a09adcbcfdefa751854dee3 # 3.3.0 id: secrets with: diff --git a/build-maven/build.sh b/build-maven/build.sh index 614bb89b..0f2f70a7 100755 --- a/build-maven/build.sh +++ b/build-maven/build.sh @@ -12,7 +12,7 @@ # - SQC_EU_URL: URL of SonarQube server for sqc-eu platform # - SQC_EU_TOKEN: Access token to send analysis reports to SonarQube for sqc-eu platform # - RUN_SHADOW_SCANS: If true, run sonar scanner on all 3 platforms. If false, run on the platform provided by SONAR_PLATFORM. -# - ARTIFACTORY_URL: Artifactory repository URL +# - ARTIFACTORY_URL: URL to Artifactory repository # - ARTIFACTORY_ACCESS_TOKEN: Access token to read Repox repositories # - ARTIFACTORY_DEPLOY_REPO: Deployment repository name. Required by maven-enforcer-plugin in SonarSource parent POM. # - ARTIFACTORY_DEPLOY_USERNAME: Username used by artifactory-maven-plugin diff --git a/build-npm/action.yml b/build-npm/action.yml index 9ba4fd41..89235885 100644 --- a/build-npm/action.yml +++ b/build-npm/action.yml @@ -110,7 +110,7 @@ runs: echo "ARTIFACTORY_DEPLOYER_ROLE=${ARTIFACTORY_DEPLOYER_ROLE}" >> "$GITHUB_ENV" cp "$ACTION_PATH_BUILD_NPM/mise.local.toml" mise.local.toml if [[ "$CACHE_NPM" != "true" ]]; then - echo "::warning::The \`cache-npm\` input is deprecated and will be removed in future releases. " \ + echo "::warning::The \`cache-npm\` input is deprecated and will be removed in future releases." \ "Use \`disable-caching\` instead." >&2 fi @@ -168,9 +168,25 @@ runs: SQC_EU_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).SQC_EU_TOKEN }} SQC_US_URL: ${{ fromJSON(steps.secrets.outputs.vault).SQC_US_URL }} SQC_US_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).SQC_US_TOKEN }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary + # JFROG_CLI_GITHUB_TOKEN: working-directory: ${{ inputs.working-directory }} run: $ACTION_PATH_BUILD_NPM/build.sh + - name: Generate JFrog CLI summary + if: always() + shell: bash + env: + JF_URL: ${{ inputs.repox-url }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary + run: | + jf generate-summary-markdown || true + summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" + if [[ -f "$summary" ]]; then + cat "$summary" >> "$GITHUB_STEP_SUMMARY" + fi + find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" + - name: Archive logs if: failure() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 diff --git a/build-npm/build.sh b/build-npm/build.sh index a8e1d091..5ba5c1f3 100755 --- a/build-npm/build.sh +++ b/build-npm/build.sh @@ -101,6 +101,7 @@ jfrog_npm_publish() { echo "Configuring JFrog and NPM repositories..." jf config remove repox > /dev/null 2>&1 || true # Ignore inexistent configuration jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config use repox jf npm-config --repo-resolve "npm" --repo-deploy "$ARTIFACTORY_DEPLOY_REPO" export PROJECT="${GITHUB_REPOSITORY#*/}" diff --git a/build-poetry/action.yml b/build-poetry/action.yml index 8ebc7f8b..8ff8d315 100644 --- a/build-poetry/action.yml +++ b/build-poetry/action.yml @@ -105,6 +105,7 @@ runs: echo "ARTIFACTORY_READER_ROLE=${ARTIFACTORY_READER_ROLE}" >> "$GITHUB_ENV" echo "ARTIFACTORY_DEPLOYER_ROLE=${ARTIFACTORY_DEPLOYER_ROLE}" >> "$GITHUB_ENV" cp "$ACTION_PATH_BUILD_POETRY/mise.local.toml" mise.local.toml + - uses: ./.actions/get-build-number id: get_build_number with: @@ -164,10 +165,25 @@ runs: SQC_US_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).SQC_US_TOKEN }} SONAR_PLATFORM: ${{ inputs.sonar-platform }} RUN_SHADOW_SCANS: ${{ inputs.run-shadow-scans }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | cd "${{ inputs.working-directory }}" "$ACTION_PATH_BUILD_POETRY/build.sh" + - name: Generate JFrog CLI summary + if: always() + shell: bash + env: + JF_URL: ${{ inputs.repox-url }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary + run: | + jf generate-summary-markdown || true + summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" + if [[ -f "$summary" ]]; then + cat "$summary" >> "$GITHUB_STEP_SUMMARY" + fi + find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" + - name: Generate provenance attestation if: >- ${{ inputs.provenance == 'true' && diff --git a/build-poetry/build.sh b/build-poetry/build.sh index a922d618..84e63e93 100755 --- a/build-poetry/build.sh +++ b/build-poetry/build.sh @@ -264,6 +264,7 @@ get_build_config() { jfrog_poetry_install() { jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" + jf config use repox jf poetry-config --server-id-resolve repox --repo-resolve "$ARTIFACTORY_PYPI_REPO" jf poetry install --build-name="$PROJECT" --build-number="$BUILD_NUMBER" } @@ -271,6 +272,7 @@ jfrog_poetry_install() { jfrog_poetry_publish() { jf config remove repox jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config use repox project_name=$(poetry version | awk '{print $1}') pushd dist jf rt upload ./ "$ARTIFACTORY_DEPLOY_REPO/$project_name/$PROJECT_VERSION/" --module="$project_name:$PROJECT_VERSION" \ diff --git a/build-yarn/action.yml b/build-yarn/action.yml index 5367b14b..68ef7829 100644 --- a/build-yarn/action.yml +++ b/build-yarn/action.yml @@ -112,7 +112,7 @@ runs: echo "ARTIFACTORY_DEPLOYER_ROLE=${ARTIFACTORY_DEPLOYER_ROLE}" >> "$GITHUB_ENV" cp "$ACTION_PATH_BUILD_YARN/mise.local.toml" mise.local.toml if [[ "$CACHE_YARN" != "true" ]]; then - echo "::warning::The \`cache-yarn\` input is deprecated and will be removed in future releases. " \ + echo "::warning::The \`cache-yarn\` input is deprecated and will be removed in future releases." \ "Use \`disable-caching\` instead." >&2 fi @@ -175,9 +175,24 @@ runs: SQC_US_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).SQC_US_TOKEN }} SONAR_PLATFORM: ${{ inputs.sonar-platform }} RUN_SHADOW_SCANS: ${{ inputs.run-shadow-scans }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary working-directory: ${{ inputs.working-directory }} run: $ACTION_PATH_BUILD_YARN/build.sh + - name: Generate JFrog CLI summary + if: always() + shell: bash + env: + JF_URL: ${{ inputs.repox-url }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary + run: | + jf generate-summary-markdown || true + summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" + if [[ -f "$summary" ]]; then + cat "$summary" >> "$GITHUB_STEP_SUMMARY" + fi + find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" + - name: Generate provenance attestation if: >- ${{ inputs.provenance == 'true' && diff --git a/build-yarn/build.sh b/build-yarn/build.sh index 9ae46bcf..4028e06d 100755 --- a/build-yarn/build.sh +++ b/build-yarn/build.sh @@ -174,6 +174,7 @@ jfrog_yarn_publish() { echo "::debug::Configuring JFrog and NPM repositories..." jf config remove repox > /dev/null 2>&1 || true # Do not log if the repox config were not present jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config use repox jf npm-config --repo-resolve "npm" --repo-deploy "$ARTIFACTORY_DEPLOY_REPO" # Create a local tarball and preserve it for attestation diff --git a/cache/action.yml b/cache/action.yml index d9ebc028..8685c992 100644 --- a/cache/action.yml +++ b/cache/action.yml @@ -33,7 +33,7 @@ runs: - id: warning shell: bash run: | - echo "::warning:: This action is deprecated and will be removed in future releases. " \ + echo "::warning:: This action is deprecated and will be removed in future releases." \ "Please migrate to using the SonarSource/gh-action_cache action directly." >&2 - uses: SonarSource/gh-action_cache@957cb1f6f70956976b834546bf09839080b5bb00 # v1.2.3 diff --git a/config-npm/action.yml b/config-npm/action.yml index f6307c7d..06336838 100644 --- a/config-npm/action.yml +++ b/config-npm/action.yml @@ -83,7 +83,7 @@ runs: echo "ARTIFACTORY_READER_ROLE=${ARTIFACTORY_READER_ROLE}" >> "$GITHUB_ENV" if [[ "$CACHE_NPM" != "true" ]]; then - echo "::warning::The \`cache-npm\` input is deprecated and will be removed in future releases. " \ + echo "::warning::The \`cache-npm\` input is deprecated and will be removed in future releases." \ "Use \`disable-caching\` instead." >&2 fi diff --git a/promote/action.yml b/promote/action.yml index 72659e19..09058d4d 100644 --- a/promote/action.yml +++ b/promote/action.yml @@ -2,6 +2,12 @@ name: Promote description: GitHub Action to promote a project inputs: + repox-url: + description: URL for Repox + default: https://repox.jfrog.io + repox-artifactory-url: + description: URL for Repox Artifactory API (overrides repox-url/artifactory if provided) + default: '' promote-pull-request: description: Whether to promote pull request artifacts. Requires `deploy-pull-request` input to be set to `true` in the build action. default: 'false' @@ -41,6 +47,7 @@ runs: shell: bash run: | cp "$ACTION_PATH_PROMOTE/mise.local.toml" mise.local.toml + - uses: ./.actions/get-build-number with: host-actions-root: ${{ steps.set-path.outputs.host_actions_root }} @@ -56,6 +63,8 @@ runs: - name: Promote artifacts shell: bash env: + ARTIFACTORY_URL: ${{ inputs.repox-artifactory-url != '' && inputs.repox-artifactory-url || + format('{0}/artifactory', inputs.repox-url) }} ARTIFACTORY_PROMOTE_ACCESS_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).ARTIFACTORY_PROMOTE_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ fromJSON(steps.secrets.outputs.vault).GITHUB_TOKEN }} DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} @@ -64,5 +73,20 @@ runs: ARTIFACTORY_TARGET_REPO: ${{ inputs.artifactory-target-repo }} PROMOTE_PULL_REQUEST: ${{ inputs.promote-pull-request }} BUILD_NAME: ${{ inputs.build-name || github.event.repository.name }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | "$ACTION_PATH_PROMOTE/promote.sh" + + - name: Generate JFrog CLI summary + if: always() + shell: bash + env: + JF_URL: ${{ inputs.repox-url }} + JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary + run: | + jf generate-summary-markdown || true + summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" + if [[ -f "$summary" ]]; then + cat "$summary" >> "$GITHUB_STEP_SUMMARY" + fi + find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" diff --git a/promote/promote.sh b/promote/promote.sh index d54fa093..93a77fbe 100755 --- a/promote/promote.sh +++ b/promote/promote.sh @@ -2,6 +2,7 @@ # Regular way to promote a project build: JFrog Artifactory build promotion, and GitHub status check update # # Required environment variables (must be explicitly provided): +# - ARTIFACTORY_URL: URL to Artifactory repository # - ARTIFACTORY_PROMOTE_ACCESS_TOKEN: Access token to promote builds # - BUILD_NUMBER: Build number (e.g. 42) # - BUILD_NAME: Name of the JFrog Artifactory build (e.g. sonar-dummy) @@ -16,7 +17,6 @@ # - GITHUB_JOB: The job_id of the current job, used for generating workflow summary # # Optional user customization: -# - ARTIFACTORY_URL: Repox URL. # - DEFAULT_BRANCH: Default branch (e.g. main), defaults to the repository configuration # - MULTI_REPO_PROMOTE: If true, promotes to multiple repositories (default: false) # - ARTIFACTORY_DEPLOY_REPO: Repository to deploy to. If not set, it will be retrieved from the build info. @@ -34,7 +34,7 @@ set -euo pipefail # shellcheck source=../shared/common-functions.sh source "$(dirname "${BASH_SOURCE[0]}")/../shared/common-functions.sh" -: "${ARTIFACTORY_URL:="https://repox.jfrog.io/artifactory"}" "${ARTIFACTORY_PROMOTE_ACCESS_TOKEN:?}" "${BUILD_NAME:?}" +: "${ARTIFACTORY_URL:?}" "${ARTIFACTORY_PROMOTE_ACCESS_TOKEN:?}" "${BUILD_NAME:?}" : "${GITHUB_REF_NAME:?}" "${BUILD_NUMBER:?}" "${GITHUB_REPOSITORY:?}" "${GITHUB_EVENT_NAME:?}" "${GITHUB_EVENT_PATH:?}" "${GITHUB_TOKEN:?}" : "${GITHUB_SHA:?}" "${GITHUB_JOB:?}" : "${MULTI_REPO_PROMOTE:=false}" "${ARTIFACTORY_DEPLOY_REPO:=}" "${ARTIFACTORY_TARGET_REPO:=}" "${PROMOTE_PULL_REQUEST:=false}" @@ -70,6 +70,7 @@ check_branch() { jfrog_config_repox() { jf config remove repox jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_PROMOTE_ACCESS_TOKEN" + jf config use repox } get_target_repos() { From 74665a465a589aa1f7e394b0df0ef8dbf6d610c0 Mon Sep 17 00:00:00 2001 From: Julien Carsique Date: Tue, 17 Mar 2026 12:21:03 +0100 Subject: [PATCH 2/4] BUILD-10591 Skip JFrog summary generation when no command data was collected Guard 'jf generate-summary-markdown' and 'find' on the existence of the command summary directory: when no jfrog commands that produce summary data ran (e.g. PR build without deploy), the directory is never created and both commands would otherwise fail. Co-Authored-By: Claude Sonnet 4.6 --- build-npm/action.yml | 12 +++++++----- build-poetry/action.yml | 12 +++++++----- build-yarn/action.yml | 12 +++++++----- promote/action.yml | 12 +++++++----- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/build-npm/action.yml b/build-npm/action.yml index 89235885..fdd2f13b 100644 --- a/build-npm/action.yml +++ b/build-npm/action.yml @@ -180,12 +180,14 @@ runs: JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | - jf generate-summary-markdown || true - summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" - if [[ -f "$summary" ]]; then - cat "$summary" >> "$GITHUB_STEP_SUMMARY" + jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" + if [[ -d "$jf_summary_dir" ]]; then + find "$jf_summary_dir" -type f + jf generate-summary-markdown || true + if [[ -f "${jf_summary_dir}/markdown.md" ]]; then + cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" + fi fi - find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" - name: Archive logs if: failure() diff --git a/build-poetry/action.yml b/build-poetry/action.yml index 8ff8d315..4f6f7b4a 100644 --- a/build-poetry/action.yml +++ b/build-poetry/action.yml @@ -177,12 +177,14 @@ runs: JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | - jf generate-summary-markdown || true - summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" - if [[ -f "$summary" ]]; then - cat "$summary" >> "$GITHUB_STEP_SUMMARY" + jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" + if [[ -d "$jf_summary_dir" ]]; then + find "$jf_summary_dir" -type f + jf generate-summary-markdown || true + if [[ -f "${jf_summary_dir}/markdown.md" ]]; then + cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" + fi fi - find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" - name: Generate provenance attestation if: >- diff --git a/build-yarn/action.yml b/build-yarn/action.yml index 68ef7829..eafa1a2e 100644 --- a/build-yarn/action.yml +++ b/build-yarn/action.yml @@ -186,12 +186,14 @@ runs: JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | - jf generate-summary-markdown || true - summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" - if [[ -f "$summary" ]]; then - cat "$summary" >> "$GITHUB_STEP_SUMMARY" + jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" + if [[ -d "$jf_summary_dir" ]]; then + find "$jf_summary_dir" -type f + jf generate-summary-markdown || true + if [[ -f "${jf_summary_dir}/markdown.md" ]]; then + cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" + fi fi - find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" - name: Generate provenance attestation if: >- diff --git a/promote/action.yml b/promote/action.yml index 09058d4d..272990ca 100644 --- a/promote/action.yml +++ b/promote/action.yml @@ -84,9 +84,11 @@ runs: JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | - jf generate-summary-markdown || true - summary="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/markdown.md" - if [[ -f "$summary" ]]; then - cat "$summary" >> "$GITHUB_STEP_SUMMARY" + jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" + if [[ -d "$jf_summary_dir" ]]; then + find "$jf_summary_dir" -type f + jf generate-summary-markdown || true + if [[ -f "${jf_summary_dir}/markdown.md" ]]; then + cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" + fi fi - find "${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary/" From de58ff1495629e9274def7e63c9d07c2b02d4967 Mon Sep 17 00:00:00 2001 From: Julien Carsique Date: Tue, 17 Mar 2026 13:30:08 +0100 Subject: [PATCH 3/4] BUILD-10591 Fix JFrog summary: activate server config before generating markdown 'jf generate-summary-markdown' requires an active server configuration to resolve the JFrog Platform URL. Call 'jf config use repox' before the command so it can find the server URL set up earlier by setup-jfrog-cli or by the build/promote script. Also drop '|| true': when the summary directory exists (meaning jf commands ran), the summary generation should succeed and failures should not be silently swallowed. Co-Authored-By: Claude Sonnet 4.6 --- build-npm/action.yml | 3 ++- build-poetry/action.yml | 3 ++- build-yarn/action.yml | 3 ++- promote/action.yml | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build-npm/action.yml b/build-npm/action.yml index fdd2f13b..0bf461bc 100644 --- a/build-npm/action.yml +++ b/build-npm/action.yml @@ -183,7 +183,8 @@ runs: jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" if [[ -d "$jf_summary_dir" ]]; then find "$jf_summary_dir" -type f - jf generate-summary-markdown || true + jf config use repox + jf generate-summary-markdown if [[ -f "${jf_summary_dir}/markdown.md" ]]; then cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" fi diff --git a/build-poetry/action.yml b/build-poetry/action.yml index 4f6f7b4a..7ebc89ad 100644 --- a/build-poetry/action.yml +++ b/build-poetry/action.yml @@ -180,7 +180,8 @@ runs: jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" if [[ -d "$jf_summary_dir" ]]; then find "$jf_summary_dir" -type f - jf generate-summary-markdown || true + jf config use repox + jf generate-summary-markdown if [[ -f "${jf_summary_dir}/markdown.md" ]]; then cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" fi diff --git a/build-yarn/action.yml b/build-yarn/action.yml index eafa1a2e..85b0620d 100644 --- a/build-yarn/action.yml +++ b/build-yarn/action.yml @@ -189,7 +189,8 @@ runs: jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" if [[ -d "$jf_summary_dir" ]]; then find "$jf_summary_dir" -type f - jf generate-summary-markdown || true + jf config use repox + jf generate-summary-markdown if [[ -f "${jf_summary_dir}/markdown.md" ]]; then cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" fi diff --git a/promote/action.yml b/promote/action.yml index 272990ca..a60045ee 100644 --- a/promote/action.yml +++ b/promote/action.yml @@ -87,7 +87,8 @@ runs: jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" if [[ -d "$jf_summary_dir" ]]; then find "$jf_summary_dir" -type f - jf generate-summary-markdown || true + jf config use repox + jf generate-summary-markdown if [[ -f "${jf_summary_dir}/markdown.md" ]]; then cat "${jf_summary_dir}/markdown.md" >> "$GITHUB_STEP_SUMMARY" fi From 4aae75687a84937c2adb21269a1e2abdc79e329d Mon Sep 17 00:00:00 2001 From: Julien Carsique Date: Tue, 17 Mar 2026 14:54:57 +0100 Subject: [PATCH 4/4] BUILD-10591 fix Repox URL for generating the summary --- README.md | 16 +++++++++------- build-maven/deploy-artifacts.sh | 10 +++++----- build-npm/action.yml | 1 - build-npm/build.sh | 2 +- build-npm/mise.local.toml | 6 +++++- build-poetry/action.yml | 1 - build-poetry/build.sh | 4 ++-- build-poetry/mise.local.toml | 6 +++++- build-yarn/action.yml | 1 - build-yarn/build.sh | 4 ++-- build-yarn/mise.local.toml | 6 +++++- config-npm/mise.local.toml | 6 +++++- config-npm/npm_config.sh | 2 +- mise.toml | 6 +++++- promote/action.yml | 1 - promote/mise.local.toml | 6 +++++- promote/promote.sh | 2 +- spec/build-maven_deploy-artifacts_spec.sh | 10 +++++----- spec/build-npm_spec.sh | 2 +- spec/build-poetry_spec.sh | 6 +++--- spec/build-yarn_spec.sh | 2 +- spec/config-npm_spec.sh | 2 +- 22 files changed, 62 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 3a52dc36..67b95939 100644 --- a/README.md +++ b/README.md @@ -1227,13 +1227,15 @@ promote: ### Inputs -| Input | Description | Default | -|---------------------------|---------------------------------------------------------------------------------------------------------------------------|---------------------| -| `promote-pull-request` | Whether to promote pull request artifacts. Requires `deploy-pull-request` input to be set to `true` in the build action | `false` | -| `multi-repo` | If true, promotes to public and private repositories. For projects with both public and private artifacts | (optional) | -| `artifactory-deploy-repo` | Repository to deploy to. If not set, it will be retrieved from the build info | (optional) | -| `artifactory-target-repo` | Target repository for the promotion. If not set, it will be determined based on the branch type and the deploy repository | (optional) | -| `build-name` | Name of the JFrog build to promote. | `` | +| Input | Description | Default | +|---------------------------|---------------------------------------------------------------------------------------------------------------------------|--------------------------| +| `repox-url` | URL for Repox | `https://repox.jfrog.io` | +| `repox-artifactory-url` | URL for Repox Artifactory API (overrides repox-url/artifactory if provided) | (optional) | +| `promote-pull-request` | Whether to promote pull request artifacts. Requires `deploy-pull-request` input to be set to `true` in the build action | `false` | +| `multi-repo` | If true, promotes to public and private repositories. For projects with both public and private artifacts | (optional) | +| `artifactory-deploy-repo` | Repository to deploy to. If not set, it will be retrieved from the build info | (optional) | +| `artifactory-target-repo` | Target repository for the promotion. If not set, it will be determined based on the branch type and the deploy repository | (optional) | +| `build-name` | Name of the JFrog build to promote. | `` | ### Outputs diff --git a/build-maven/deploy-artifacts.sh b/build-maven/deploy-artifacts.sh index e4faa321..d1c8d1d2 100755 --- a/build-maven/deploy-artifacts.sh +++ b/build-maven/deploy-artifacts.sh @@ -32,22 +32,22 @@ build_name="${GITHUB_REPOSITORY#*/}" pushd "$MAVEN_CONFIG/repository" echo "::group::Configure JFrog deployment" -jfrog config add deploy --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" -jfrog config use deploy +jf config add deploy --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" +jf config use deploy echo "::endgroup::" echo "::group::Deploy public artifacts" echo "Deploying public artifacts..." for artifact in "${public_artifacts[@]}"; do - jfrog rt u --build-name "$build_name" --build-number "$BUILD_NUMBER" "$artifact" "${ARTIFACTORY_DEPLOY_REPO}" + jf rt u --build-name "$build_name" --build-number "$BUILD_NUMBER" "$artifact" "${ARTIFACTORY_DEPLOY_REPO}" done echo "::endgroup::" echo "::group::Deploy private artifacts" echo "Deploying private artifacts..." -jfrog config edit deploy --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_PRIVATE_DEPLOY_ACCESS_TOKEN" +jf config edit deploy --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_PRIVATE_DEPLOY_ACCESS_TOKEN" for artifact in "${private_artifacts[@]}"; do - jfrog rt u --build-name "$build_name" --build-number "$BUILD_NUMBER" "$artifact" "${ARTIFACTORY_PRIVATE_DEPLOY_REPO}" + jf rt u --build-name "$build_name" --build-number "$BUILD_NUMBER" "$artifact" "${ARTIFACTORY_PRIVATE_DEPLOY_REPO}" done echo "::endgroup::" diff --git a/build-npm/action.yml b/build-npm/action.yml index 0bf461bc..452a1164 100644 --- a/build-npm/action.yml +++ b/build-npm/action.yml @@ -177,7 +177,6 @@ runs: if: always() shell: bash env: - JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" diff --git a/build-npm/build.sh b/build-npm/build.sh index 5ba5c1f3..e7370dcc 100755 --- a/build-npm/build.sh +++ b/build-npm/build.sh @@ -100,7 +100,7 @@ sonar_scanner_implementation() { jfrog_npm_publish() { echo "Configuring JFrog and NPM repositories..." jf config remove repox > /dev/null 2>&1 || true # Ignore inexistent configuration - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" jf config use repox jf npm-config --repo-resolve "npm" --repo-deploy "$ARTIFACTORY_DEPLOY_REPO" diff --git a/build-npm/mise.local.toml b/build-npm/mise.local.toml index 255706ed..c942c6d3 100644 --- a/build-npm/mise.local.toml +++ b/build-npm/mise.local.toml @@ -1,3 +1,7 @@ [tools] -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" jq = "1.8.1" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/build-poetry/action.yml b/build-poetry/action.yml index 7ebc89ad..ddc09382 100644 --- a/build-poetry/action.yml +++ b/build-poetry/action.yml @@ -174,7 +174,6 @@ runs: if: always() shell: bash env: - JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" diff --git a/build-poetry/build.sh b/build-poetry/build.sh index 84e63e93..80ecb36c 100755 --- a/build-poetry/build.sh +++ b/build-poetry/build.sh @@ -263,7 +263,7 @@ get_build_config() { } jfrog_poetry_install() { - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" jf config use repox jf poetry-config --server-id-resolve repox --repo-resolve "$ARTIFACTORY_PYPI_REPO" jf poetry install --build-name="$PROJECT" --build-number="$BUILD_NUMBER" @@ -271,7 +271,7 @@ jfrog_poetry_install() { jfrog_poetry_publish() { jf config remove repox - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" jf config use repox project_name=$(poetry version | awk '{print $1}') pushd dist diff --git a/build-poetry/mise.local.toml b/build-poetry/mise.local.toml index 2b1cde01..7c5a49cc 100644 --- a/build-poetry/mise.local.toml +++ b/build-poetry/mise.local.toml @@ -1,2 +1,6 @@ [tools] -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/build-yarn/action.yml b/build-yarn/action.yml index 85b0620d..ae0f3969 100644 --- a/build-yarn/action.yml +++ b/build-yarn/action.yml @@ -183,7 +183,6 @@ runs: if: always() shell: bash env: - JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" diff --git a/build-yarn/build.sh b/build-yarn/build.sh index 4028e06d..e0fbdf8b 100755 --- a/build-yarn/build.sh +++ b/build-yarn/build.sh @@ -104,7 +104,7 @@ npmRegistries: npmAuthToken: "${ARTIFACTORY_ACCESS_TOKEN}" EOF jf config remove repox > /dev/null 2>&1 || true # Do not log if the repox config were not present - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" jf config use repox jf npm-config --repo-resolve "npm" } @@ -173,7 +173,7 @@ sonar_scanner_implementation() { jfrog_yarn_publish() { echo "::debug::Configuring JFrog and NPM repositories..." jf config remove repox > /dev/null 2>&1 || true # Do not log if the repox config were not present - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_DEPLOY_ACCESS_TOKEN" jf config use repox jf npm-config --repo-resolve "npm" --repo-deploy "$ARTIFACTORY_DEPLOY_REPO" diff --git a/build-yarn/mise.local.toml b/build-yarn/mise.local.toml index 255706ed..c942c6d3 100644 --- a/build-yarn/mise.local.toml +++ b/build-yarn/mise.local.toml @@ -1,3 +1,7 @@ [tools] -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" jq = "1.8.1" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/config-npm/mise.local.toml b/config-npm/mise.local.toml index 255706ed..c942c6d3 100644 --- a/config-npm/mise.local.toml +++ b/config-npm/mise.local.toml @@ -1,3 +1,7 @@ [tools] -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" jq = "1.8.1" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/config-npm/npm_config.sh b/config-npm/npm_config.sh index b06df30e..f3e3f10d 100755 --- a/config-npm/npm_config.sh +++ b/config-npm/npm_config.sh @@ -19,7 +19,7 @@ registry=${ARTIFACTORY_URL}/api/npm/npm ${ARTIFACTORY_URL#https:}/api/npm/:_authToken=${ARTIFACTORY_ACCESS_TOKEN} EOF jf config remove repox > /dev/null 2>&1 || true # Ignore inexistent configuration - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_ACCESS_TOKEN" jf config use repox jf npm-config --repo-resolve "npm" return 0 diff --git a/mise.toml b/mise.toml index 2250405f..ca2f19ac 100644 --- a/mise.toml +++ b/mise.toml @@ -2,5 +2,9 @@ pre-commit = "4.2.0" shellcheck = "0.10.0" shellspec = "0.28.1" -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" "npm:markdownlint-cli" = "0.39.0" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/promote/action.yml b/promote/action.yml index a60045ee..9aa1eb7e 100644 --- a/promote/action.yml +++ b/promote/action.yml @@ -81,7 +81,6 @@ runs: if: always() shell: bash env: - JF_URL: ${{ inputs.repox-url }} JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR: ${{ runner.temp }}/jfrog-summary run: | jf_summary_dir="${JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR}/jfrog-command-summary" diff --git a/promote/mise.local.toml b/promote/mise.local.toml index 2b1cde01..7c5a49cc 100644 --- a/promote/mise.local.toml +++ b/promote/mise.local.toml @@ -1,2 +1,6 @@ [tools] -jfrog-cli = "2.77.0" +jfrog-cli = "2.96.0" + +[env] +JFROG_CLI_AVOID_NEW_VERSION_WARNING = "true" +JFROG_CLI_ENV_EXCLUDE = "*password*;*secret*;*key*;*token*;*auth*;*credential*" diff --git a/promote/promote.sh b/promote/promote.sh index 93a77fbe..94b05f12 100755 --- a/promote/promote.sh +++ b/promote/promote.sh @@ -69,7 +69,7 @@ check_branch() { jfrog_config_repox() { jf config remove repox - jf config add repox --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_PROMOTE_ACCESS_TOKEN" + jf config add repox --url "${ARTIFACTORY_URL%artifactory/}" --artifactory-url "$ARTIFACTORY_URL" --access-token "$ARTIFACTORY_PROMOTE_ACCESS_TOKEN" jf config use repox } diff --git a/spec/build-maven_deploy-artifacts_spec.sh b/spec/build-maven_deploy-artifacts_spec.sh index 78641c4b..1fe7a786 100755 --- a/spec/build-maven_deploy-artifacts_spec.sh +++ b/spec/build-maven_deploy-artifacts_spec.sh @@ -1,8 +1,8 @@ #!/bin/bash eval "$(shellspec - -c) exit 1" -Mock jfrog - echo "jfrog $*" +Mock jf + echo "jf $*" End # Set required environment variables @@ -28,8 +28,8 @@ com/sonarsource/private/app/1.0/app-1.0.jar" The status should be success The lines of stdout should equal 17 The line 2 of output should equal "::group::Configure JFrog deployment" - The line 3 of output should equal "jfrog config add deploy --artifactory-url https://dummy.repox --access-token deploy-token" - The line 4 of output should equal "jfrog config use deploy" + The line 3 of output should equal "jf config add deploy --artifactory-url https://dummy.repox --access-token deploy-token" + The line 4 of output should equal "jf config use deploy" The line 5 of output should equal "::endgroup::" The line 6 of output should equal "::group::Deploy public artifacts" The line 7 of output should include "Deploying public artifacts..." @@ -38,7 +38,7 @@ com/sonarsource/private/app/1.0/app-1.0.jar" The line 10 of output should equal "::endgroup::" The line 11 of output should equal "::group::Deploy private artifacts" The line 12 of output should equal "Deploying private artifacts..." - The line 13 of output should equal "jfrog config edit deploy --artifactory-url https://dummy.repox --access-token private-token" + The line 13 of output should equal "jf config edit deploy --artifactory-url https://dummy.repox --access-token private-token" The line 14 of output should include "com/sonarsource/private/app/1.0/app-1.0.pom private-repo-qa" The line 15 of output should include "com/sonarsource/private/app/1.0/app-1.0.jar private-repo-qa" The line 16 of output should equal "::endgroup::" diff --git a/spec/build-npm_spec.sh b/spec/build-npm_spec.sh index 071f4786..f5482fee 100755 --- a/spec/build-npm_spec.sh +++ b/spec/build-npm_spec.sh @@ -14,7 +14,7 @@ End Mock jf if [[ "$*" == "--version" ]]; then - echo "jf version 2.77.0" + echo "jf version 2.96.0" elif [[ "$*" == "rt build-publish test-project 42" ]]; then echo '{"buildInfoUiUrl": "https://repox.jfrog.io/ui/builds/test-project/42/123456/published"}' else diff --git a/spec/build-poetry_spec.sh b/spec/build-poetry_spec.sh index 4146439c..393ef926 100755 --- a/spec/build-poetry_spec.sh +++ b/spec/build-poetry_spec.sh @@ -612,7 +612,7 @@ Describe 'build_poetry()' fi End Mock jf - echo "jf version 2.77.0" + echo "jf version 2.96.0" End Mock git case "$*" in @@ -627,7 +627,7 @@ Describe 'build_poetry()' The output should include "jq-1.8.1" The output should include "Python 3.11.0" The output should include "Poetry (version 1.8.0)" - The output should include "jf version 2.77.0" + The output should include "jf version 2.96.0" The output should include "=== Build completed successfully ===" End @@ -647,7 +647,7 @@ Describe 'build_poetry()' fi End Mock jf - echo "jf version 2.77.0" + echo "jf version 2.96.0" End Mock git case "$*" in diff --git a/spec/build-yarn_spec.sh b/spec/build-yarn_spec.sh index 7e48d7ed..c0123c34 100755 --- a/spec/build-yarn_spec.sh +++ b/spec/build-yarn_spec.sh @@ -13,7 +13,7 @@ End Mock jf case "$*" in - "--version") echo "jf version 2.77.0" ;; + "--version") echo "jf version 2.96.0" ;; "rt build-publish test-project 42") echo '{"buildInfoUiUrl": "https://repox.jfrog.io/ui/builds/test-project/42/123456/published"}' ;; *) echo "jf $*" ;; esac diff --git a/spec/config-npm_spec.sh b/spec/config-npm_spec.sh index 8fd4c444..c9a2e304 100755 --- a/spec/config-npm_spec.sh +++ b/spec/config-npm_spec.sh @@ -18,7 +18,7 @@ End Mock jf if [[ "$*" == "--version" ]]; then - echo "jf version 2.77.0" + echo "jf version 2.96.0" else echo "jf $*" fi