Skip to content

Conversation

@shawn-hurley
Copy link
Contributor

@shawn-hurley shawn-hurley commented Nov 11, 2025

  • The new nightly job, will create the images from source

  • It will push the nightlies to quay if the all of the tests are passed

  • If it fails it will error out and publish to slack.

  • Note: The idea is that the last working nightly, is what CI will use for PR's to reduce the blast radius of a single change blocking all of CI.

Summary by CodeRabbit

  • Tests

    • Added a nightly end-to-end testing workflow that runs API integration tests across multiple operator versions, collects results, and uploads artifacts.
  • Chores

    • Added a reusable image-build action and a workflow to build container images with Podman, save artifacts, and support manual or called triggers.

@coderabbitai
Copy link

coderabbitai bot commented Nov 11, 2025

Walkthrough

Adds a new nightly GitHub Actions workflow orchestrating Java analyzer image builds and multi-version e2e API integration tests, plus a reusable composite action to build and export container images with Podman.

Changes

Cohort / File(s) Change Summary
Nightly workflow
.github/workflows/new-nightly.yaml
New "Konveyor e2e nightly" workflow with cron and manual triggers; jobs: build-java-analyzer-bundle (matrix image builds, Podman build, artifact export) and e2e-api-integration-tests (extract PR ref, checkout golang tests, conditional buildx, start Minikube per operator_tag, load artifacts, install multi-version operators, run Go e2e tests, collect/upload results).
Reusable build action
build-image/action.yml
New composite action to build container images with Podman. Inputs: repo, ref, base_image, image_name, image_tag, dockerfile_path, build_context. Steps: checkout, optional base image download/load, podman build, save image tar, set outputs and upload artifact.
Reusable workflow wrapper
.github/workflows/test-build-image.yml
New workflow exposing workflow_call and workflow_dispatch inputs that delegates image build to ./build-image action, forwarding inputs and defaults.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Cron as Trigger (cron / manual)
    participant Bundle as build-java-analyzer-bundle
    participant BuildAction as build-image Action
    participant Storage as Artifact Storage
    participant E2E as e2e-api-integration-tests
    Note over Bundle,BuildAction `#D6EAF8`: Job matrix per repo
    Cron->>Bundle: start matrix runs
    Bundle->>BuildAction: checkout + build params
    BuildAction->>BuildAction: podman build (optional base image)
    BuildAction->>Storage: upload image TAR artifact
    BuildAction-->>Bundle: outputs (image metadata, artifact name)
    Bundle->>Storage: expose artifact for downstream
    Bundle-->>E2E: job completion / dependency
    E2E->>Storage: download image artifact(s)
    E2E->>E2E: load image(s) into container runtime
    E2E->>E2E: start Minikube (per operator_tag)
    E2E->>E2E: install operator versions & run Go tests
    E2E->>Storage: upload test results & analysis artifacts
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Areas to focus on:
    • Conditional flows in e2e-api-integration-tests (operator_tag branching, Minikube lifecycle)
    • Artifact upload/download and image loading steps across jobs
    • Correct propagation of inputs/outputs between test-build-image.yml and build-image/action.yml
    • Extraction and use of GOLANG_TESTS_REF from PR body

Possibly related PRs

Suggested reviewers

  • dymurray
  • mguetta1
  • sjd78

Poem

🐰
I hopped through code at midnight's glow,
Built images fast, then let them go,
Minikube pond and tests that sing,
Artifacts packed beneath my wing,
Nightly dreams of CI take flight!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title references composable actions and a nightly job, which directly align with the PR objectives and the three new files added (build-image/action.yml composite action, test-build-image.yml workflow, and new-nightly.yaml nightly job).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (2)
.github/workflows/new-nightly.yaml (2)

103-181: Refactor duplicate minikube and install-tackle steps using matrix strategy.

Lines 103–181 contain a TODO about code duplication. The three "start minikube" steps (109–125) and three "install konveyor" steps (149–180) have near-identical structure, differing only by operator version.

Consider refactoring using a job matrix or breaking these into a reusable composite action to reduce duplication and improve maintainability:

  e2e-api-integration-tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        operator_version: [v0.7, v0.8, latest]
    steps:
      - name: start minikube
        uses: konveyor/tackle2-operator/.github/actions/start-minikube@${{ matrix.operator_version == 'latest' && 'main' || format('release-{0}', matrix.operator_version) }}
        with:
          memory: 'max'
          cpus: 'max'
      # Similar refactoring for install-tackle steps

This approach eliminates conditional step duplication.

Do you want me to provide a detailed refactoring example using matrix strategy?


25-25: Remove trailing whitespace from default value.

-        default: main 
+        default: main
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 534c22e and c7ebd51.

📒 Files selected for processing (2)
  • .github/workflows/build-image.yaml (1 hunks)
  • .github/workflows/new-nightly.yaml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.8)
.github/workflows/build-image.yaml

73-73: input "image_tag" of workflow_call event has the default value "latest", but it is also required. if an input is marked as required, its default value will never be used

(events)


79-79: input "dockerfile_path" of workflow_call event has the default value "Dockerfile", but it is also required. if an input is marked as required, its default value will never be used

(events)


85-85: input "build_context" of workflow_call event has the default value ".", but it is also required. if an input is marked as required, its default value will never be used

(events)

.github/workflows/new-nightly.yaml

28-28: "steps" section is missing in job "build-java-analyzer-bundle"

(syntax-check)


44-44: "runs-on" section is missing in job "strategy"

(syntax-check)


45-45: unexpected key "matrix" for "job" section. expected one of "concurrency", "container", "continue-on-error", "defaults", "env", "environment", "if", "name", "needs", "outputs", "permissions", "runs-on", "secrets", "services", "steps", "strategy", "timeout-minutes", "uses", "with"

(syntax-check)


53-53: property "config" is not defined in object type {}

(expression)


67-67: unexpected key "needs" for "step" section. expected one of "continue-on-error", "env", "id", "if", "name", "run", "shell", "timeout-minutes", "uses", "with", "working-directory"

(syntax-check)


70-70: property "java_bundle_build" is not defined in object type {build_image: {conclusion: string; outcome: string; outputs: {string => string}}; checkout: {conclusion: string; outcome: string; outputs: {commit: string; ref: string}}}

(expression)


75-75: string should not be empty

(syntax-check)


87-87: property "api_tests_ref" is not defined in object type {branch: string}

(expression)


105-105: property "component_name" is not defined in object type {branch: string}

(expression)


106-106: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)


110-110: property "operator_tag" is not defined in object type {branch: string}

(expression)


116-116: property "operator_tag" is not defined in object type {branch: string}

(expression)


122-122: property "operator_tag" is not defined in object type {branch: string}

(expression)


128-128: property "component_name" is not defined in object type {branch: string}

(expression)


132-132: property "component_name" is not defined in object type {branch: string}

(expression)


136-136: property "component_name" is not defined in object type {branch: string}

(expression)


150-150: property "operator_tag" is not defined in object type {branch: string}

(expression)


152-152: property "operator_tag" is not defined in object type {branch: string}

(expression)


153-153: property "tag" is not defined in object type {branch: string}

(expression)


154-154: property "tag" is not defined in object type {branch: string}

(expression)


155-155: property "tag" is not defined in object type {branch: string}

(expression)


161-161: property "operator_tag" is not defined in object type {branch: string}

(expression)


163-163: property "operator_tag" is not defined in object type {branch: string}

(expression)


164-164: property "tag" is not defined in object type {branch: string}

(expression)


165-165: property "tag" is not defined in object type {branch: string}

(expression)


166-166: property "tag" is not defined in object type {branch: string}

(expression)


172-172: property "operator_tag" is not defined in object type {branch: string}

(expression)


174-174: property "operator_tag" is not defined in object type {branch: string}

(expression)


175-175: property "tag" is not defined in object type {branch: string}

(expression)


176-176: property "tag" is not defined in object type {branch: string}

(expression)


177-177: property "tag" is not defined in object type {branch: string}

(expression)


183-183: the runner of "actions/setup-go@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)


193-193: property "api_hub_tests_ref" is not defined in object type {branch: string}

(expression)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-api-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-ui-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-ui-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-api-integration-tests
🔇 Additional comments (2)
.github/workflows/build-image.yaml (1)

160-165: Incomplete line 165—verify intent.

Line 165 appears to be cut off or incomplete in the provided code. Verify that the summary step is complete:

          echo "- **Artifact Name**: ${{ steps.build_image.outputs.image_name }}-${{ steps.build_image.outputs.image_tag }}" >> $GITHUB_STEP_SUMMARY

Does this line need additional content, or should it be as shown?

.github/workflows/new-nightly.yaml (1)

51-51: Update actions/checkout to v4.

The standard for newer workflows is v4.

-       uses: actions/checkout@v5
+       uses: actions/checkout@v4

Likely an incorrect or invalid review comment.

Comment on lines 68 to 71
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: true
type: string
default: "latest"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Remove conflicting required and default constraints on image_tag.

When required is true, the default will never be used. For image_call inputs, set either required: false (to keep the default) or remove the default value (to enforce required).

      image_tag:
        description: |
          The tag for the image (e.g., "latest", "v1.0.0")
-       required: true
+       required: false
        type: string
        default: "latest"

Alternatively, if you want to enforce a required input, remove the default:

      image_tag:
        description: |
          The tag for the image (e.g., "latest", "v1.0.0")
        required: true
        type: string
-       default: "latest"


---

🏁 Script executed:

```shell
#!/bin/bash
# Inspect the workflow file to verify the structure and all input definitions
fd -t f "build-image.yaml" --exec cat {}

Length of output: 0


🌐 Web query:

GitHub Actions required input default value behavior conflict

💡 Result:

Short answer: GitHub's metadata treats a default value as "provided" so the input is never absent — and GitHub does not automatically enforce required at runtime. That means if you set both default and required: true, the default is used and no platform error is raised. To enforce "must be explicitly set" you must check in your action code (e.g., via @actions/core getInput or custom logic) and fail if the value equals the default or is empty. [1][2]

Sources

  • GitHub Actions metadata docs: inputs default/required behaviour and note that required inputs are not automatically enforced. [1]
  • @actions/core docs: how action code reads inputs and can require/enforce inputs at runtime. [2]

References
[1] GitHub Docs — Metadata syntax for GitHub Actions.
[2] @actions/core (npm) — getInput / required option.


🏁 Script executed:

#!/bin/bash
# Search for any yaml files in .github directory
find .github -type f -name "*.yaml" -o -name "*.yml" 2>/dev/null | head -20

Length of output: 337


🏁 Script executed:

#!/bin/bash
# Inspect build-image.yaml with line numbers, focusing on inputs section
cat -n .github/workflows/build-image.yaml | head -90

Length of output: 3124


Address all 6 instances of conflicting required and default constraints, not just image_tag in workflow_call.

The same conflict exists for three inputs (image_tag, dockerfile_path, build_context) in both workflow_dispatch (lines 27–44) and workflow_call (lines 68–85) sections. Choose one approach consistently across both sections:

  • Set required: false and keep the default value, OR
  • Set required: true and remove the default value

GitHub allows this combination but treats the default as "provided," making required: true ineffective at runtime and creating confusion about intent.

🧰 Tools
🪛 actionlint (1.7.8)

73-73: input "image_tag" of workflow_call event has the default value "latest", but it is also required. if an input is marked as required, its default value will never be used

(events)

🤖 Prompt for AI Agents
In .github/workflows/build-image.yaml around lines 27–44 and 68–85 (inputs
image_tag, dockerfile_path, build_context in both workflow_dispatch and
workflow_call), the inputs currently have conflicting required:true with a
default value; make the intent explicit by setting required: false for all six
instances and keep their current default values so defaults are used when
callers omit them and required no longer contradicts the defaults.

Comment on lines 80 to 81
build_context:
description: |
Build context directory
required: true
type: string
default: "."
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Remove conflicting required and default constraints on build_context.

Apply the same fix to build_context:

      build_context:
        description: |
          Build context directory
-       required: true
+       required: false
        type: string
        default: "."

I'll verify this review comment by checking GitHub Actions documentation and examining the actual workflow file.

Now let me examine the actual workflow file to understand the context better:


Let me search for the file in the repository:

Now let me find and examine the actual build-image.yaml file:

---

🏁 Script executed:

```shell
#!/bin/bash
# Find and examine the build-image.yaml file
find . -name "build-image.yaml" -type f 2>/dev/null | head -5

Length of output: 36


🏁 Script executed:

#!/bin/bash
# Search for build-image.yaml file
find . -name "*build*image*.yaml" -o -name "*build*image*.yml" 2>/dev/null | head -10

Length of output: 36





🏁 Script executed:

#!/bin/bash
# Examine the build-image.yaml file content, focusing on the inputs section
cat ./.github/workflows/build-image.yaml | head -100

Length of output: 2733


🏁 Script executed:

#!/bin/bash
# Get line count and examine lines around 80-85
wc -l ./.github/workflows/build-image.yaml
echo "---"
sed -n '70,95p' ./.github/workflows/build-image.yaml

Length of output: 642



---

🌐 Web query:

```web
GitHub Actions workflow_dispatch required true with default value semantics

💡 Result:

Short answer

  • In workflow_dispatch inputs, required: true simply marks that the input must be supplied when manually running the workflow from the UI or API — it does not negate or remove a default. If you give a default value, that default will be used when the workflow is started without an explicit input (including non-manual triggers), and the UI shows the default as the pre-filled value. [1][2]

Key sources

  • Official docs: workflow_dispatch inputs support description, required, default and type; the triggered workflow receives values via inputs and github.event.inputs. The docs describe required as “a boolean specifying whether the input must be supplied.” Example shows required: true together with a default. [1][2]
  • Community discussion: users have observed that defaults are applied on non-manual triggers (and that defining required + default can be a source of confusion). [3]

Practical implications / recommendations

  • If you want a value always available (including scheduled/push runs) use a default. required: true will not stop the default being used for non-manual triggers. [1][3]
  • If you want to force a human to change the value when manually running, don’t provide a useful default (use an empty string or sentinel like "REQUIRED" and treat that as invalid in workflow steps), or validate in the workflow (fail or prompt) because GitHub’s UI will still accept a default. [1]
  • If you want different behavior for manual vs other triggers, detect the event (github.event_name or github.event) and apply different defaults in the workflow (e.g., set job envs/outputs based on github.event.inputs when present, otherwise fall back to repo-level defaults). [2][3]

References
[1] GitHub Docs — Triggering a workflow / on.workflow_dispatch.inputs (examples and field meanings).
[2] GitHub Docs — Workflow syntax reference: on.workflow_dispatch.inputs (use, types, required/default example).
[3] GitHub Community discussion “Inputs take default values on non-manual trigger” (example and community notes about semantics).

Would you like a short example workflow and a pattern to enforce “must-change-on-manual-run” behavior?


Apply the same fix to all three affected inputs: build_context, image_tag, and dockerfile_path.

The semantic issue you identified is real: inputs with sensible defaults should have required: false, not required: true. However, the same pattern exists for image_tag and dockerfile_path, which also have defaults and required: true. These should all be changed consistently:

  • Line 70-72: image_tag (workflow_call) — change to required: false
  • Line 75-77: dockerfile_path (workflow_call) — change to required: false
  • Line 82-85: build_context (workflow_call) — change to required: false

The same inputs appear in the workflow_dispatch section with identical conflicts and should also be fixed there for consistency.

🧰 Tools
🪛 actionlint (1.7.8)

85-85: input "build_context" of workflow_call event has the default value ".", but it is also required. if an input is marked as required, its default value will never be used

(events)

🤖 Prompt for AI Agents
In .github/workflows/build-image.yaml around lines 70-77 and 80-85
(workflow_call) and the matching workflow_dispatch section, inputs image_tag,
dockerfile_path, and build_context have defaults but are incorrectly marked
required: true; change required: true to required: false for each of these three
inputs in both the workflow_call and workflow_dispatch sections so defaults are
allowed and the inputs are truly optional.

Comment on lines +6 to +25
workflow_call:
inputs:
branch:
description: |
The branch that should be used to pull all konveyor related repos.
For example, if you wanted to set a nightly build for release-0.8, you would specify
"release-0.8".
required: false
type: string
default: main
workflow_dispatch:
inputs:
branch:
description: |
The branch that should be used to pull all konveyor related repos.
For example, if you wanted to set a nightly build for release-0.8, you would specify
"release-0.8".
required: false
type: string
default: main
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Add missing input definitions for e2e-api-integration-tests job.

The e2e job references many undefined inputs (lines 87, 105, 110, 116, 122, 132, 152–155, 195, 197), but only branch is defined in the workflow inputs. Add the missing input definitions:

  workflow_call:
    inputs:
      branch:
        description: |
          The branch that should be used to pull all konveyor related repos.
          For example, if you wanted to set a nightly build for release-0.8, you would specify
          "release-0.8".
        required: false
        type: string
        default: main
+     api_tests_ref:
+       description: Reference for API tests repo
+       required: false
+       type: string
+       default: main
+     component_name:
+       description: Name of the component to test
+       required: false
+       type: string
+     operator_tag:
+       description: Operator version tag (e.g., v0.7, v0.8, latest)
+       required: false
+       type: string
+       default: latest
+     tag:
+       description: Image tag for Konveyor components
+       required: false
+       type: string
+     api_hub_tests_ref:
+       description: Reference for API hub tests
+       required: false
+       type: string
+       default: main
+     api_tests_tiers:
+       description: Test tiers to run
+       required: false
+       type: string


---

🏁 Script executed:

```shell
#!/bin/bash
# Examine the workflow file to verify the review comment claims
cat .github/workflows/new-nightly.yaml | head -n 220

Length of output: 8271


Inputs are correctly identified as undefined; review comment is accurate.

The workflow file confirms the review comment's analysis. The workflow_call only defines the branch input, but the e2e-api-integration-tests job references six additional inputs (api_tests_ref, component_name, operator_tag, tag, api_hub_tests_ref, api_tests_tiers) that are not declared. These will cause runtime failures when the workflow is invoked via workflow_call without these input definitions. The suggested input additions are appropriate and necessary.

🤖 Prompt for AI Agents
.github/workflows/new-nightly.yaml lines 6-25: the workflow_call only declares a
single input `branch` but downstream jobs reference six additional inputs
(`api_tests_ref`, `component_name`, `operator_tag`, `tag`, `api_hub_tests_ref`,
`api_tests_tiers`) causing runtime failures; add declarations for each missing
input under workflow_call.inputs (and mirror under workflow_dispatch.inputs if
manual triggers should accept them) with appropriate descriptions, types (string
or array as needed), required: false, and sensible defaults so the called
workflow receives all referenced parameters.

Comment on lines +28 to +48
build-java-analyzer-bundle:
runs-on: ubuntu-latest
## This should be a matrix that inlcudes static-report
# rulesets which should trigger the hub and it's components BESIDES the addon-analyzer.
# Java analyzer bundle triggers konveyor/analzyer-lsp (which includes all external providers in that repo).
# Analyzer-LSP then needs to trigger kai, kantra, tackle-addon-analyzer.
# Next we need to build the operator/operator-bundle using all the images.
# Next we need to define the end-to-end tests to run and run a matrix for
# 1. tackle2-hub/operator
# 2. kantra -> Needs to run on mac/windows/linux
# 3. kai -> Needs to run on mac/windows/linux
# Each of these, needs to have a test for all the external providers built here
# 1. java-external-provider
# 2. javascript provider (needs rename)
# 3. python provider
# 4. golang provider
strategy:
matrix:
config: [{"repo": "kovneyor/ruleset", "image_name": "", "dependent_repos": []}, {"repo": "konveyor/java-analyzer-bundle", "dependent_repos": []}, {"repo": "konveyor/static-report", "dependent_repos": []}]

steps:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Critical YAML syntax error: incorrect job structure in build-java-analyzer-bundle.

The job's indentation is malformed. The strategy key should be nested inside the job, not at the same level as runs-on. Additionally, steps should be inside the job, not at the top level.

The current structure violates GitHub Actions YAML format. Here's the correct structure:

  build-java-analyzer-bundle:
    runs-on: ubuntu-latest
    strategy:
      matrix:
-       config: [...]
-   steps:
+       config: [...]
+    steps:
       - name: Checkout repo
         ...

Verify the intended matrix configuration and steps, then fix the indentation.



---

🏁 Script executed:

```shell
#!/bin/bash
# Fetch the workflow file to examine structure
find . -name "new-nightly.yaml" -type f | head -1 | xargs cat

Length of output: 8271



---

🌐 Web query:

```web
GitHub Actions checkout@v5 latest version available

💡 Result:

The latest released v5 tag is v5.0.0 (released on Aug 11). [1][2]

Sources:
[1] actions/checkout repository (README/tags).
[2] actions/checkout releases (v5.0.0).


Fix critical YAML syntax errors and step reference issues in build-java-analyzer-bundle job.

The job has multiple critical issues:

  1. Incorrect indentation: strategy (line 44) and steps (line 48) are at the wrong nesting level. They should be nested inside the job, not siblings to it.

  2. Typo in config: Line 46 has "kovneyor/ruleset" instead of "konveyor/ruleset".

  3. Wrong step references: Line 56 uses needs: java_bundle_build, but the step is named build_image (line 35). Line 57 references steps.java_bundle_build.outputs.date, which is also incorrect.

  4. Typo in step ID: Line 60 has id: dependnect-jobs (should be dependent-jobs).

  5. Incomplete step definition: The "Define dependent jobs" step (line 60) lacks actual commands after run: |.

Fix the indentation to nest both strategy and steps inside the job, correct all typos and step references, and complete the final step definition.

🧰 Tools
🪛 actionlint (1.7.8)

28-28: "steps" section is missing in job "build-java-analyzer-bundle"

(syntax-check)


44-44: "runs-on" section is missing in job "strategy"

(syntax-check)


45-45: unexpected key "matrix" for "job" section. expected one of "concurrency", "container", "continue-on-error", "defaults", "env", "environment", "if", "name", "needs", "outputs", "permissions", "runs-on", "secrets", "services", "steps", "strategy", "timeout-minutes", "uses", "with"

(syntax-check)

🤖 Prompt for AI Agents
.github/workflows/new-nightly.yaml lines 28-48: the build-java-analyzer-bundle
job has mis-nested keys and several naming typos and missing commands; move the
strategy and steps keys to be indented under the build-java-analyzer-bundle job
(so they are children of that job), fix the repo typo "kovneyor/ruleset" ->
"konveyor/ruleset", ensure any job/step references use the actual step id
(change any needs: java_bundle_build and outputs references to point to the step
id of the image build step, e.g., steps.build_image.outputs.date if the step id
is build_image), rename the step id "dependnect-jobs" -> "dependent-jobs", and
add a concrete run: block for the "Define dependent jobs" step with the shell
commands required (or placeholder commands) so the step is complete; ensure all
indentation and YAML structure validate after these edits.

Comment on lines +56 to +64
- name: build image
id: build_image
run: |
DATE_TAG=$(date +%Y-%m-%d_%H-%M)
echo "date=${DATE_TAG}" >> $GITHUB_OUTPUT
podman build -t quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} .
mkdir -p image_artifact
podman save quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${DATE}.tar

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix incorrect step reference in tar file name.

Line 63 references steps.java_bundle_build.outputs.date, but the step ID is build_image (line 57). This will cause a runtime failure.

-          podman save quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${DATE}.tar
+          podman save quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${DATE_TAG}.tar

Also, the variable name is ${DATE_TAG}, not ${DATE}, so fix both issues.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: build image
id: build_image
run: |
DATE_TAG=$(date +%Y-%m-%d_%H-%M)
echo "date=${DATE_TAG}" >> $GITHUB_OUTPUT
podman build -t quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} .
mkdir -p image_artifact
podman save quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${DATE}.tar
- name: build image
id: build_image
run: |
DATE_TAG=$(date +%Y-%m-%d_%H-%M)
echo "date=${DATE_TAG}" >> $GITHUB_OUTPUT
podman build -t quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} .
mkdir -p image_artifact
podman save quay.io/konveyor/jdtls-server-base:nightly-${DATE_TAG} image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${DATE_TAG}.tar
🤖 Prompt for AI Agents
In .github/workflows/new-nightly.yaml around lines 56 to 64, the tar filename
incorrectly references the wrong step ID and wrong variable name; update any
GitHub Actions output references to use the actual step id "build_image" (e.g.
steps.build_image.outputs.date) and replace the shell variable ${DATE} with the
correct ${DATE_TAG} (or use ${{ steps.build_image.outputs.date }} where
appropriate) so the saved tar uses the produced DATE_TAG value.

Comment on lines +65 to +71
- name: upload artifact
uses: actions/upload-artifact@v4
needs: java_bundle_build
with:
name: built-image
path: image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${{ steps.java_bundle_build.outputs.date }}.tar

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Invalid needs keyword in step and incorrect step references.

Line 67 uses needs: java_bundle_build, which is invalid for steps (only valid at job level). Additionally, the path references the wrong step ID.

       - name: upload artifact
-        uses: actions/upload-artifact@v4
-        needs: java_bundle_build
         with:
           name: built-image
-          path: image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${{ steps.java_bundle_build.outputs.date }}.tar
+          path: image_artifact/quay.io_konveyor_jdtls-server-base_nightly-${{ steps.build_image.outputs.date }}.tar

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 actionlint (1.7.8)

67-67: unexpected key "needs" for "step" section. expected one of "continue-on-error", "env", "id", "if", "name", "run", "shell", "timeout-minutes", "uses", "with", "working-directory"

(syntax-check)


70-70: property "java_bundle_build" is not defined in object type {build_image: {conclusion: string; outcome: string; outputs: {string => string}}; checkout: {conclusion: string; outcome: string; outputs: {commit: string; ref: string}}}

(expression)

Comment on lines +73 to +76
- name: Define dependent jobs
id: dependnect-jobs
run: |

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix typo and implement empty step.

The "Define dependent jobs" step has a typo in its name and is not implemented (empty run command).

       - name: Define dependent jobs
-        id: dependnect-jobs
+        id: dependent-jobs
         run: |
-
+          # TODO: Implement logic to define dependent jobs based on matrix.config

Consider whether this step is needed, or remove it if it's a placeholder.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Define dependent jobs
id: dependnect-jobs
run: |
- name: Define dependent jobs
id: dependent-jobs
run: |
# TODO: Implement logic to define dependent jobs based on matrix.config
🧰 Tools
🪛 actionlint (1.7.8)

75-75: string should not be empty

(syntax-check)

🤖 Prompt for AI Agents
.github/workflows/new-nightly.yaml around lines 73 to 76: the step named "Define
dependent jobs" contains a typo in the id (dependnect-jobs) and an empty run
block, leaving it as an unimplemented placeholder; either remove the step if
it's not needed or correct the id/name and implement the intended commands (or a
no-op comment) in the run block, e.g., fix the id to dependents-jobs (or
dependents) and add the actual shell commands to set outputs or define
dependencies, or delete the entire step if it serves no purpose.

Comment on lines +104 to +107
- name: set up docker buildx
if: "${{ inputs.component_name != '' }}"
uses: docker/setup-buildx-action@v2

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update docker/setup-buildx-action to v3.

The current version is v3, which provides bug fixes and improved compatibility.

         - name: set up docker buildx
-          uses: docker/setup-buildx-action@v2
+          uses: docker/setup-buildx-action@v3
           if: "${{ inputs.component_name != '' }}"

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 actionlint (1.7.8)

105-105: property "component_name" is not defined in object type {branch: string}

(expression)


106-106: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🤖 Prompt for AI Agents
In .github/workflows/new-nightly.yaml around lines 104 to 107, the workflow uses
docker/setup-buildx-action@v2; update the action reference to
docker/setup-buildx-action@v3 to pick up the v3 fixes and compatibility
improvements (replace the uses line accordingly and keep the surrounding
conditional and name unchanged).

Comment on lines +183 to +186
- uses: actions/setup-go@v4
with:
go-version: 1.23

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update actions/setup-go to v6.

The latest version is v6, released September 2024, which upgrades the Node.js runtime and includes important dependency updates.

-       - uses: actions/setup-go@v4
+       - uses: actions/setup-go@v5
         with:
           go-version: 1.23
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: actions/setup-go@v4
with:
go-version: 1.23
- uses: actions/setup-go@v5
with:
go-version: 1.23
🧰 Tools
🪛 actionlint (1.7.8)

183-183: the runner of "actions/setup-go@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🤖 Prompt for AI Agents
.github/workflows/new-nightly.yaml around lines 183 to 186: update the GitHub
Action usage from actions/setup-go@v4 to actions/setup-go@v6; replace the uses
line with actions/setup-go@v6, keep the existing go-version input (1.23) unless
you want to bump it, then save and run the workflow to ensure compatibility and
that no inputs or behavior changed with v6.

* The new nightly job, will create the images from source
* It will push the nightlies to quay if the all of the tests are passed
* If it fails it will error out and publish to slack.

* Note: The idea is that the last working nightly, is what CI will use
  for PR's to reduce the blast radius of a single change blocking all of
CI.

Signed-off-by: Shawn Hurley <[email protected]>
@shawn-hurley shawn-hurley force-pushed the feature/enhance-composable-actions branch from c7ebd51 to 198267a Compare November 11, 2025 15:01
Signed-off-by: Shawn Hurley <[email protected]>
Signed-off-by: Shawn Hurley <[email protected]>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 198267a and dcf18d6.

📒 Files selected for processing (1)
  • .github/actions/build-image/action.yml (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-api-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-ui-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-api-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-ui-integration-tests

Comment on lines +25 to +30
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: true
type: string
default: "latest"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Input parameter has contradictory configuration.

The image_tag input is marked required: true but also has default: "latest". If a default is provided, the input should be required: false. Conversely, if it is truly required, remove the default.

Apply one of these diffs depending on intent:

Option 1: Remove the default (if truly required):

   image_tag:
     description: |
       The tag for the image (e.g., "latest", "v1.0.0")
     required: true
     type: string
-    default: "latest"

Option 2: Make it optional with a default:

   image_tag:
     description: |
       The tag for the image (e.g., "latest", "v1.0.0")
-    required: true
+    required: false
     type: string
     default: "latest"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: true
type: string
default: "latest"
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: true
type: string
Suggested change
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: true
type: string
default: "latest"
image_tag:
description: |
The tag for the image (e.g., "latest", "v1.0.0")
required: false
type: string
default: "latest"
🤖 Prompt for AI Agents
In .github/actions/build-image/action.yml around lines 25 to 30 the input
"image_tag" is marked required: true while also providing default: "latest",
which is contradictory; either remove the default to keep it required, or set
required: false and keep the default so the input becomes optional. Update the
file accordingly: if you want callers to always supply a tag, delete the default
line and leave required: true; if you want a sensible fallback, change required:
true to required: false and keep default: "latest".

Comment on lines 85 to 106
- name: Build image with podman
id: build_image
run: |
IMAGE_NAME="${{ inputs.image_name }}"
IMAGE_TAG="${{ inputs.image_tag }}"
FULL_IMAGE_NAME="quay.io/konveyor/${IMAGE_NAME}:${IMAGE_TAG}"

echo "Building image: ${FULL_IMAGE_NAME}"
podman build \
-f "${{ inputs.dockerfile_path }}" \
-t "${FULL_IMAGE_NAME}" \
"${{ inputs.build_context }}"

echo "Saving image to tar file..."
mkdir -p image_artifact
TAR_FILE="image_artifact/${IMAGE_NAME}_${IMAGE_TAG}.tar"
podman save "${FULL_IMAGE_NAME}" -o "${TAR_FILE}"

echo "image_name=${IMAGE_NAME}" >> $GITHUB_OUTPUT
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
echo "tar_file=${TAR_FILE}" >> $GITHUB_OUTPUT
echo "full_image_name=${FULL_IMAGE_NAME}" >> $GITHUB_OUTPUT
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Missing shell directive and missing output declaration.

Line 87: The run: step is missing the required shell: bash directive for composite actions.

Additionally, this action sets outputs (image_name, image_tag, tar_file, full_image_name) via $GITHUB_OUTPUT but does not declare them in the action metadata. Composite actions must explicitly declare all outputs.

Apply this diff to add the shell directive:

       - name: Build image with podman
         id: build_image
+        shell: bash
         run: |

Then add output declarations at the top-level outputs: section (after the inputs: section and before runs:):

   build_context:
     description: |
       Build context directory
     type: string
     default: "."
+
+outputs:
+  image_name:
+    description: "The name of the built image"
+    value: ${{ steps.build_image.outputs.image_name }}
+  image_tag:
+    description: "The tag of the built image"
+    value: ${{ steps.build_image.outputs.image_tag }}
+  tar_file:
+    description: "Path to the tar artifact file"
+    value: ${{ steps.build_image.outputs.tar_file }}
+  full_image_name:
+    description: "The full image name including registry"
+    value: ${{ steps.build_image.outputs.full_image_name }}

 runs:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Build image with podman
id: build_image
run: |
IMAGE_NAME="${{ inputs.image_name }}"
IMAGE_TAG="${{ inputs.image_tag }}"
FULL_IMAGE_NAME="quay.io/konveyor/${IMAGE_NAME}:${IMAGE_TAG}"
echo "Building image: ${FULL_IMAGE_NAME}"
podman build \
-f "${{ inputs.dockerfile_path }}" \
-t "${FULL_IMAGE_NAME}" \
"${{ inputs.build_context }}"
echo "Saving image to tar file..."
mkdir -p image_artifact
TAR_FILE="image_artifact/${IMAGE_NAME}_${IMAGE_TAG}.tar"
podman save "${FULL_IMAGE_NAME}" -o "${TAR_FILE}"
echo "image_name=${IMAGE_NAME}" >> $GITHUB_OUTPUT
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
echo "tar_file=${TAR_FILE}" >> $GITHUB_OUTPUT
echo "full_image_name=${FULL_IMAGE_NAME}" >> $GITHUB_OUTPUT
- name: Build image with podman
id: build_image
shell: bash
run: |
IMAGE_NAME="${{ inputs.image_name }}"
IMAGE_TAG="${{ inputs.image_tag }}"
FULL_IMAGE_NAME="quay.io/konveyor/${IMAGE_NAME}:${IMAGE_TAG}"
echo "Building image: ${FULL_IMAGE_NAME}"
podman build \
-f "${{ inputs.dockerfile_path }}" \
-t "${FULL_IMAGE_NAME}" \
"${{ inputs.build_context }}"
echo "Saving image to tar file..."
mkdir -p image_artifact
TAR_FILE="image_artifact/${IMAGE_NAME}_${IMAGE_TAG}.tar"
podman save "${FULL_IMAGE_NAME}" -o "${TAR_FILE}"
echo "image_name=${IMAGE_NAME}" >> $GITHUB_OUTPUT
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
echo "tar_file=${TAR_FILE}" >> $GITHUB_OUTPUT
echo "full_image_name=${FULL_IMAGE_NAME}" >> $GITHUB_OUTPUT
🤖 Prompt for AI Agents
.github/actions/build-image/action.yml around lines 85 to 106: the composite
action run step is missing the required "shell: bash" directive and the action
metadata does not declare the outputs that the run step sets; add a "shell:
bash" key under the run step and add an outputs: section at top-level
(immediately after inputs: and before runs:) declaring image_name, image_tag,
tar_file, and full_image_name (with appropriate descriptions/defaults) so the
composite action explicitly exposes those outputs.

Signed-off-by: Shawn Hurley <[email protected]>
Signed-off-by: Shawn Hurley <[email protected]>
Signed-off-by: Shawn Hurley <[email protected]>
Signed-off-by: Shawn Hurley <[email protected]>
Signed-off-by: Shawn Hurley <[email protected]>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/test-build-image.yml (1)

3-82: Consider consolidating duplicated input definitions.

The input schema for workflow_call (lines 5–42) and workflow_dispatch (lines 45–82) are identical. While GitHub Actions doesn't provide built-in DRY mechanisms for YAML anchors/reuse, this duplication increases maintenance burden. If these definitions ever diverge, it could lead to unexpected behavior differences between the two trigger modes.

This is a quality-of-life improvement rather than a functional issue. If the repository has conventions for managing such duplication, consider applying them here.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4deae9f and a48e079.

📒 Files selected for processing (2)
  • .github/workflows/test-build-image.yml (1 hunks)
  • build-image/action.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • build-image/action.yml
🧰 Additional context used
🪛 actionlint (1.7.8)
.github/workflows/test-build-image.yml

32-32: input "image_tag" of workflow_call event has the default value "latest", but it is also required. if an input is marked as required, its default value will never be used

(events)


89-89: description is required in metadata of "Build Image" action at "/home/jailuser/git/build-image/action.yml"

(action)


91-91: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


92-92: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


93-93: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


94-94: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


95-95: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


96-96: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


97-97: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-api-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci-bundle.yml with default input / e2e-ui-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-api-integration-tests
  • GitHub Check: Verify api and ui tests run via global-ci.yml with default inputs / e2e-ui-integration-tests
🔇 Additional comments (1)
.github/workflows/test-build-image.yml (1)

89-89: Verify composite action metadata is complete.

Static analysis indicates the composite action at ./build-image/action.yml (referenced on line 89) is missing a description field in its action metadata. Ensure the action has a description defined to comply with GitHub Actions best practices.

Comment on lines +30 to +32
required: true
type: string
default: "latest"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Resolve conflicting image_tag input configuration.

The image_tag input is marked required: true but also provides default: "latest" (lines 30–32 and 70–72). When an input is required, its default value is never used by GitHub Actions, creating confusing expectations for callers.

Choose one:

  • Option A: Remove the requirement if a default is intended:
    -        required: true
    +        required: false
           default: "latest"
  • Option B: Remove the default if the input must always be explicitly provided:
           required: true
    -        default: "latest"

Make this change in both workflow_call (lines 30–32) and workflow_dispatch (lines 70–72) sections.

Also applies to: 70-72

🧰 Tools
🪛 actionlint (1.7.8)

32-32: input "image_tag" of workflow_call event has the default value "latest", but it is also required. if an input is marked as required, its default value will never be used

(events)

🤖 Prompt for AI Agents
In .github/workflows/test-build-image.yml around lines 30-32 and 70-72, the
input "image_tag" is declared as required: true while also providing default:
"latest", which is contradictory; change both sections to be consistent by
removing required: true (Option A) so the default "latest" is used when callers
omit the input, and ensure both the workflow_call and workflow_dispatch
definitions are updated identically.

Comment on lines +91 to +97
repo: ${{ github.events.input.repo }}
ref: ${{ github.events.input.ref }}
base_image: ${{ github.events.input.base_image }}
image_name: ${{ github.events.input.image_name }}
image_tag: ${{ github.events.input.image_tag }}
dockerfile_path: ${{ github.events.input.dockerfile_path }}
build_context: ${{ github.events.input.build_context }}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Fix input context syntax to unblock workflow execution.

The workflow uses ${{ github.events.input.* }} (plural "events"), which is invalid. This will cause the step to fail silently with empty variables. The correct syntax depends on the triggering event:

  • For workflow_dispatch: use ${{ github.event.inputs.* }} (singular "event")
  • For workflow_call: use ${{ inputs.* }}

Since this workflow supports both triggers, you need to choose one approach or conditionally reference the correct context. Most reusable workflows accessed via workflow_call pass inputs directly without referencing github.event.

Recommended fix (if workflow_call is the primary use case):

       - name: Build Image
         uses: ./build-image
         with:
-          repo: ${{ github.events.input.repo }}
-          ref: ${{ github.events.input.ref }}
-          base_image: ${{ github.events.input.base_image }}
-          image_name: ${{ github.events.input.image_name }}
-          image_tag: ${{ github.events.input.image_tag }}
-          dockerfile_path: ${{ github.events.input.dockerfile_path }}
-          build_context: ${{ github.events.input.build_context }}
+          repo: ${{ inputs.repo }}
+          ref: ${{ inputs.ref }}
+          base_image: ${{ inputs.base_image }}
+          image_name: ${{ inputs.image_name }}
+          image_tag: ${{ inputs.image_tag }}
+          dockerfile_path: ${{ inputs.dockerfile_path }}
+          build_context: ${{ inputs.build_context }}

If manual dispatch (workflow_dispatch) must also work, you'll need conditional logic to handle both cases, or create separate workflows for each trigger type.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
repo: ${{ github.events.input.repo }}
ref: ${{ github.events.input.ref }}
base_image: ${{ github.events.input.base_image }}
image_name: ${{ github.events.input.image_name }}
image_tag: ${{ github.events.input.image_tag }}
dockerfile_path: ${{ github.events.input.dockerfile_path }}
build_context: ${{ github.events.input.build_context }}
repo: ${{ inputs.repo }}
ref: ${{ inputs.ref }}
base_image: ${{ inputs.base_image }}
image_name: ${{ inputs.image_name }}
image_tag: ${{ inputs.image_tag }}
dockerfile_path: ${{ inputs.dockerfile_path }}
build_context: ${{ inputs.build_context }}
🧰 Tools
🪛 actionlint (1.7.8)

91-91: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


92-92: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


93-93: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


94-94: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


95-95: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


96-96: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)


97-97: property "events" is not defined in object type {action: string; action_path: string; action_ref: string; action_repository: string; action_status: string; actor: string; actor_id: string; api_url: string; artifact_cache_size_limit: number; base_ref: string; env: string; event: object; event_name: string; event_path: string; graphql_url: string; head_ref: string; job: string; output: string; path: string; ref: string; ref_name: string; ref_protected: bool; ref_type: string; repository: string; repository_id: string; repository_owner: string; repository_owner_id: string; repository_visibility: string; repositoryurl: string; retention_days: number; run_attempt: string; run_id: string; run_number: string; secret_source: string; server_url: string; sha: string; state: string; step_summary: string; token: string; triggering_actor: string; workflow: string; workflow_ref: string; workflow_sha: string; workspace: string}

(expression)

🤖 Prompt for AI Agents
.github/workflows/test-build-image.yml lines 91-97: the step currently
references `${{ github.events.input.* }}` which is invalid and yields empty
values; replace those references with the correct context for your trigger: use
`${{ inputs.<name> }}` when the workflow is invoked via `workflow_call`, or `${{
github.event.inputs.<name> }}` for `workflow_dispatch`. If this workflow must
support both, change each variable to a conditional expression that selects
`inputs.<name>` when `github.event_name == 'workflow_call'` and
`github.event.inputs.<name>` when `github.event_name == 'workflow_dispatch'`,
ensuring defaults where appropriate so the step always receives a valid value.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant