Author SHA1 Message Date
f.weber f5b19464ba chore: bump chart appVersion to 1.6.3-2 [skip ci] 2026-08-13 13:50:19 +00:00
f.weber 09400b7882 Update Dockerfile to include gpgv for enhanced security during package installation
CI / lint (push) Failing after 3s
CI / smoke-test (push) Failing after 13s
Release image / release (push) Successful in 22m40s
Release chart / release (release) Has been skipped
2026-08-13 15:33:28 +02:00
f.weber f345f469da Add ArtifactHub repository metadata and improve Helm chart configuration
CI / lint (push) Failing after 3s
Release chart / release (release) Successful in 9s
CI / smoke-test (push) Failing after 5s
- Introduced artifacthub-repo.yml for ownership verification on ArtifactHub.
- Updated release-chart.yaml to publish the ArtifactHub metadata as an OCI artifact.
- Bumped chart version to 0.2.2 and added relevant changes to Chart.yaml.
- Enhanced job-reconcile.yaml by adding a writable /tmp directory for the reconcile job.
2026-08-13 12:42:41 +02:00
f.weber a08ed898e8 Update Helm chart version and modify probes to use exec for readiness and liveness checks
CI / lint (push) Failing after 3s
CI / smoke-test (push) Failing after 5s
Release chart / release (release) Successful in 6s
2026-08-13 12:30:17 +02:00
6 changed files with 44 additions and 12 deletions
+20
View File
@@ -25,6 +25,10 @@ name: Release chart
# generic OCI artifacts, and a chart sharing the exact repository path with # generic OCI artifacts, and a chart sharing the exact repository path with
# the container image of the same name makes the package listing/type # the container image of the same name makes the package listing/type
# ambiguous. A distinct `charts/` path keeps the two package kinds apart. # ambiguous. A distinct `charts/` path keeps the two package kinds apart.
#
# Also pushes charts/aptly/artifacthub-repo.yml as a companion OCI artifact
# (tag `artifacthub.io`) on every run, proving ownership of this repository
# to ArtifactHub — see the "Publish ArtifactHub repository metadata" step.
on: on:
release: release:
types: [published] types: [published]
@@ -104,6 +108,22 @@ jobs:
--username "${{ secrets.REGISTRY_USER }}" --password-stdin --username "${{ secrets.REGISTRY_USER }}" --password-stdin
helm push "aptly-${{ steps.version.outputs.version }}.tgz" oci://git.morlana.online/f.weber/charts helm push "aptly-${{ steps.version.outputs.version }}.tgz" oci://git.morlana.online/f.weber/charts
# Publishes charts/aptly/artifacthub-repo.yml as its own OCI artifact
# (tag `artifacthub.io`) next to the chart — this is how ArtifactHub
# verifies ownership of an OCI-based Helm repository; there's no
# index.yaml it could otherwise crawl a metadata file out of. Uses the
# same registry credentials as the chart push above, nothing
# ArtifactHub-specific is needed (ArtifactHub has no publish API to
# authenticate against — it only reads the registry).
- uses: oras-project/setup-oras@v1
- name: Publish ArtifactHub repository metadata (ownership verification)
run: |
echo "${{ secrets.REGISTRY_TOKEN }}" | oras login git.morlana.online \
--username "${{ secrets.REGISTRY_USER }}" --password-stdin
oras push git.morlana.online/f.weber/charts/aptly:artifacthub.io \
--config /dev/null:application/vnd.cncf.artifacthub.config.v1+yaml \
charts/aptly/artifacthub-repo.yml:application/vnd.cncf.artifacthub.repository-metadata.layer.v1.yaml
- name: Attach chart artifacts to the Gitea release - name: Attach chart artifacts to the Gitea release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
+4 -8
View File
@@ -5,8 +5,8 @@ description: >-
an nginx read/auth sidecar, a fully aptly-native values API, and declarative an nginx read/auth sidecar, a fully aptly-native values API, and declarative
repo/mirror/publish state reconciled via a Helm hook. repo/mirror/publish state reconciled via a Helm hook.
type: application type: application
version: 0.2.0 version: 0.2.2
appVersion: "1.6.3-1" appVersion: "1.6.3-2"
home: https://git.morlana.online/f.weber/aptly-containerized home: https://git.morlana.online/f.weber/aptly-containerized
sources: sources:
- https://git.morlana.online/f.weber/aptly-containerized - https://git.morlana.online/f.weber/aptly-containerized
@@ -33,10 +33,6 @@ annotations:
url: https://git.morlana.online/f.weber/aptly-containerized/raw/branch/main/pubkeys/chart-signing.asc url: https://git.morlana.online/f.weber/aptly-containerized/raw/branch/main/pubkeys/chart-signing.asc
artifacthub.io/changes: | artifacthub.io/changes: |
- kind: added - kind: added
description: Configurable ServiceAccount (serviceAccount.create/name/annotations/automountServiceAccountToken), defaulting to a dedicated ServiceAccount per release. description: Repository ownership verification for ArtifactHub (charts/aptly/artifacthub-repo.yml), published as a companion OCI artifact by release-chart.yaml.
- kind: added
description: Configurable internal container ports (ports.aptly/nginx/metrics).
- kind: fixed - kind: fixed
description: nginx and aptly no longer both listen on port 8080 inside the same pod, which made nginx fail to start with "address already in use". nginx now defaults to 8081 internally; external service.port is unchanged. description: The reconcile Job's container had readOnlyRootFilesystem but no writable /tmp, so its own API client's scratch files failed to write ("Read-only file system") and every reconcile call died with a misleading "connection" error. A /tmp emptyDir is now mounted there too, matching the aptly/nginx containers in the StatefulSet.
- kind: changed
description: Chart releases are now triggered by publishing a Gitea Release (instead of a bare tag push), so pre-releases can be flagged for ArtifactHub.
+6
View File
@@ -0,0 +1,6 @@
repositoryID: "1ed468a7-7886-48ad-8835-369bc8a06bc5"
owners:
- name: Morlana
email: contact@morlana.net
- name: Florian Weber
email: f.weber@flweber.me
@@ -75,10 +75,14 @@ spec:
mountPath: /state.yaml mountPath: /state.yaml
subPath: state.yaml subPath: state.yaml
readOnly: true readOnly: true
- name: tmp
mountPath: /tmp
resources: resources:
{{- toYaml .Values.reconcile.resources | nindent 12 }} {{- toYaml .Values.reconcile.resources | nindent 12 }}
volumes: volumes:
- name: state - name: state
configMap: configMap:
name: {{ $fullname }}-state name: {{ $fullname }}-state
- name: tmp
emptyDir: {}
{{- end }} {{- end }}
+9 -3
View File
@@ -180,17 +180,23 @@ spec:
{{- with .Values.extraVolumeMounts }} {{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 12 }} {{- toYaml . | nindent 12 }}
{{- end }} {{- end }}
# exec, not httpGet: aptly listens on 127.0.0.1 only (see
# aptly.apiListen) when proxy.enabled=true, but kubelet's httpGet
# probes connect to the POD IP, not localhost — that dials a
# loopback-only listener from outside and gets "connection
# refused". exec runs curl inside this container's own netns,
# where 127.0.0.1 is correct in either proxy mode.
startupProbe: startupProbe:
httpGet: { path: /api/ready, port: aptly } exec: { command: ["curl", "-fsS", "http://127.0.0.1:{{ .Values.ports.aptly }}/api/ready"] }
periodSeconds: {{ .Values.probes.startup.periodSeconds }} periodSeconds: {{ .Values.probes.startup.periodSeconds }}
failureThreshold: {{ .Values.probes.startup.failureThreshold }} failureThreshold: {{ .Values.probes.startup.failureThreshold }}
readinessProbe: readinessProbe:
httpGet: { path: /api/ready, port: aptly } exec: { command: ["curl", "-fsS", "http://127.0.0.1:{{ .Values.ports.aptly }}/api/ready"] }
periodSeconds: {{ .Values.probes.readiness.periodSeconds }} periodSeconds: {{ .Values.probes.readiness.periodSeconds }}
timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds }} timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds }}
failureThreshold: {{ .Values.probes.readiness.failureThreshold }} failureThreshold: {{ .Values.probes.readiness.failureThreshold }}
livenessProbe: livenessProbe:
httpGet: { path: /api/healthy, port: aptly } exec: { command: ["curl", "-fsS", "http://127.0.0.1:{{ .Values.ports.aptly }}/api/healthy"] }
periodSeconds: {{ .Values.probes.liveness.periodSeconds }} periodSeconds: {{ .Values.probes.liveness.periodSeconds }}
timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds }} timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds }}
failureThreshold: {{ .Values.probes.liveness.failureThreshold }} failureThreshold: {{ .Values.probes.liveness.failureThreshold }}
+1 -1
View File
@@ -64,7 +64,7 @@ LABEL org.opencontainers.image.title="aptly-server" \
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \ apt-get update && apt-get install -y --no-install-recommends \
ca-certificates gnupg bzip2 xz-utils curl jq gettext-base openssl \ ca-certificates gnupg gpgv bzip2 xz-utils curl jq gettext-base openssl \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& addgroup --system --gid 10001 aptly \ && addgroup --system --gid 10001 aptly \
&& adduser --system --uid 10001 --ingroup aptly --home /var/lib/aptly --disabled-password aptly \ && adduser --system --uid 10001 --ingroup aptly --home /var/lib/aptly --disabled-password aptly \