Skip to content

Relocate chart-publish pipeline off gh-pages, wire in PR-gated test automation - #105

Open
kk640244 wants to merge 6 commits into
mainfrom
kk640244-jenkins-build-out
Open

kk640244 wants to merge 6 commits into
mainfrom
kk640244-jenkins-build-out

Conversation

@kk640244

@kk640244 kk640244 commented Sep 9, 2026

Copy link
Copy Markdown

Context

Part of the CAAPIM -> Broadcom / GitHub Actions -> Jenkins CI migration.
GitHub Actions and GitHub Pages won't be supported once this repo moves to
the broadcom org, so this is the layer7-operator half of building out an
equivalent Jenkins-based pipeline before that org move happens - the
transfer itself is the last step of the overall migration, done once
everything here is proven.

This PR is untested against a live Jenkins run. It's ready for review
on content/approach, but the Jenkins job config changes listed at the
bottom still need doing before any of this actually executes for real.

What changed and why

Relocate the chart-publish pipeline off gh-pages. Jenkinsfile +
push_helm_charts.py (the pipeline behind the existing
helm-github-to-release-operator job) only existed on the gh-pages
branch. gh-pages is scheduled for removal later in this migration, so
these needed a permanent home first - relocated here as Jenkinsfile-charts

  • push_helm_charts.py at the repo root.

Wire the existing test-automation harness into PR builds. Added a Test Automation stage to the root Jenkinsfile that calls the already-working
L7Operator/Components/L7Operator Test Automation/develop Jenkins job on
every PR (passing the PR's actual branch as OPERATOR_REF), and gates the
PR's merge status on its result - reusing the existing
pullRequest.createStatus post-block, no new plumbing. Runs PR-only (not
every branch push) since a full run takes ~15min and spins up a kind
cluster. Left an explicit note in the stage: it currently passes
OPERATOR_REF only, so the harness rebuilds the operator image from source
independently rather than consuming the image this same pipeline's Build and Push Image stage just built - a known, deliberately deferred gap
(USE_UPSTREAM_BUILD, already tracked in that harness's own PLAN.md).

Make chart publishing self-sufficient and idempotent.
push_helm_charts.py used to download an already-built chart tarball from
a GitHub Release; GH Releases-for-charts is going away as part of this
migration (chart distribution is moving to an Artifactory OCI registry), so
it now packages the chart directly from the workspace
(helm package charts/layer7-operator). Also made Jenkinsfile-charts
branch-aware: PR branches publish to Artifactory's dev-local repo only (usw1
Artifactory blocks promoting dev-local any further, so there's nothing more
to do for a PR build); main publishes to release-local, which a separate,
not-yet-built promotion job will later push on to the public distribution
point. Added gating (ct list-changed short-circuit for PRs + an
Artifactory version-existence check for both paths) to replace the
idempotency the old GH-Actions chart-releaser tool used to provide, so
this won't try to republish an already-published version.

Explicitly not included here

  • The release-local -> public-distribution promotion job lives in
    portal-devops-util (separate repo), not here.
  • Automating the operator's tag-triggered release (bundle.yaml/
    cw-bundle.yaml) - see Automate operator release (bundle.yaml/cw-bundle.yaml) on tag builds #106.
  • Chart/customer-facing documentation updates.
  • Any Go module path rename - explicitly deferred to a separate PR after
    the eventual org transfer, not part of this migration's critical path.

Jenkins job config changes needed before this takes effect (not repo changes)

  • helm-github-to-release-operator: repoint from branch gh-pages (file
    Jenkinsfile) to branch main (file Jenkinsfile-charts) once this
    merges, and convert it from a standalone job to a multibranch job so
    env.CHANGE_ID/env.BRANCH_NAME are actually populated for the new
    branch-aware dev-local/release-local logic.
  • Build L7Operator: add a real GitHub webhook PR trigger for
    develop/main (it currently only builds via daily cron/branch-indexing,
    so the new Test Automation stage won't fire live on PRs until this is
    done).

kk640244 and others added 6 commits September 8, 2026 14:32
gh-pages is being retired as part of the CAAPIM->Broadcom / GH Actions->
Jenkins migration. The chart-publish pipeline (push charts to Artifactory
as OCI artifacts) currently lives only on the gh-pages branch, so it needs
a permanent home before that branch is deleted.

Pure relocation, byte-identical to origin/gh-pages:Jenkinsfile and
origin/gh-pages:push_helm_charts.py - no logic changes yet. Adapting this
to build the chart from the workspace instead of downloading a GitHub
Release asset is a separate, later step.

Still needed (outside this repo, not part of this commit):
- Re-point the internal Jenkins job that currently reads Jenkinsfile from
  gh-pages to read Jenkinsfile-charts from this branch instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wires the existing, already-working layer7-operator-test-automation
pipeline (job L7Operator/Components/L7Operator Test Automation/develop)
into PR builds, gating merge status on its result.

- Runs only on PR builds (env.CHANGE_ID) - a full regression run takes
  ~15min and spins up a kind cluster, not worth it on every branch push.
- Passes OPERATOR_REF=env.CHANGE_BRANCH so the harness tests the PR's
  actual proposed source, not just whatever main/develop already is.
- No separate chart-lint stage added here: layer7-operator-test-automation's
  own "Lint & scan" stage already runs `ct lint` (blocking when charts
  changed) plus warn-only golangci-lint/govulncheck - confirmed via a real
  console log (job Operator_Test_Automation_develop, 2026-08-27 run,
  passed=226 failed=0). Adding another lint stage here would duplicate it.
- Relies on `build job:`'s default propagate:true: if the downstream run
  doesn't succeed, this stage throws and this build fails too, which the
  existing post{failure{pullRequest.createStatus(...)}} block already
  reports back to GitHub - no new status-reporting mechanism needed.
- Left an explicit NOTE in the stage: this passes OPERATOR_REF only, so
  the harness rebuilds the operator image from source independently
  rather than consuming the image the "Build and Push Image" stage above
  just pushed. layer7-operator-test-automation's own PLAN.md already
  tracks that gap as a planned, opt-in USE_UPSTREAM_BUILD mode (default
  off) - revisit this call once that lands, to avoid the double build.

Still needed (Jenkins job config, not a repo commit - tracked in the
migration plan): add a real GitHub-webhook PR trigger to the Build
L7Operator multibranch job for develop/main, since it currently only
builds on branch-indexing/daily cron rather than firing live on PRs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… (Phase 2b)

push_helm_charts.py no longer downloads a pre-built chart tarball from a
GitHub Release (that source disappears once GH Actions/Releases are
removed) - it now `helm package`s charts/layer7-operator directly from
the checked-out workspace, then pushes the result as before. Dropped the
now-unneeded GitHub API download path (requests/ruamel.yaml, GITHUB_TOKEN)
entirely, and the --index argument that went with it. Also fixed a
pre-existing bug: the old script called sys.exit(...) without importing
sys.

Jenkinsfile-charts is now branch-aware instead of hardcoding --release:
- PR branches -> dev-local only (usw1 Artifactory already blocks
  promoting dev-local to layer7.packages.broadcom.com, so there's nothing
  further to do for a PR build).
- main -> release-local (a separate, not-yet-built workflow will later
  promote this to layer7.packages.broadcom.com - Phase 2c).
- any other branch -> skipped.
Also dropped the GITHUB_CREDS/GITHUB_TOKEN env and the
`pip3 install requests ruamel.yaml` step, both unused now.

Still needed (Jenkins job config, not a repo commit - tracked in the
migration plan): convert helm-github-to-release-operator from a
standalone job into a multibranch job, so env.CHANGE_ID/BRANCH_NAME are
actually populated per PR/branch the way this script now expects.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…follow-up)

chart-releaser-action (the old GH Actions flow) only ever created a new
GitHub Release - and thus only ever gave the gh-pages job something new
to publish - when Chart.yaml's version had actually changed since the
last release. The Jenkinsfile-charts rewrite in the previous commit lost
that: it would unconditionally `helm package` + `helm push` on every
run, regardless of whether the chart changed at all, risking a failed or
duplicate push of an already-published version.

push_helm_charts.py now gates on two checks:
- --check-changed TARGET_BRANCH (optional): a cheap `ct list-changed`
  short-circuit for PR builds, skipping entirely if the chart directory
  isn't in the changed list vs TARGET_BRANCH. Deliberately NOT used for
  the release path - `ct list-changed --target-branch main` run while
  already on main always reports no changes, so it would be actively
  wrong there.
- version_exists(): before packaging, checks whether the chart's current
  Chart.yaml version already exists in the target Artifactory OCI repo
  (`helm pull ... --version <version>`) and skips if so. This is the
  closer equivalent of chart-releaser's own "don't recreate an existing
  release" behavior, and applies to both the PR and release paths.

Also wrapped login-through-logout in try/finally so a failed push no
longer leaves the agent logged in (a latent issue in the original
script, which called docker logout sequentially after push with no
error handling).

Jenkinsfile-charts: PR builds now pass --check-changed main; main builds
rely solely on the version_exists() check (see above for why
--check-changed doesn't apply there).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Comments should describe the current system on its own terms, not
reference internal migration-plan phase labels or chart-releaser (the
GH-Actions-era tool this pipeline replaces, which won't exist by the
time anyone reads this comment again). That context belongs in commit
messages, not baked into the code.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kk640244 kk640244 changed the title CI migration (Phase 1-2b): relocate chart-publish pipeline off gh-pages, wire in PR-gated test automation Relocate chart-publish pipeline off gh-pages, wire in PR-gated test automation Sep 9, 2026
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