Skip to content

CNTRLPLANE-2986: feat(ci): Add self-hosted GitHub Actions runners for HyperShift#7980

Merged
openshift-merge-bot[bot] merged 1 commit into
openshift:mainfrom
bryan-cox:CNTRLPLANE-2986
Mar 23, 2026
Merged

CNTRLPLANE-2986: feat(ci): Add self-hosted GitHub Actions runners for HyperShift#7980
openshift-merge-bot[bot] merged 1 commit into
openshift:mainfrom
bryan-cox:CNTRLPLANE-2986

Conversation

@bryan-cox
Copy link
Copy Markdown
Member

@bryan-cox bryan-cox commented Mar 17, 2026

What this PR does / why we need it:

Adds self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC) to run lint, codespell, gitlint, and cpo-container-sync checks. These checks run as separate GitHub Actions workflows for faster, parallelized PR feedback.

The existing make verify target is unchanged so local workflows remain consistent. A new make verify-ci target is added for Prow CI, which excludes the checks that now also run in GitHub Actions (lint, codespell, gitlint, cpo-container-sync).

The runners use a custom image with Go, make, gcc, and oc/kubectl pre-installed. golangci-lint and the kube-api-linter plugin are pre-built into the image to avoid compiling 300+ vendored deps on every CI run.

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • Runners are ARM64 (aarch64) on c6g.8xlarge nodes, matching the target CI workload
  • ARC scales runner pods from 1 (idle) to 70 based on queued jobs
  • Each runner is ephemeral — handles one job then terminates
  • All connections are outbound from the cluster to GitHub (no inbound access required)
  • make verify is unchanged — local dev workflow stays the same
  • make verify-ci is a new target for Prow that excludes checks now running in GitHub Actions

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

@openshift-ci-robot
Copy link
Copy Markdown

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Mar 17, 2026
@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint and cpo-container-sync out of make verify into separate GitHub Actions workflow jobs for faster, parallelized PR CI feedback.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add GitHub Actions CI workflow (.github/workflows/ci.yaml) with lint and cpo-container-sync as separate parallel jobs
  • Remove lint and cpo-container-sync from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, prerequisites, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners for clean environments and security
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, vet, verify-codespell, and run-gitlint

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 17, 2026

Important

Review skipped

Auto reviews are limited based on label configuration.

🚫 Review skipped — only excluded labels are configured. (1)
  • do-not-merge/work-in-progress

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: c3c6888d-8f8d-45ca-936f-aedfbe862db4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This pull request establishes infrastructure for self-hosted GitHub Actions runners. It introduces a specialized GitHub Actions runner container image with prebuilt development tools (Go, linting tools, kubectl, OpenShift client). The build system is updated to detect and use prebuilt tools from the CI image rather than building locally, with version verification. Four new GitHub Actions workflows are added to run linting, codespell, git commit, and container sync checks. A Helm values file configures the runner deployment with resource constraints and topology spreading. Supporting documentation details the runner setup and operation. A minor environment variable is added to the control-plane Dockerfile.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@bryan-cox bryan-cox marked this pull request as ready for review March 17, 2026 00:59
@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Mar 17, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 17, 2026

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Mar 17, 2026
@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint and cpo-container-sync out of make verify into separate GitHub Actions workflow jobs for faster, parallelized PR CI feedback.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add GitHub Actions CI workflow (.github/workflows/ci.yaml) with lint and cpo-container-sync as separate parallel jobs
  • Remove lint and cpo-container-sync from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, prerequisites, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners for clean environments and security
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, vet, verify-codespell, and run-gitlint

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci Bot added the area/ci-tooling Indicates the PR includes changes for CI or tooling label Mar 17, 2026
@openshift-ci openshift-ci Bot requested review from jparrill and sjenning March 17, 2026 01:00
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 17, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bryan-cox

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added approved Indicates a PR has been approved by an approver from all required OWNERS files. and removed do-not-merge/needs-area labels Mar 17, 2026
@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint and cpo-container-sync out of make verify into separate GitHub Actions workflow jobs for faster, parallelized PR CI feedback.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add GitHub Actions CI workflow (.github/workflows/ci.yaml) with lint and cpo-container-sync as separate parallel jobs
  • Remove lint and cpo-container-sync from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, prerequisites, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners for clean environments and security
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, vet, verify-codespell, and run-gitlint

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Summary by CodeRabbit

  • New Features

  • Self-hosted GitHub Actions runner infrastructure with automated CI/CD pipeline including lint and container synchronization jobs.

  • Documentation

  • Added comprehensive guides for GitHub Actions runner deployment, configuration, security model, auto-scaling, and operational procedures.

  • Chores

  • Configured CI workflow automation and runner container image with necessary build tools and dependencies.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Copy Markdown
Contributor

@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.

🧹 Nitpick comments (2)
hack/github-actions-runner/values.yaml (2)

11-11: Consider moving the runner image to an organization-owned registry.

The image quay.io/rh_ee_brcox/arc-runner is hosted under a personal Quay account. For a production CI setup in the openshift/hypershift repository, consider hosting the image under an organization-owned registry (e.g., quay.io/openshift or quay.io/hypershift) to ensure long-term availability and access control.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hack/github-actions-runner/values.yaml` at line 11, The Helm values file
references a runner image under a personal Quay account (the image string
"quay.io/rh_ee_brcox/arc-runner@sha256:3e94ec8a185ff7e30e7947d02eb6b21ef1543e44e8f6f95b6335d0ea6a905e31");
update this to an organization-owned registry image (for example
"quay.io/openshift/arc-runner:sha256-..." or
"quay.io/hypershift/arc-runner:..."), push the image to the chosen org registry,
and replace the image value in values.yaml to point to that organization-owned
image so the repo uses a stable, org-managed image.

7-19: Security context is missing from the pod spec.

The README documents security hardening (non-root user, dropped capabilities, seccomp profile), but these settings are not defined in this values file. If these are expected to be applied via OpenShift's SCCs, consider documenting this explicitly or adding them here for portability.

Example security context addition
template:
  spec:
    securityContext:
      runAsNonRoot: true
      seccompProfile:
        type: RuntimeDefault
    containers:
      - name: runner
        image: quay.io/rh_ee_brcox/arc-runner@sha256:3e94ec8a185ff7e30e7947d02eb6b21ef1543e44e8f6f95b6335d0ea6a905e31
        command: ["/home/runner/run.sh"]
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
              - ALL
        resources:
          requests:
            cpu: "4"
            memory: "16Gi"
          limits:
            cpu: "4"
            memory: "16Gi"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hack/github-actions-runner/values.yaml` around lines 7 - 19, Add the
recommended pod and container security context settings to the Helm values under
template.spec to match the README hardening: add template.spec.securityContext
with runAsNonRoot: true and seccompProfile.type: RuntimeDefault, and on the
runner container (the item with name: runner) add a securityContext that sets
allowPrivilegeEscalation: false and drops capabilities (capabilities.drop:
[ALL]); alternatively document that these are intentionally left to OpenShift
SCCs if you want to keep them out of values.yaml.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@hack/github-actions-runner/values.yaml`:
- Line 11: The Helm values file references a runner image under a personal Quay
account (the image string
"quay.io/rh_ee_brcox/arc-runner@sha256:3e94ec8a185ff7e30e7947d02eb6b21ef1543e44e8f6f95b6335d0ea6a905e31");
update this to an organization-owned registry image (for example
"quay.io/openshift/arc-runner:sha256-..." or
"quay.io/hypershift/arc-runner:..."), push the image to the chosen org registry,
and replace the image value in values.yaml to point to that organization-owned
image so the repo uses a stable, org-managed image.
- Around line 7-19: Add the recommended pod and container security context
settings to the Helm values under template.spec to match the README hardening:
add template.spec.securityContext with runAsNonRoot: true and
seccompProfile.type: RuntimeDefault, and on the runner container (the item with
name: runner) add a securityContext that sets allowPrivilegeEscalation: false
and drops capabilities (capabilities.drop: [ALL]); alternatively document that
these are intentionally left to OpenShift SCCs if you want to keep them out of
values.yaml.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 8895532a-85fe-4ccf-a2fb-aae67367ba0a

📥 Commits

Reviewing files that changed from the base of the PR and between 1a33200 and 95fbad5.

📒 Files selected for processing (5)
  • .github/workflows/ci.yaml
  • Dockerfile.github-actions-runner
  • Makefile
  • hack/github-actions-runner/README.md
  • hack/github-actions-runner/values.yaml

@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint and cpo-container-sync out of make verify into separate GitHub Actions workflow jobs for faster, parallelized PR CI feedback.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add GitHub Actions CI workflow (.github/workflows/ci.yaml) with lint and cpo-container-sync as separate parallel jobs
  • Remove lint and cpo-container-sync from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, prerequisites, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners for clean environments and security
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, vet, verify-codespell, and run-gitlint

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Summary by CodeRabbit

  • New Features

  • Added self-hosted GitHub Actions runner infrastructure with pre-configured build tools and development environments.

  • Added CI/CD workflows for automated code quality checks (codespell, gitlint, lint).

  • Documentation

  • Added comprehensive setup and operation guide for GitHub Actions runner deployment.

  • Chores

  • Updated build verification process with enhanced file tracking validation.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Copy Markdown
Contributor

@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.

🧹 Nitpick comments (1)
Dockerfile.github-actions-runner (1)

19-19: Consider pinning the OpenShift client version for reproducibility.

The stable URL is mutable and may introduce unexpected changes. For a reproducible runner image (matching the digest-pinning approach used for the base image), consider using a versioned URL.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dockerfile.github-actions-runner` at line 19, The RUN line that fetches the
OpenShift client uses the mutable "stable" path ("RUN curl -fsSL
\"https://mirror.openshift.com/.../stable/openshift-client-linux.tar.gz\" | tar
-C /usr/local/bin -xz oc kubectl"); change this to a versioned URL (replace
"stable" with a specific release like "vX.Y.Z" or the exact release directory)
and, if possible, pin by digest or verify a published checksum before extracting
to ensure reproducible builds; update the RUN invocation to download the
specific release tarball and verify its checksum (or use a digested URL) prior
to tar -C /usr/local/bin -xz oc kubectl.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@Dockerfile.github-actions-runner`:
- Line 19: The RUN line that fetches the OpenShift client uses the mutable
"stable" path ("RUN curl -fsSL
\"https://mirror.openshift.com/.../stable/openshift-client-linux.tar.gz\" | tar
-C /usr/local/bin -xz oc kubectl"); change this to a versioned URL (replace
"stable" with a specific release like "vX.Y.Z" or the exact release directory)
and, if possible, pin by digest or verify a published checksum before extracting
to ensure reproducible builds; update the RUN invocation to download the
specific release tarball and verify its checksum (or use a digested URL) prior
to tar -C /usr/local/bin -xz oc kubectl.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 28fcb2cf-cd17-4855-b0b8-96bb4fc653bd

📥 Commits

Reviewing files that changed from the base of the PR and between 95fbad5 and 013489c.

📒 Files selected for processing (8)
  • .github/workflows/codespell.yaml
  • .github/workflows/cpo-container-sync.yaml
  • .github/workflows/gitlint.yaml
  • .github/workflows/lint.yaml
  • Dockerfile.github-actions-runner
  • Makefile
  • hack/github-actions-runner/README.md
  • hack/github-actions-runner/values.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • hack/github-actions-runner/values.yaml

@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint, cpo-container-sync, verify-codespell, and run-gitlint out of make verify into separate GitHub Actions workflow files for faster, parallelized PR CI feedback with independent performance tracking per check.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, python3-pip, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add 4 separate GitHub Actions workflow files in .github/workflows/:
  • lint.yaml — golangci-lint (60 min timeout)
  • cpo-container-sync.yaml — CPO container file sync check (10 min timeout)
  • codespell.yaml — spelling verification (10 min timeout)
  • gitlint.yaml — commit message linting (10 min timeout)
  • Remove lint, cpo-container-sync, verify-codespell, and run-gitlint from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, architecture diagrams, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners — one per job, clean environment every time
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization
  • Separate workflow files per check for independent GitHub Actions performance metrics
  • Job timeouts to prevent runaway processes (60 min lint, 10 min others)
  • Topology spread to distribute runners evenly across nodes
  • Outbound-only connectivity — cluster never needs inbound access from GitHub

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, and vet
  • Runners are scoped to openshift/hypershift only — other repos in the org are unaffected

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint, cpo-container-sync, verify-codespell, and run-gitlint out of make verify into separate GitHub Actions workflow files for faster, parallelized PR CI feedback with independent performance tracking per check.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, python3-pip, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add 4 separate GitHub Actions workflow files in .github/workflows/:
  • lint.yaml — golangci-lint (60 min timeout)
  • cpo-container-sync.yaml — CPO container file sync check (10 min timeout)
  • codespell.yaml — spelling verification (10 min timeout)
  • gitlint.yaml — commit message linting (10 min timeout)
  • Remove lint, cpo-container-sync, verify-codespell, and run-gitlint from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, architecture diagrams, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners — one per job, clean environment every time
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization
  • Separate workflow files per check for independent GitHub Actions performance metrics
  • Job timeouts to prevent runaway processes (60 min lint, 10 min others)
  • Topology spread to distribute runners evenly across nodes
  • Outbound-only connectivity — cluster never needs inbound access from GitHub

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, and vet
  • Runners are scoped to openshift/hypershift only — other repos in the org are unaffected

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Summary by CodeRabbit

  • Improvements

  • Enhanced CI/CD pipeline with new automated quality checks (spell checking, linting, commit validation, and container synchronization)

  • Documentation

  • Added comprehensive guide for self-hosted GitHub Actions runner deployment, architecture, and operational procedures

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Copy Markdown
Contributor

@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: 1

🧹 Nitpick comments (1)
Dockerfile.control-plane (1)

4-4: Remove hardcoded BREAK_SYNC=true from the control-plane image build path.

Setting this globally in the builder stage makes all builds run with non-default behavior and reduces reproducibility/maintainability. If this is CI-only, pass it as a build arg in the specific workflow instead of baking it into the Dockerfile.

Suggested change
-WORKDIR /hypershift
-ENV BREAK_SYNC=true
+WORKDIR /hypershift

As per coding guidelines, "Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dockerfile.control-plane` at line 4, Remove the hardcoded ENV BREAK_SYNC=true
from the control-plane Dockerfile builder stage and instead accept it as a
build-time variable (use an ARG named BREAK_SYNC or rely on CI build-args) so
the image build is reproducible and the non-default behavior is not baked into
the image; update the Dockerfile to use ARG BREAK_SYNC with a sensible default
(or no default) and update CI/workflow to pass --build-arg BREAK_SYNC when
needed, ensuring any references to BREAK_SYNC in the Dockerfile refer to the ARG
rather than a fixed ENV.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@main.go`:
- Around line 42-43: Remove the temporary dead-code block: delete the
typo-filled comment ("This is a teh temporaray fucntion...") and the unused
global variable named unusedVariable so the entrypoint no longer contains unused
globals that fail golangci-lint/Codespell; ensure no other references to
unusedVariable remain (search for "unusedVariable") and run linters to confirm
the CI issue is resolved.

---

Nitpick comments:
In `@Dockerfile.control-plane`:
- Line 4: Remove the hardcoded ENV BREAK_SYNC=true from the control-plane
Dockerfile builder stage and instead accept it as a build-time variable (use an
ARG named BREAK_SYNC or rely on CI build-args) so the image build is
reproducible and the non-default behavior is not baked into the image; update
the Dockerfile to use ARG BREAK_SYNC with a sensible default (or no default) and
update CI/workflow to pass --build-arg BREAK_SYNC when needed, ensuring any
references to BREAK_SYNC in the Dockerfile refer to the ARG rather than a fixed
ENV.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: e09eb09a-def1-4c9d-ad54-cc379f89fe07

📥 Commits

Reviewing files that changed from the base of the PR and between 013489c and d71d578.

📒 Files selected for processing (6)
  • .github/workflows/codespell.yaml
  • .github/workflows/cpo-container-sync.yaml
  • .github/workflows/gitlint.yaml
  • .github/workflows/lint.yaml
  • Dockerfile.control-plane
  • main.go

Comment thread main.go Outdated
@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint, cpo-container-sync, verify-codespell, and run-gitlint out of make verify into separate GitHub Actions workflow files for faster, parallelized PR CI feedback with independent performance tracking per check.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, python3-pip, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add 4 separate GitHub Actions workflow files in .github/workflows/:
  • lint.yaml — golangci-lint (60 min timeout)
  • cpo-container-sync.yaml — CPO container file sync check (10 min timeout)
  • codespell.yaml — spelling verification (10 min timeout)
  • gitlint.yaml — commit message linting (10 min timeout)
  • Remove lint, cpo-container-sync, verify-codespell, and run-gitlint from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, architecture diagrams, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners — one per job, clean environment every time
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization
  • Separate workflow files per check for independent GitHub Actions performance metrics
  • Job timeouts to prevent runaway processes (60 min lint, 10 min others)
  • Topology spread to distribute runners evenly across nodes
  • Outbound-only connectivity — cluster never needs inbound access from GitHub

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, and vet
  • Runners are scoped to openshift/hypershift only — other repos in the org are unaffected

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Summary by CodeRabbit

  • New Features

  • Adds support for building and running a specialized self-hosted CI runner image and accompanying Helm configuration.

  • Improvements

  • Reworked lint tooling and verification flow with prebuilt vs. build-from-source paths and stricter version checks.

  • Added several CI workflows for spellcheck, linting, gitlint, and container sync.

  • Documentation

  • New comprehensive guide for deploying and operating self-hosted CI runners.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Copy Markdown
Contributor

@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: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Dockerfile.github-actions-runner`:
- Around line 17-19: Replace the mutable downloads with pinned versions and
verify SHA256 checksums before extracting: stop streaming archives directly into
tar for both the Go download (using the GO_VERSION variable referenced in the
RUN that fetches go${GO_VERSION}.linux-arm64.tar.gz) and the OpenShift client
download (replace the "stable" path and the tarball URL used in the RUN that
extracts oc and kubectl with a specific OC_VERSION), download the corresponding
.sha256 (or .sha256sum) files, validate them with sha256sum -c (or compute and
compare the checksum), and only then extract the verified archive to /usr/local
or /usr/local/bin; ensure failure on checksum mismatch so the build aborts.

In `@Makefile`:
- Around line 85-98: The detection logic treats any golangci-lint in PATH as a
CI prebuilt even when the kube-api-linter plugin or version marker is missing;
update the conditional around PREBUILT_GOLANGCI to require that
PREBUILT_KUBEAPILINTER exists and IMAGE_VERSION_FILE exists (and optionally
matches expected contents) before setting GOLANGCI_LINT and KUBEAPILINTER_PLUGIN
to the prebuilt paths, otherwise fall back to the local-dev build paths
(GOLANGCI_LINT := $(abspath $(TOOLS_BIN_DIR)/golangci-lint) and
KUBEAPILINTER_PLUGIN := $(abspath $(TOOLS_BIN_DIR)/kube-api-linter.so)); apply
the same stricter checks to the analogous block that currently appears around
lines 109-118 so CI won't silently skip validation when the version file or
plugin is missing.
- Around line 96-104: The Makefile uses absolute targets GOLANGCI_LINT and
KUBEAPILINTER_PLUGIN but the build rules change directory to $(TOOLS_DIR) and
write $@ which resolves relative to the original cwd, causing mismatched paths;
update the build recipes for the targets $(TOOLS_BIN_DIR)/golangci-lint and
$(TOOLS_BIN_DIR)/kube-api-linter.so (and the similar rules at the other
occurrences) to produce the desired absolute output: either remove the cd and
run $(GO) build -o $@ from the repo root using package import paths, or keep cd
$(TOOLS_DIR) but set -o to an absolute path like -o $(abspath $@) (or
$(CURDIR)/$@) so the binary/plugin is written into $(TOOLS_BIN_DIR) as expected;
ensure both rules reference the same variable names GOLANGCI_LINT and
KUBEAPILINTER_PLUGIN so dependency names and rule targets match.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 5334088e-3fd5-4a52-b431-4644aa3c0496

📥 Commits

Reviewing files that changed from the base of the PR and between d71d578 and 502e5c3.

📒 Files selected for processing (2)
  • Dockerfile.github-actions-runner
  • Makefile

Comment on lines +17 to +19
RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-arm64.tar.gz" | tar -C /usr/local -xz

RUN curl -fsSL "https://mirror.openshift.com/pub/openshift-v4/aarch64/clients/ocp/stable/openshift-client-linux.tar.gz" | tar -C /usr/local/bin -xz oc kubectl
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Verify mutable channel and missing checksum validation patterns in the Dockerfile
rg -n 'openshift-v4/aarch64/clients/ocp/stable/openshift-client-linux.tar.gz|go.dev/dl/go\$\{GO_VERSION\}.linux-arm64.tar.gz' Dockerfile.github-actions-runner
rg -n 'sha256sum -c|SHA256|_SHA256' Dockerfile.github-actions-runner || true

Repository: openshift/hypershift

Length of output: 322


Pin package versions and add checksum verification for supply-chain integrity.

Line 19 downloads from a mutable stable URL, and both line 17 and line 19 stream archives directly to tar without checksum validation. This causes nondeterministic builds and creates supply-chain risk for the runner image.

Replace the mutable stable channel with a specific version, and verify all downloads with SHA256 checksums:

Proposed fix
 ARG GO_VERSION=1.25.3
-RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-arm64.tar.gz" | tar -C /usr/local -xz
+ARG GO_SHA256=<pin-go-tarball-sha256>
+RUN curl -fsSLo /tmp/go.tgz "https://go.dev/dl/go${GO_VERSION}.linux-arm64.tar.gz" && \
+    echo "${GO_SHA256}  /tmp/go.tgz" | sha256sum -c - && \
+    tar -C /usr/local -xzf /tmp/go.tgz && \
+    rm -f /tmp/go.tgz

-RUN curl -fsSL "https://mirror.openshift.com/pub/openshift-v4/aarch64/clients/ocp/stable/openshift-client-linux.tar.gz" | tar -C /usr/local/bin -xz oc kubectl
+ARG OCP_CLIENT_VERSION=<pin-ocp-version>
+ARG OCP_CLIENT_SHA256=<pin-oc-tarball-sha256>
+RUN curl -fsSLo /tmp/oc.tgz "https://mirror.openshift.com/pub/openshift-v4/aarch64/clients/ocp/${OCP_CLIENT_VERSION}/openshift-client-linux.tar.gz" && \
+    echo "${OCP_CLIENT_SHA256}  /tmp/oc.tgz" | sha256sum -c - && \
+    tar -C /usr/local/bin -xzf /tmp/oc.tgz oc kubectl && \
+    rm -f /tmp/oc.tgz
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dockerfile.github-actions-runner` around lines 17 - 19, Replace the mutable
downloads with pinned versions and verify SHA256 checksums before extracting:
stop streaming archives directly into tar for both the Go download (using the
GO_VERSION variable referenced in the RUN that fetches
go${GO_VERSION}.linux-arm64.tar.gz) and the OpenShift client download (replace
the "stable" path and the tarball URL used in the RUN that extracts oc and
kubectl with a specific OC_VERSION), download the corresponding .sha256 (or
.sha256sum) files, validate them with sha256sum -c (or compute and compare the
checksum), and only then extract the verified archive to /usr/local or
/usr/local/bin; ensure failure on checksum mismatch so the build aborts.

Comment thread Makefile Outdated
Comment thread Makefile Outdated
@openshift-ci-robot
Copy link
Copy Markdown

openshift-ci-robot commented Mar 17, 2026

@bryan-cox: This pull request references CNTRLPLANE-2986 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

Provisions and configures self-hosted ARM64 GitHub Actions runners on a HyperShift hosted cluster using Actions Runner Controller (ARC). This moves lint, cpo-container-sync, verify-codespell, and run-gitlint out of make verify into separate GitHub Actions workflow files for faster, parallelized PR CI feedback with independent performance tracking per check.

Changes:

  • Add custom runner Dockerfile (Dockerfile.github-actions-runner) with Go 1.25.3, make, gcc, libc6-dev, python3-pip, and oc CLI for ARM64
  • Add ARC RunnerScaleSet Helm values (hack/github-actions-runner/values.yaml) with 4 CPU / 16GB resource limits, topology spread constraints, and auto-scaling (1-70 runners)
  • Add 4 separate GitHub Actions workflow files in .github/workflows/:
  • lint.yaml — golangci-lint (60 min timeout)
  • cpo-container-sync.yaml — CPO container file sync check (10 min timeout)
  • codespell.yaml — spelling verification (10 min timeout)
  • gitlint.yaml — commit message linting (10 min timeout)
  • Remove lint, cpo-container-sync, verify-codespell, and run-gitlint from Makefile verify target (now handled by GitHub Actions)
  • Add comprehensive setup documentation (hack/github-actions-runner/README.md) covering all design decisions, architecture diagrams, and step-by-step provisioning instructions

Design Decisions:

  • ARM64 architecture to match target CI workload
  • Ephemeral runners — one per job, clean environment every time
  • Image pinned by digest (not :latest) for reproducibility
  • 4 CPU / 16GB per runner matching GitHub standard hosted runner specs
  • c6g.8xlarge nodes (compute-optimized ARM) for cost-effective Go builds
  • GitHub App authentication (credentials stored in Vault under github-actions-runners)
  • Prometheus monitoring via ServiceMonitor for runner health, queue depth, and utilization
  • Separate workflow files per check for independent GitHub Actions performance metrics
  • Job timeouts to prevent runaway processes (60 min lint, 10 min others)
  • Topology spread to distribute runners evenly across nodes
  • Outbound-only connectivity — cluster never needs inbound access from GitHub

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-2986

Special notes for your reviewer:

  • The runner infrastructure (ARC controller, secrets, monitoring) is deployed on the hosted cluster and is not part of this PR — only the reproducible configuration files are committed
  • Sensitive credentials (GitHub App ID, Installation ID, private key) are stored in Vault, not in the repo
  • The make verify target still includes generate, update, staticcheck, fmt, and vet
  • Runners are scoped to openshift/hypershift only — other repos in the org are unaffected

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

Summary by CodeRabbit

  • New Features

  • Added GitHub Actions workflows for code quality checks: spell-checking, code linting, and commit message linting.

  • Chores

  • Introduced self-hosted GitHub Actions runner infrastructure with Dockerfile and Helm configuration.

  • Added comprehensive documentation for runner setup and deployment.

  • Updated build configuration to support CI-aware tool detection and version verification.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Copy Markdown
Contributor

@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.

♻️ Duplicate comments (1)
Makefile (1)

97-110: ⚠️ Potential issue | 🟠 Major

Absolute prerequisites don’t match declared build targets, which can break make lint bootstrapping

Line 97/98/102/103 set absolute prerequisite paths, but Line 106 and Line 109 declare relative targets. On a clean tree, Make may fail with “No rule to make target …” for local lint dependencies.

Proposed fix
-$(TOOLS_BIN_DIR)/golangci-lint: $(TOOLS_DIR)/go.mod
+$(abspath $(TOOLS_BIN_DIR)/golangci-lint): $(TOOLS_DIR)/go.mod
 	cd $(TOOLS_DIR); $(GO) build -tags=tools -o $(BIN_DIR)/golangci-lint github.com/golangci/golangci-lint/v2/cmd/golangci-lint

-$(TOOLS_BIN_DIR)/kube-api-linter.so: $(TOOLS_DIR)/go.mod
+$(abspath $(TOOLS_BIN_DIR)/kube-api-linter.so): $(TOOLS_DIR)/go.mod
 	cd $(TOOLS_DIR); CGO_ENABLED=1 $(GO) build -buildmode=plugin -o $(BIN_DIR)/kube-api-linter.so sigs.k8s.io/kube-api-linter/pkg/plugin
#!/bin/bash
set -euo pipefail

echo "Checking absolute local assignments used as lint prerequisites:"
rg -n -C1 'GOLANGCI_LINT := \$\(abspath \$\(TOOLS_BIN_DIR\)/golangci-lint\)|KUBEAPILINTER_PLUGIN := \$\(abspath \$\(TOOLS_BIN_DIR\)/kube-api-linter\.so\)' Makefile

echo
echo "Checking declared build rule targets:"
rg -n -C1 '^\$\(TOOLS_BIN_DIR\)/(golangci-lint|kube-api-linter\.so):' Makefile

echo
echo "If both blocks are present, prerequisite names and target names differ (absolute vs relative), which can prevent rule resolution when files are missing."

As per coding guidelines, "-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Makefile` around lines 97 - 110, The Makefile sets GOLANGCI_LINT and
KUBEAPILINTER_PLUGIN using $(abspath $(TOOLS_BIN_DIR)/...) while the
corresponding build rules declare targets as $(TOOLS_BIN_DIR)/golangci-lint and
$(TOOLS_BIN_DIR)/kube-api-linter.so, so Make can't match prerequisites to
targets; fix by making the variable assignments and rule targets use the same
canonical names — either remove abspath when setting GOLANGCI_LINT and
KUBEAPILINTER_PLUGIN or change the rule targets to the abspath form so that the
variables GOLANGCI_LINT and KUBEAPILINTER_PLUGIN exactly match the targets
referenced by the build rules for $(TOOLS_BIN_DIR)/golangci-lint and
$(TOOLS_BIN_DIR)/kube-api-linter.so.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@Makefile`:
- Around line 97-110: The Makefile sets GOLANGCI_LINT and KUBEAPILINTER_PLUGIN
using $(abspath $(TOOLS_BIN_DIR)/...) while the corresponding build rules
declare targets as $(TOOLS_BIN_DIR)/golangci-lint and
$(TOOLS_BIN_DIR)/kube-api-linter.so, so Make can't match prerequisites to
targets; fix by making the variable assignments and rule targets use the same
canonical names — either remove abspath when setting GOLANGCI_LINT and
KUBEAPILINTER_PLUGIN or change the rule targets to the abspath form so that the
variables GOLANGCI_LINT and KUBEAPILINTER_PLUGIN exactly match the targets
referenced by the build rules for $(TOOLS_BIN_DIR)/golangci-lint and
$(TOOLS_BIN_DIR)/kube-api-linter.so.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: b0604676-bdbe-432d-aa89-b973a59f22bd

📥 Commits

Reviewing files that changed from the base of the PR and between 502e5c3 and 8b68328.

📒 Files selected for processing (2)
  • Makefile
  • hack/github-actions-runner/values.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • hack/github-actions-runner/values.yaml

@bryan-cox bryan-cox changed the title CNTRLPLANE-2986: Add self-hosted GitHub Actions runners feat(install): Add --external-dns-txt-suffix flag Mar 17, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-v2-aws

Details

In response to this:

/override "ci/prow/e2e-v2-aws"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-v2-aws

Details

In response to this:

/override "ci/prow/e2e-v2-aws"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "ci/prow/e2e-aks-cilium"

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main"

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main"

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aks-cilium

Details

In response to this:

/override "ci/prow/e2e-aks-cilium"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-cilium
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/unit
  • ci/prow/verify
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-cilium
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-unit
  • pull-ci-openshift-hypershift-main-verify
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-cilium
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/unit
  • ci/prow/verify
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-cilium
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-unit
  • pull-ci-openshift-hypershift-main-verify
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox
Copy link
Copy Markdown
Member Author

/verified bypass

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Mar 23, 2026
@openshift-ci-robot
Copy link
Copy Markdown

@bryan-cox: The verified label has been added.

Details

In response to this:

/verified bypass

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "ci/prow/e2e-azure-self-managed"

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-azure-self-managed

Details

In response to this:

/override "ci/prow/e2e-azure-self-managed"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "ci/prow/e2e-aks"

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main"

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main"

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aks

Details

In response to this:

/override "ci/prow/e2e-aks"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-cilium
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/unit
  • ci/prow/verify
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-cilium
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-unit
  • pull-ci-openshift-hypershift-main-verify
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-cilium
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/unit
  • ci/prow/verify
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-cilium
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-unit
  • pull-ci-openshift-hypershift-main-verify
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "ci/prow/e2e-azure-self-managed"

@bryan-cox
Copy link
Copy Markdown
Member Author

/override "ci/prow/okd-scos-images"

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-azure-self-managed

Details

In response to this:

/override "ci/prow/e2e-azure-self-managed"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/okd-scos-images

Details

In response to this:

/override "ci/prow/okd-scos-images"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-merge-bot openshift-merge-bot Bot merged commit e4c50a5 into openshift:main Mar 23, 2026
26 of 28 checks passed
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Mar 23, 2026

@bryan-cox: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@bryan-cox bryan-cox deleted the CNTRLPLANE-2986 branch March 23, 2026 18:00
openshift-merge-bot Bot pushed a commit to openshift/release that referenced this pull request Mar 24, 2026
Switch the HyperShift Prow verify job from `make verify` to
`make verify-ci`. The verify-ci target excludes lint, codespell,
gitlint, and cpo-container-sync checks which now run in GitHub
Actions workflows, avoiding duplicate CI work.

The full `make verify` target remains unchanged for local
development use.

Related: openshift/hypershift#7980

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
SeanZhao-redhat pushed a commit to SeanZhao-redhat/openshift-release that referenced this pull request Mar 24, 2026
Switch the HyperShift Prow verify job from `make verify` to
`make verify-ci`. The verify-ci target excludes lint, codespell,
gitlint, and cpo-container-sync checks which now run in GitHub
Actions workflows, avoiding duplicate CI work.

The full `make verify` target remains unchanged for local
development use.

Related: openshift/hypershift#7980

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/api Indicates the PR includes changes for the API area/ci-tooling Indicates the PR includes changes for CI or tooling area/cli Indicates the PR includes changes for CLI jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants