From c012a91f9ecaff36dc1ea56816b758d77932c5d1 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 14:50:42 -0500 Subject: [PATCH 01/12] avoid triggering nightly tests until builds are complete --- .github/workflows/build.yaml | 41 +++++++++++++++++++++++ .github/workflows/nightly.yaml | 60 +++++----------------------------- 2 files changed, 49 insertions(+), 52 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 933d8aa985..4931e7a606 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -41,6 +41,13 @@ on: description: "build_type: one of [branch, nightly, pull-request]" type: string default: nightly + # Triggering 'test.yaml' from inside 'build.yaml' allows the use of the 'needs:' mechanism + # to ensure tests only start runniing once the builds they need are complete. + trigger-tests: + description: | + If 'true', trigger the test workflow after all builds complete. + type: boolean + default: false concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -211,6 +218,40 @@ jobs: date: ${{ inputs.date }} package-name: cuopt_sh_client package-type: python + tests: + # Docker image build / tests aren't necessary for the 'test.yaml' workflow, + # so 'test.yaml' can be triggered without waiting for those. + needs: + - upload-conda + - wheel-publish-cuopt + - wheel-publish-cuopt-mps-parser + - wheel-publish-cuopt-server + - wheel-publish-cuopt-sh-client + - wheel-publish-libcuopt + if: ${{ inputs.trigger-tests }} + secrets: inherit + runs-on: ubuntu-latest + # ref: https://docs.github.com/en/actions/reference/security/secure-use#use-an-intermediate-environment-variable + env: + GITHUB_TOKEN: ${{ github.token }} + INPUT_BRANCH: "${{ inputs.branch }}" + INPUT_BUILD_TYPE: "${{ inputs.build_type }}" + INPUT_DATE: "${{ inputs.date }}" + INPUT_SHA: "${{ inputs.sha }}" + steps: + trigger-test-workflow: + # Assumes the branch you want to test is the same one you want to source 'test.yaml' from. + # If that ever changes, will need to set '--ref' and 'build_type=' from different sources. + run: | + gh workflow run \ + --repo NVIDIA/cuopt \ + --ref "${INPUT_BRANCH}" \ + 'test.yaml' \ + -f branch="${INPUT_BRANCH}" \ + -f build_type="${INPUT_BUILD_TYPE}" \ + -f date="${INPUT_DATE}" \ + -f sha="${INPUT_SHA}" + build-images: needs: [wheel-publish-cuopt, wheel-publish-cuopt-server] uses: ./.github/workflows/build_test_publish_images.yaml diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 2feece10e7..18901149b9 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -7,8 +7,9 @@ on: jobs: - trigger-build: + trigger-nightly-builds-and-tests: runs-on: ubuntu-latest + timeout-minutes: 30 strategy: matrix: include: @@ -23,55 +24,10 @@ jobs: export DATE=$(date +%F) export SHA=$(gh api -q '.commit.sha' "repos/nvidia/cuopt/branches/${CUOPT_BRANCH}") - gh workflow run build.yaml \ + gh workflow run build.yaml \ + --repos NVIDIA/cuopt \ -f branch="${CUOPT_BRANCH}" \ - -f sha="${SHA}" \ - -f date="${DATE}" \ - -f build_type=nightly - - # Wait a short bit for the workflow to register (optional) - sleep 3 - - # Get the latest run ID for this workflow on this branch - RUN_ID=$(gh run list --workflow=build.yaml --branch="${CUOPT_BRANCH}" --json databaseId --limit 1 | jq -r '.[0].databaseId') - - STATUS=$(gh run view $RUN_ID --json status,conclusion --jq '.status') - CONCLUSION=$(gh run view $RUN_ID --json status,conclusion --jq '.conclusion') - - while [[ "$STATUS" != "completed" || "$CONCLUSION" == "null" ]]; do - echo "Status: $STATUS, Conclusion: $CONCLUSION — waiting 10 seconds..." - sleep 10 - STATUS=$(gh run view $RUN_ID --json status,conclusion --jq '.status') - CONCLUSION=$(gh run view $RUN_ID --json status,conclusion --jq '.conclusion') - done - - echo "Workflow run finished with conclusion: $CONCLUSION" - - if [[ "$CONCLUSION" != "success" ]]; then - echo "Build did not succeed" - exit 1 - fi - - - trigger-test: - runs-on: ubuntu-latest - needs: trigger-build - strategy: - matrix: - include: - - cuopt_version: "25.10" - steps: - - uses: actions/checkout@v4 - - name: Trigger Test - env: - GH_TOKEN: ${{ github.token }} - run: | - export CUOPT_BRANCH="branch-${{ matrix.cuopt_version }}" - export DATE=$(date +%F) - export SHA=$(gh api -q '.commit.sha' "repos/nvidia/cuopt/branches/${CUOPT_BRANCH}") - - gh workflow run test.yaml \ - -f branch=${CUOPT_BRANCH} \ - -f sha=${SHA} \ - -f date=${DATE} \ - -f build_type=nightly + -f build_type=nightly \ + -f date="${DATE}" \ + -f sha="${SHA}" \ + -f trigger-tests="true" From 00b0cec8a45e006137ff09ecccb4cd068d34e9d5 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 14:53:25 -0500 Subject: [PATCH 02/12] GH_TOKEN --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 4931e7a606..996c73af2e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -233,7 +233,7 @@ jobs: runs-on: ubuntu-latest # ref: https://docs.github.com/en/actions/reference/security/secure-use#use-an-intermediate-environment-variable env: - GITHUB_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ github.token }} INPUT_BRANCH: "${{ inputs.branch }}" INPUT_BUILD_TYPE: "${{ inputs.build_type }}" INPUT_DATE: "${{ inputs.date }}" From c7a9841ebb96580b0fe35b2fd4851da9a946aa34 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 14:53:48 -0500 Subject: [PATCH 03/12] test with cheaper workflows --- .github/workflows/build.yaml | 28 ++++++++--------- .github/workflows/pr.yaml | 30 +++++++++---------- .github/workflows/test.yaml | 10 +++---- .../trigger-breaking-change-alert.yaml | 2 +- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 996c73af2e..2829f7ec9a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -56,7 +56,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -66,7 +66,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -76,7 +76,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -84,7 +84,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -99,7 +99,7 @@ jobs: wheel-publish-cuopt-mps-parser: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -110,7 +110,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -123,7 +123,7 @@ jobs: wheel-publish-libcuopt: needs: wheel-build-libcuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -134,7 +134,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -146,7 +146,7 @@ jobs: wheel-publish-cuopt: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -157,7 +157,7 @@ jobs: wheel-build-cuopt-server: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -169,7 +169,7 @@ jobs: wheel-publish-cuopt-server: needs: wheel-build-cuopt-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -180,7 +180,7 @@ jobs: docs-build: needs: [python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} node_type: "gpu-l4-latest-1" @@ -195,7 +195,7 @@ jobs: wheel-build-cuopt-sh-client: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -210,7 +210,7 @@ jobs: wheel-publish-cuopt-sh-client: needs: wheel-build-cuopt-sh-client secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 51203186fa..b4a5e178ee 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -43,10 +43,10 @@ jobs: - wheel-build-cuopt-sh-client - test-self-hosted-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@cuopt-testing changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@cuopt-testing with: files_yaml: | test_cpp: @@ -111,21 +111,21 @@ jobs: - '!python/nvcf_client/**' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@cuopt-testing with: enable_check_generated_files: false conda-cpp-build: needs: checks secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_cpp.sh conda-cpp-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@cuopt-testing #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -133,14 +133,14 @@ jobs: conda-python-build: needs: conda-cpp-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_python.sh conda-python-tests: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@cuopt-testing #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python with: run_codecov: false @@ -149,7 +149,7 @@ jobs: docs-build: needs: conda-python-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing with: build_type: pull-request node_type: "gpu-l4-latest-1" @@ -160,7 +160,7 @@ jobs: script: "ci/build_docs.sh" wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_wheel_cuopt_mps_parser.sh @@ -172,7 +172,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) @@ -183,7 +183,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_wheel_cuopt.sh @@ -192,7 +192,7 @@ jobs: wheel-tests-cuopt: needs: [wheel-build-cuopt, wheel-build-cuopt-mps-parser, wheel-build-cuopt-sh-client, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_cuopt with: build_type: pull-request @@ -200,7 +200,7 @@ jobs: wheel-build-cuopt-server: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_wheel_cuopt_server.sh @@ -208,7 +208,7 @@ jobs: package-type: python wheel-build-cuopt-sh-client: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing with: build_type: pull-request script: ci/build_wheel_cuopt_sh_client.sh @@ -221,7 +221,7 @@ jobs: wheel-tests-cuopt-server: needs: [wheel-build-cuopt-server, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_cuopt_server with: build_type: pull-request diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7b4bbd95cf..1de183d05f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -40,7 +40,7 @@ on: jobs: conda-cpp-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@cuopt-testing with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -49,7 +49,7 @@ jobs: script: ci/test_cpp.sh conda-python-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@cuopt-testing with: run_codecov: false build_type: ${{ inputs.build_type }} @@ -59,7 +59,7 @@ jobs: script: ci/test_python.sh wheel-tests-cuopt: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -68,7 +68,7 @@ jobs: script: ci/test_wheel_cuopt.sh wheel-tests-cuopt-server: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -77,7 +77,7 @@ jobs: script: ci/test_wheel_cuopt_server.sh conda-notebook-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/trigger-breaking-change-alert.yaml b/.github/workflows/trigger-breaking-change-alert.yaml index 1317f4a8f9..49223fcf0b 100644 --- a/.github/workflows/trigger-breaking-change-alert.yaml +++ b/.github/workflows/trigger-breaking-change-alert.yaml @@ -27,7 +27,7 @@ jobs: trigger-notifier: if: contains(github.event.pull_request.labels.*.name, 'breaking') secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@cuopt-testing with: sender_login: ${{ github.event.sender.login }} sender_avatar: ${{ github.event.sender.avatar_url }} From 0378ff1ed109718877447a2364b5dede1fa50192 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 14:58:09 -0500 Subject: [PATCH 04/12] fix flag --- .github/workflows/nightly.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 18901149b9..3668183d6c 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -25,7 +25,7 @@ jobs: export SHA=$(gh api -q '.commit.sha' "repos/nvidia/cuopt/branches/${CUOPT_BRANCH}") gh workflow run build.yaml \ - --repos NVIDIA/cuopt \ + --repo NVIDIA/cuopt \ -f branch="${CUOPT_BRANCH}" \ -f build_type=nightly \ -f date="${DATE}" \ From 63c499fd77cdec36f592a5a031d4d2c2d48ac14e Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 15:01:31 -0500 Subject: [PATCH 05/12] pass --ref --- .github/workflows/nightly.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 3668183d6c..ec4de1ffec 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -24,8 +24,10 @@ jobs: export DATE=$(date +%F) export SHA=$(gh api -q '.commit.sha' "repos/nvidia/cuopt/branches/${CUOPT_BRANCH}") + # TODO: set '--ref' back to CUOPT_BRANCH gh workflow run build.yaml \ --repo NVIDIA/cuopt \ + --ref 'trigger-nightly-tests-after-builds' \ -f branch="${CUOPT_BRANCH}" \ -f build_type=nightly \ -f date="${DATE}" \ From 71494c10fd77e30e9848c01a55b6215c75645e20 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 15:09:20 -0500 Subject: [PATCH 06/12] fix syntax (YAML list not mapping) --- .github/workflows/build.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2829f7ec9a..080542dd76 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -228,8 +228,7 @@ jobs: - wheel-publish-cuopt-server - wheel-publish-cuopt-sh-client - wheel-publish-libcuopt - if: ${{ inputs.trigger-tests }} - secrets: inherit + if: inputs.trigger-tests == 'true' runs-on: ubuntu-latest # ref: https://docs.github.com/en/actions/reference/security/secure-use#use-an-intermediate-environment-variable env: @@ -239,7 +238,7 @@ jobs: INPUT_DATE: "${{ inputs.date }}" INPUT_SHA: "${{ inputs.sha }}" steps: - trigger-test-workflow: + - name: trigger-test-workflow # Assumes the branch you want to test is the same one you want to source 'test.yaml' from. # If that ever changes, will need to set '--ref' and 'build_type=' from different sources. run: | From 4519625eb7d59e484ee600bd5f2e24cfd965f1fa Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 16:05:53 -0500 Subject: [PATCH 07/12] fix trigger test check --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 080542dd76..2605658311 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -228,7 +228,7 @@ jobs: - wheel-publish-cuopt-server - wheel-publish-cuopt-sh-client - wheel-publish-libcuopt - if: inputs.trigger-tests == 'true' + if: inputs.trigger-tests runs-on: ubuntu-latest # ref: https://docs.github.com/en/actions/reference/security/secure-use#use-an-intermediate-environment-variable env: From 1c6a44a3e34f3af1c8d9fd5a1fb2d1594c0e57d6 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 17:51:59 -0500 Subject: [PATCH 08/12] switch branch to branch-25.10 --- .github/workflows/build.yaml | 28 ++++++++--------- .github/workflows/pr.yaml | 30 +++++++++---------- .github/workflows/test.yaml | 10 +++---- .github/workflows/test_images.yaml | 2 ++ .../trigger-breaking-change-alert.yaml | 2 +- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2605658311..6b5919149c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -56,7 +56,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -66,7 +66,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -76,7 +76,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -84,7 +84,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -99,7 +99,7 @@ jobs: wheel-publish-cuopt-mps-parser: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -110,7 +110,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -123,7 +123,7 @@ jobs: wheel-publish-libcuopt: needs: wheel-build-libcuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -134,7 +134,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -146,7 +146,7 @@ jobs: wheel-publish-cuopt: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -157,7 +157,7 @@ jobs: wheel-build-cuopt-server: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -169,7 +169,7 @@ jobs: wheel-publish-cuopt-server: needs: wheel-build-cuopt-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -180,7 +180,7 @@ jobs: docs-build: needs: [python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} node_type: "gpu-l4-latest-1" @@ -195,7 +195,7 @@ jobs: wheel-build-cuopt-sh-client: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -210,7 +210,7 @@ jobs: wheel-publish-cuopt-sh-client: needs: wheel-build-cuopt-sh-client secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b4a5e178ee..51203186fa 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -43,10 +43,10 @@ jobs: - wheel-build-cuopt-sh-client - test-self-hosted-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-25.10 changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-25.10 with: files_yaml: | test_cpp: @@ -111,21 +111,21 @@ jobs: - '!python/nvcf_client/**' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-25.10 with: enable_check_generated_files: false conda-cpp-build: needs: checks secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_cpp.sh conda-cpp-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -133,14 +133,14 @@ jobs: conda-python-build: needs: conda-cpp-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_python.sh conda-python-tests: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python with: run_codecov: false @@ -149,7 +149,7 @@ jobs: docs-build: needs: conda-python-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 with: build_type: pull-request node_type: "gpu-l4-latest-1" @@ -160,7 +160,7 @@ jobs: script: "ci/build_docs.sh" wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_wheel_cuopt_mps_parser.sh @@ -172,7 +172,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) @@ -183,7 +183,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_wheel_cuopt.sh @@ -192,7 +192,7 @@ jobs: wheel-tests-cuopt: needs: [wheel-build-cuopt, wheel-build-cuopt-mps-parser, wheel-build-cuopt-sh-client, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_cuopt with: build_type: pull-request @@ -200,7 +200,7 @@ jobs: wheel-build-cuopt-server: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_wheel_cuopt_server.sh @@ -208,7 +208,7 @@ jobs: package-type: python wheel-build-cuopt-sh-client: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 with: build_type: pull-request script: ci/build_wheel_cuopt_sh_client.sh @@ -221,7 +221,7 @@ jobs: wheel-tests-cuopt-server: needs: [wheel-build-cuopt-server, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 #if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_cuopt_server with: build_type: pull-request diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1de183d05f..7b4bbd95cf 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -40,7 +40,7 @@ on: jobs: conda-cpp-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -49,7 +49,7 @@ jobs: script: ci/test_cpp.sh conda-python-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 with: run_codecov: false build_type: ${{ inputs.build_type }} @@ -59,7 +59,7 @@ jobs: script: ci/test_python.sh wheel-tests-cuopt: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -68,7 +68,7 @@ jobs: script: ci/test_wheel_cuopt.sh wheel-tests-cuopt-server: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -77,7 +77,7 @@ jobs: script: ci/test_wheel_cuopt_server.sh conda-notebook-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/test_images.yaml b/.github/workflows/test_images.yaml index bfeda82f61..fbd59300bc 100644 --- a/.github/workflows/test_images.yaml +++ b/.github/workflows/test_images.yaml @@ -35,6 +35,7 @@ on: jobs: prepare: + name: test-images (prepare) runs-on: ubuntu-latest outputs: CUDA_SHORT: ${{ steps.trim.outputs.CUDA_SHORT }} @@ -50,6 +51,7 @@ jobs: echo "PYTHON_SHORT=$PYTHON_SHORT" >> $GITHUB_OUTPUT test: + name: test-images (${{ inputs.ARCH }, ${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ needs.prepare.outputs.CUDA_SHORT }}-py${{ needs.prepare.outputs.PYTHON_SHORT }}) runs-on: "linux-${{ inputs.ARCH }}-gpu-a100-latest-1" needs: prepare container: diff --git a/.github/workflows/trigger-breaking-change-alert.yaml b/.github/workflows/trigger-breaking-change-alert.yaml index 49223fcf0b..1317f4a8f9 100644 --- a/.github/workflows/trigger-breaking-change-alert.yaml +++ b/.github/workflows/trigger-breaking-change-alert.yaml @@ -27,7 +27,7 @@ jobs: trigger-notifier: if: contains(github.event.pull_request.labels.*.name, 'breaking') secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@cuopt-testing + uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@branch-25.10 with: sender_login: ${{ github.event.sender.login }} sender_avatar: ${{ github.event.sender.avatar_url }} From 4f47bcf02e2e719ab4d5ab6bfbecfaf698401289 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 17:59:49 -0500 Subject: [PATCH 09/12] missing brace --- .github/workflows/test_images.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_images.yaml b/.github/workflows/test_images.yaml index fbd59300bc..66cbce036d 100644 --- a/.github/workflows/test_images.yaml +++ b/.github/workflows/test_images.yaml @@ -51,7 +51,7 @@ jobs: echo "PYTHON_SHORT=$PYTHON_SHORT" >> $GITHUB_OUTPUT test: - name: test-images (${{ inputs.ARCH }, ${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ needs.prepare.outputs.CUDA_SHORT }}-py${{ needs.prepare.outputs.PYTHON_SHORT }}) + name: test-images (${{ inputs.ARCH }}, ${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ needs.prepare.outputs.CUDA_SHORT }}-py${{ needs.prepare.outputs.PYTHON_SHORT }}) runs-on: "linux-${{ inputs.ARCH }}-gpu-a100-latest-1" needs: prepare container: From f0dee4ffc40609f902f3a7277c6326462e0e9421 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Mon, 22 Sep 2025 22:41:04 -0500 Subject: [PATCH 10/12] fix branch references --- .github/workflows/build.yaml | 7 ++++--- .github/workflows/nightly.yaml | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6b5919149c..767ed4cccf 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -205,6 +205,7 @@ jobs: package-name: cuopt_sh_client package-type: python append-cuda-suffix: false + pure-wheel: true # only need 1 build (noarch package): this selects amd64, oldest-supported Python, latest-supported CUDA matrix_filter: '[map(select(.ARCH == "amd64")) | min_by((.PY_VER | split(".") | map(tonumber)), (.CUDA_VER | split(".") | map(-tonumber)))]' wheel-publish-cuopt-sh-client: @@ -239,12 +240,12 @@ jobs: INPUT_SHA: "${{ inputs.sha }}" steps: - name: trigger-test-workflow - # Assumes the branch you want to test is the same one you want to source 'test.yaml' from. - # If that ever changes, will need to set '--ref' and 'build_type=' from different sources. run: | + # NOTE: '--ref' is the branch to pull the workflow file from, 'branch' input is the branch + # to pull the actual cuOpt source code from gh workflow run \ --repo NVIDIA/cuopt \ - --ref "${INPUT_BRANCH}" \ + --ref "${{ github.ref }}" \ 'test.yaml' \ -f branch="${INPUT_BRANCH}" \ -f build_type="${INPUT_BUILD_TYPE}" \ diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index ec4de1ffec..0b118cdacc 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -24,10 +24,11 @@ jobs: export DATE=$(date +%F) export SHA=$(gh api -q '.commit.sha' "repos/nvidia/cuopt/branches/${CUOPT_BRANCH}") - # TODO: set '--ref' back to CUOPT_BRANCH + # NOTE: '--ref' is the branch to pull the workflow file from, 'branch' input is the branch + # to pull the actual cuOpt source code from gh workflow run build.yaml \ --repo NVIDIA/cuopt \ - --ref 'trigger-nightly-tests-after-builds' \ + --ref "${{ github.ref }}" \ -f branch="${CUOPT_BRANCH}" \ -f build_type=nightly \ -f date="${DATE}" \ From 5e39dd0da8e5904a48f979eea80146c599b1cda9 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Tue, 23 Sep 2025 18:51:55 -0500 Subject: [PATCH 11/12] empty commit to fully retrigger CI From 386dad242229ef889b24b5169340acd613a03b83 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Tue, 23 Sep 2025 22:27:03 -0500 Subject: [PATCH 12/12] fix links --- docs/cuopt/source/cuopt-server/quick-start.rst | 2 +- docs/cuopt/source/faq.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cuopt/source/cuopt-server/quick-start.rst b/docs/cuopt/source/cuopt-server/quick-start.rst index 782feac834..56011b4cfa 100644 --- a/docs/cuopt/source/cuopt-server/quick-start.rst +++ b/docs/cuopt/source/cuopt-server/quick-start.rst @@ -86,7 +86,7 @@ Step 2: Once given access, users can find `cuOpt container `_. +* Generate an NGC API key from settings. If you have not generated an API Key, you can generate it by going to the Setup option in your profile and choose Get API Key. Store this or generate a new one next time. More information can be found `here `_. Step 4: Pull the container: diff --git a/docs/cuopt/source/faq.rst b/docs/cuopt/source/faq.rst index 70ec008454..99c8d7b6da 100644 --- a/docs/cuopt/source/faq.rst +++ b/docs/cuopt/source/faq.rst @@ -23,7 +23,7 @@ General FAQ 1. Log into NGC using the invite and choose the appropriate NGC org. - 2. Generate an NGC API key from settings. If you have not generated an API Key, you can generate it by going to the Setup option in your profile and choose `Get API Key `_. Store this or generate a new one next time. + 2. Generate an NGC API key from settings. If you have not generated an API Key, you can generate it by going to the Setup option in your profile and choose `Get API Key `_. Store this or generate a new one next time. 3. Go to the container section for cuOpt and copy the pull tag for the latest image. - Within the Select a tag dropdown, locate the container image release that you want to run.