feat(ci): publish Argus app image and chart 0.1.1 - #13
Conversation
Chart 0.1.0 defaulted to an unpublished ghcr.io/opennsw/argus tag, which left installs in ImagePullBackOff. Build and push ghcr.io/lsflk/argus on main, then republish the chart so the default image is pullable. Co-authored-by: Cursor <cursoragent@cursor.com>
Drop the duplicate chart publisher, PR docker build, and unused Helm image helper. Stable chart 0.1.1 still goes out through the existing build-dev-chart dispatch. Co-authored-by: Cursor <cursoragent@cursor.com>
ea097e9 to
f507bc3
Compare
mushrafmim
left a comment
There was a problem hiding this comment.
PR Review & Feedback
Overall, the changes look solid and directly resolve the ImagePullBackOff issue by bumping the chart to 0.1.1 and pointing to ghcr.io/lsflk/argus:latest. Local verification (helm lint, helm template, docker build, unit tests) all pass cleanly.
A few recommendations and notes before merging:
1. ⚠️ Re-add PR Validation for Container Image
In commit ea097e9, pull_request trigger was removed from .github/workflows/build-image.yml.
- Issue: PRs touching Go code, dependencies, or
Dockerfilewon't verify whether the container image builds until after merging tomain. - Suggestion: Add back
pull_requestonmainwith paths for the code andDockerfile, and keep push conditional:And make registry login / push conditional on event type:on: push: branches: [ main ] paths: ... pull_request: branches: [ main ] paths: - 'Dockerfile' - 'go.mod' - 'go.sum' - 'cmd/**' - 'internal/**' - 'pkg/**' - 'configs/**' - '.github/workflows/build-image.yml' workflow_dispatch:
- name: Log in to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v3 ... - name: Build and push uses: docker/build-push-action@v6 with: push: ${{ github.event_name != 'pull_request' }}
2. ⚠️ Kubernetes Caching: pullPolicy: IfNotPresent with tag: latest
In deployments/helm/argus/values.yaml:
image:
repository: ghcr.io/lsflk/argus
tag: latest
pullPolicy: IfNotPresent- Issue: Because
latestis mutable, nodes that already have a cached copy oflatestwill not pull newly published images underIfNotPresent. - Suggestion: Consider defaulting
pullPolicy: Alwayswhentag: latest, or encourage pinning specific tags (e.g.<git-sha>or1.0.0) in production.
3. ℹ️ Helm Chart 0.1.1 Publishing Steps
With chart publishing kept separate from build-image.yml:
- Merging to
mainwill publish the image (:latestand:<sha>) and triggerbuild-dev-chart.yml(0.0.0-dev.<run_number>). - To publish the official
0.1.1chart tooci://ghcr.io/lsflk/charts/argus:0.1.1, remember to dispatchbuild-dev-chart.ymlwithversion: 0.1.1after the image push completes.
4. ℹ️ GHCR Package Visibility
- As noted in the test plan, please ensure an org admin sets the newly created
ghcr.io/lsflk/arguspackage visibility to Public under https://github.com/orgs/LSFLK/packages so it can be pulled without imagePullSecrets.
5. 💡 values-example.yaml Tag Consistency
In deployments/helm/values-example.yaml:
image:
repository: ghcr.io/lsflk/argus
tag: "1.0.0"build-image.ymlpublishes:latestand:<sha>. If users copyvalues-example.yamlas-is,1.0.0will fail to pull. Aligning this withlatestor documenting the placeholder would be helpful.
6. 💡 .dockerignore
Consider adding common IDE and env files to .dockerignore:
.idea
.vscode
*.env*
coverage.out
Rebuild the container on Dockerfile/Go PRs without pushing, force imagePullPolicy Always when the chart tag is latest, and align the example values with published tags. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Thanks @mushrafmim addressed |
💡 Suggestion: Standardize on
|
💡 Follow-up: Treat authentication strictly as an API Key (not a Bearer token)To follow up on the Since the secret is a static pre-shared API key rather than a dynamic/OAuth token, we should treat it as an API key across both code and docs:
|
Co-authored-by: Cursor <cursoragent@cursor.com>
|
@mushrafmim on the original review:
|
|
@mushrafmim on standardizing Resolved. Helm was injecting
|
|
@mushrafmim on treating auth as an API key (not a Bearer token): Resolved on the server and docs. The credential is a static pre-shared key, so naming and errors now say API key.
No action on the Go client send path. |
Hi, I don't think we need support for bearer tokens, since there's nobody is gonna issue that, and we have to perform signature validation. for now, I think, going with API_KEYs are enough, and later after getting the features working, we can add direct support for IDPs. Other than this, everything LGTM. |
Drop Authorization Bearer support. Request signing stays separate; IDP/Bearer can land later once the API key path is working. Co-authored-by: Cursor <cursoragent@cursor.com>
|
@mushrafmim on dropping Bearer: Resolved. Auth is |
Thanks for addressing. LGTM! |
Summary
ghcr.io/lsflk/argus(:latestand:<git sha>onmain).0.1.1so the default image isghcr.io/lsflk/argus:latestinstead of the unpublishedghcr.io/opennsw/argus:<sha>that caused ImagePullBackOff.main, republish the stable chart tooci://ghcr.io/lsflk/charts/argus:0.1.1.Test plan
ghcr.io/lsflk/argus:latestghcr.io/lsflk/argus:latestandghcr.io/lsflk/argus:<sha>exist on GHCRhelm pull oci://ghcr.io/lsflk/charts/argus --version 0.1.1succeedsarguspackage is private, set visibility to public under https://github.com/orgs/LSFLK/packages0.1.1(do not use0.1.0)