From 3020ecdc2227098b0daabd0e2e018c7e2800c14d Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 24 May 2026 22:50:46 +0000 Subject: [PATCH] ci: standardize workflows and chart patterns to match org playbook Co-Authored-By: kyle_hunter@bcit.ca --- .github/workflows/ci.yaml | 74 +++++++++---------- .github/workflows/docs.yml | 8 +- .github/workflows/helm-publish.yaml | 49 ++++++++---- .github/workflows/pr-title-lint.yaml | 30 ++++---- .github/workflows/release-please.yaml | 24 ++---- .github/workflows/release-retag.yaml | 47 ++++++------ AGENTS.md | 51 +++++++++++++ charts/tech-ops-docs/Chart.yaml | 2 +- .../tech-ops-docs/templates/deployment.yaml | 2 +- charts/tech-ops-docs/values.yaml | 6 -- release-please-config.json | 5 +- 11 files changed, 177 insertions(+), 121 deletions(-) create mode 100644 AGENTS.md diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6653db9..3439db0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,6 @@ name: "[CI] Lint, build & publish" -# Readable run titles in the Actions UI: PR runs show the PR number and -# title; main pushes show the head commit subject. +# PR runs show PR title; main runs show head commit subject. run-name: >- ${{ github.event_name == 'pull_request' && format('PR #{0} — {1}', github.event.pull_request.number, github.event.pull_request.title) @@ -16,17 +15,12 @@ on: env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true -# Least-privilege default: only read access at the workflow level. -# Jobs that need more elevate locally. +# Default to least privilege; jobs elevate only when needed. permissions: contents: read jobs: - # ── Quality gates ───────────────────────────────────────── - # - # Helm lint runs on every push + PR as a parallel quality gate. - # Its failure breaks the workflow status but does not block the - # image build (surfaced via branch protection required check). + # Chart quality gate helm-lint: runs-on: ubuntu-latest @@ -54,16 +48,7 @@ jobs: echo "::endgroup::" done - # ── Container image ────────────────────────────────────── - # - # The shared reusable workflow handles checkout, change - # detection, Docker build/push, Cosign signing, and Trivy - # scanning. - # - # `helm-lint` is intentionally NOT in `needs` — it runs as an - # independent parallel job whose failure surfaces via branch - # protection (required status check) rather than delaying or - # blocking image builds. + # Container image build/publish (reusable workflow) build-tech-ops-docs: uses: bcit-tlu/.github/.github/workflows/oci-build.yaml@main @@ -72,7 +57,7 @@ jobs: packages: write id-token: write security-events: write - actions: read # Required by codeql-action/upload-sarif on private repos + actions: read with: component: tech-ops-docs image_name: tech-ops-docs @@ -80,12 +65,7 @@ jobs: tag_prefix: "v" secrets: inherit - # ── Helm chart → OCI registry (main push) ─────────────────── - # - # Publishes the chart with the same RC version that the image - # received so the chart and app tags stay in lockstep. Only - # runs on main pushes when the component actually changed. - # Release-time chart publishing is handled by helm-publish.yaml. + # Publish chart from main pushes using the image RC version. helm-publish: needs: [helm-lint, build-tech-ops-docs] @@ -96,7 +76,7 @@ jobs: permissions: contents: read packages: write - id-token: write # Cosign keyless (Sigstore OIDC) + id-token: write env: REGISTRY: ghcr.io steps: @@ -107,30 +87,38 @@ jobs: - uses: sigstore/cosign-installer@v3 - name: Cosign login (OCI) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REGISTRY: ${{ env.REGISTRY }} + ACTOR: ${{ github.actor }} run: | - echo "${{ secrets.GITHUB_TOKEN }}" | \ - cosign login "${{ env.REGISTRY }}" \ - -u "${{ github.actor }}" \ + echo "${GITHUB_TOKEN}" | \ + cosign login "${REGISTRY}" \ + -u "${ACTOR}" \ --password-stdin - name: Helm login (OCI) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REGISTRY: ${{ env.REGISTRY }} + ACTOR: ${{ github.actor }} run: | - echo "${{ secrets.GITHUB_TOKEN }}" | \ - helm registry login "${{ env.REGISTRY }}" \ - -u "${{ github.actor }}" \ + echo "${GITHUB_TOKEN}" | \ + helm registry login "${REGISTRY}" \ + -u "${ACTOR}" \ --password-stdin - name: Package, push & sign chart shell: bash env: VERSION: ${{ needs.build-tech-ops-docs.outputs.rc_version }} + OCI_BASE: oci://${{ env.REGISTRY }}/${{ github.repository }}/charts + IMAGE_BASE: ${{ env.REGISTRY }}/${{ github.repository }}/charts run: | set -euo pipefail - OCI_BASE="oci://${{ env.REGISTRY }}/${{ github.repository }}/charts" - IMAGE_BASE="${{ env.REGISTRY }}/${{ github.repository }}/charts" CHART_DIR="charts/tech-ops-docs" - CHART_NAME=$(awk '/^name:/{print $2; exit}' "${CHART_DIR}/Chart.yaml") + CHART_NAME=$(yq '.name' "${CHART_DIR}/Chart.yaml") DEST_DIR="/tmp/charts" mkdir -p "${DEST_DIR}" @@ -143,11 +131,15 @@ jobs: PUSH_OUT=$(helm push \ "${DEST_DIR}/${CHART_NAME}-${VERSION}.tgz" \ - "${OCI_BASE}" 2>&1) || true + "${OCI_BASE}" 2>&1) || { echo "${PUSH_OUT}"; exit 1; } echo "${PUSH_OUT}" - printf '%s\n' "${PUSH_OUT}" | grep -q '^Digest:' || { echo "::error::helm push failed for ${CHART_NAME}"; exit 1; } - DIGEST=$(printf '%s\n' "${PUSH_OUT}" | awk '/^Digest:/{print $2}') - if [[ -n "${DIGEST}" ]]; then - cosign sign --yes "${IMAGE_BASE}/${CHART_NAME}@${DIGEST}" + # Tolerant digest parse: case-insensitive, allows leading whitespace. + DIGEST=$(printf '%s\n' "${PUSH_OUT}" \ + | awk 'tolower($1)=="digest:"{print $2; exit}') + if [[ -z "${DIGEST}" ]]; then + echo "::error::helm push for ${CHART_NAME} succeeded but no digest found in output (helm output format may have changed)" + exit 1 fi + + cosign sign --yes "${IMAGE_BASE}/${CHART_NAME}@${DIGEST}" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 228b8b7..32bc9e9 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,12 +1,18 @@ name: Documentation + on: push: branches: - main + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + permissions: contents: read pages: write id-token: write + jobs: deploy: environment: @@ -15,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/configure-pages@v5 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v5 with: python-version: 3.x diff --git a/.github/workflows/helm-publish.yaml b/.github/workflows/helm-publish.yaml index 6795d8c..a825278 100644 --- a/.github/workflows/helm-publish.yaml +++ b/.github/workflows/helm-publish.yaml @@ -13,10 +13,11 @@ on: permissions: contents: read packages: write - id-token: write # Cosign keyless (Sigstore OIDC) + id-token: write env: REGISTRY: ghcr.io + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: publish: @@ -46,32 +47,42 @@ jobs: - name: Cosign login (OCI) if: steps.parse.outputs.publish == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REGISTRY: ${{ env.REGISTRY }} + ACTOR: ${{ github.actor }} run: | - echo "${{ secrets.GITHUB_TOKEN }}" | \ - cosign login "${{ env.REGISTRY }}" \ - -u "${{ github.actor }}" \ + echo "${GITHUB_TOKEN}" | \ + cosign login "${REGISTRY}" \ + -u "${ACTOR}" \ --password-stdin - name: Helm login (OCI) if: steps.parse.outputs.publish == 'true' shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REGISTRY: ${{ env.REGISTRY }} + ACTOR: ${{ github.actor }} run: | - echo "${{ secrets.GITHUB_TOKEN }}" | \ - helm registry login "${{ env.REGISTRY }}" \ - -u "${{ github.actor }}" \ + echo "${GITHUB_TOKEN}" | \ + helm registry login "${REGISTRY}" \ + -u "${ACTOR}" \ --password-stdin - name: Package and push chart id: push if: steps.parse.outputs.publish == 'true' shell: bash + env: + VERSION: ${{ steps.parse.outputs.version }} + OCI_REPO: oci://${{ env.REGISTRY }}/${{ github.repository }}/charts run: | set -euo pipefail - VERSION="${{ steps.parse.outputs.version }}" CHART_DIR="charts/tech-ops-docs" - CHART_NAME=$(awk '/^name:/{print $2; exit}' "${CHART_DIR}/Chart.yaml") DEST_DIR="/tmp/charts" + CHART_NAME=$(yq '.name' "${CHART_DIR}/Chart.yaml") mkdir -p "${DEST_DIR}" @@ -84,16 +95,24 @@ jobs: PUSH_OUT=$(helm push \ "${DEST_DIR}/${CHART_NAME}-${VERSION}.tgz" \ - "oci://${{ env.REGISTRY }}/${{ github.repository }}/charts" 2>&1) || true + "${OCI_REPO}" 2>&1) || { echo "${PUSH_OUT}"; exit 1; } echo "${PUSH_OUT}" - printf '%s\n' "${PUSH_OUT}" | grep -q '^Digest:' || { echo '::error::helm push failed'; exit 1; } - DIGEST=$(printf '%s\n' "${PUSH_OUT}" | awk '/^Digest:/{print $2}') + # Tolerant digest parse: case-insensitive, allows leading whitespace. + DIGEST=$(printf '%s\n' "${PUSH_OUT}" \ + | awk 'tolower($1)=="digest:"{print $2; exit}') + if [[ -z "${DIGEST}" ]]; then + echo "::error::helm push succeeded but no digest found in output (helm output format may have changed)" + exit 1 + fi + echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT" + echo "chart_name=${CHART_NAME}" >> "$GITHUB_OUTPUT" - name: Sign chart if: steps.parse.outputs.publish == 'true' && steps.push.outputs.digest != '' + env: + CHART_REF: ${{ env.REGISTRY }}/${{ github.repository }}/charts/${{ steps.push.outputs.chart_name }} + DIGEST: ${{ steps.push.outputs.digest }} run: | - CHART_NAME=$(awk '/^name:/{print $2; exit}' "charts/tech-ops-docs/Chart.yaml") - cosign sign --yes \ - "${{ env.REGISTRY }}/${{ github.repository }}/charts/${CHART_NAME}@${{ steps.push.outputs.digest }}" + cosign sign --yes "${CHART_REF}@${DIGEST}" diff --git a/.github/workflows/pr-title-lint.yaml b/.github/workflows/pr-title-lint.yaml index d785913..5749d23 100644 --- a/.github/workflows/pr-title-lint.yaml +++ b/.github/workflows/pr-title-lint.yaml @@ -1,15 +1,15 @@ name: pr-title-lint -# Gate non-conventional PR titles at the merge boundary so unparseable -# squash-merge commits can't land on main and silently starve -# release-please of the feat:/fix:/BREAKING signals it uses to open -# release PRs. +# Enforce Conventional Commit PR titles so release-please can parse changes. on: pull_request_target: types: [opened, edited, reopened, synchronize] branches: [main] +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + permissions: contents: read pull-requests: write @@ -49,25 +49,25 @@ jobs: with: header: pr-title-lint message: | - ## PR title does not match Conventional Commits - - **Why this matters (tl;dr)** — release-please reads PR titles on `main` to decide whether to cut a release, what version bump to apply, and how to group CHANGELOG entries. A title that doesn't parse is silently dropped; no release PR opens, no error, workflow still exits 0. + ## PR title must follow Conventional Commits - **Required structure** + release-please uses PR titles on `main` to determine version bumps and changelog entries. ``` [optional scope][!]: ``` - - `` — `feat` / `fix` / `docs` / `style` / `refactor` / `perf` / `test` / `build` / `ci` / `chore` / `revert` - - `` — lowercase first letter, imperative mood, no trailing period - - add `!` (or `BREAKING CHANGE:` in the body) for breaking changes - - **Good** — `feat: add search page`, `fix: correct broken nav link`, `ci: tighten workflow permissions` + - `type`: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert` + - `subject`: start lowercase, imperative mood, no trailing period + - breaking change: add `!` (or `BREAKING CHANGE:` in body) - **Bad** — `Add search page` (no type), `feat: Add search page` (uppercase subject) + Examples: + - ✅ `feat: add search page` + - ✅ `fix: correct broken nav link` + - ❌ `Add search page` + - ❌ `feat: Add search page` - Edit the PR title in the GitHub UI — the check re-runs automatically within seconds, no push needed. + Edit the PR title in GitHub; this check reruns automatically. - name: Clear failure explainer on success if: success() && steps.lint.outcome == 'success' diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 269e967..a7ef09f 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -4,11 +4,13 @@ on: push: branches: [main] -# Least-privilege default: only `checkout` needs read access. -# Each job elevates permissions to just what that job requires. +# Default to least privilege; jobs elevate only when needed. permissions: contents: read +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + jobs: release: runs-on: ubuntu-latest @@ -25,17 +27,8 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} - # `release-as` per-package is a one-shot: once the release PR it - # triggered has merged and the manifest has caught up, the override - # must be removed, otherwise every subsequent release-please run - # keeps pinning the same version and blocks normal semver bumps - # from feat:/fix: commits. This guard runs *after* release-please - # and is skipped whenever `releases_created=true`, so the - # tag/release finalization that happens on the merge-of-chore-PR - # push (where manifest has just caught up to release-as) isn't - # blocked. On any subsequent push where the state is still stale - # and there's nothing to release, the workflow fails loudly to - # force the cleanup PR. + # `release-as` is one-shot. Once manifest catches up, remove it; + # otherwise future semver bumps are pinned and releases stall. - uses: actions/checkout@v6 if: steps.rp.outputs.releases_created != 'true' - name: Guard against stale `release-as` entries @@ -59,9 +52,8 @@ jobs: sys.exit(1) PY - # Releases created via GITHUB_TOKEN do NOT trigger workflows that listen - # on `release: published` or `push: tags:`. Dispatch helm-publish and - # release-retag explicitly for the released tag. + # Releases made with GITHUB_TOKEN do not trigger release/tag workflows. + # Dispatch publish workflows explicitly for the new tag. dispatch-publish: needs: release if: needs.release.outputs.releases_created == 'true' diff --git a/.github/workflows/release-retag.yaml b/.github/workflows/release-retag.yaml index 31454c1..195fe56 100644 --- a/.github/workflows/release-retag.yaml +++ b/.github/workflows/release-retag.yaml @@ -17,7 +17,7 @@ env: permissions: contents: read packages: write - id-token: write # Cosign keyless (Sigstore OIDC) + id-token: write jobs: retag: @@ -29,10 +29,10 @@ jobs: TAG: ${{ inputs.tag_name || github.event.release.tag_name }} run: | if [[ "$TAG" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then - echo "version=${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}" >> $GITHUB_OUTPUT - echo "match=true" >> $GITHUB_OUTPUT + echo "version=${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}" >> "$GITHUB_OUTPUT" + echo "match=true" >> "$GITHUB_OUTPUT" else - echo "match=false" >> $GITHUB_OUTPUT + echo "match=false" >> "$GITHUB_OUTPUT" fi - uses: actions/checkout@v6 @@ -46,11 +46,10 @@ jobs: id: highest if: steps.parse.outputs.match == 'true' shell: bash + env: + VERSION: ${{ steps.parse.outputs.version }} run: | - VERSION=${{ steps.parse.outputs.version }} - - # List all stable (non-prerelease) tags, strip prefix, sort by - # semver, take the highest. + # Highest stable (non-prerelease) semver tag. HIGHEST=$(git tag -l "v[0-9]*.[0-9]*.[0-9]*" \ | sed "s/^v//" \ | grep -v -- '-' \ @@ -72,7 +71,7 @@ jobs: TAG: ${{ inputs.tag_name || github.event.release.tag_name }} run: | SHA=$(git rev-list -n1 "${TAG}") - echo "sha=${SHA}" >> $GITHUB_OUTPUT + echo "sha=${SHA}" >> "$GITHUB_OUTPUT" - uses: docker/setup-buildx-action@v4 if: steps.parse.outputs.match == 'true' @@ -112,31 +111,33 @@ jobs: - name: Retag (no pull) id: retag if: steps.parse.outputs.match == 'true' + env: + IMAGE: ${{ env.REGISTRY }}/${{ github.repository }}/tech-ops-docs + SHA: ${{ steps.sha.outputs.sha }} + VERSION: ${{ steps.parse.outputs.version }} + IS_HIGHEST: ${{ steps.highest.outputs.is_highest }} run: | - IMAGE=${{ env.REGISTRY }}/${{ github.repository }}/tech-ops-docs - SHA=${{ steps.sha.outputs.sha }} - VERSION=${{ steps.parse.outputs.version }} - - TAGS="-t ${IMAGE}:${VERSION}" - if [[ "${{ steps.highest.outputs.is_highest }}" == "true" ]]; then - TAGS="${TAGS} -t ${IMAGE}:latest" + TAG_ARGS=( -t "${IMAGE}:${VERSION}" ) + if [[ "${IS_HIGHEST}" == "true" ]]; then + TAG_ARGS+=( -t "${IMAGE}:latest" ) fi docker buildx imagetools create \ - ${TAGS} \ - ${IMAGE}:sha-${SHA} + "${TAG_ARGS[@]}" \ + "${IMAGE}:sha-${SHA}" - # Capture digest for Cosign signing. + # Capture digest for signing. DIGEST=$(docker buildx imagetools inspect "${IMAGE}:${VERSION}" --format '{{.Manifest.Digest}}') echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT" echo "image=${IMAGE}" >> "$GITHUB_OUTPUT" - # ── Sign with Cosign (keyless / Sigstore) ────────────── - uses: sigstore/cosign-installer@v3 if: steps.parse.outputs.match == 'true' - name: Sign release image - if: steps.parse.outputs.match == 'true' + if: steps.parse.outputs.match == 'true' && steps.retag.outputs.digest != '' + env: + IMAGE: ${{ steps.retag.outputs.image }} + DIGEST: ${{ steps.retag.outputs.digest }} run: | - cosign sign --yes \ - ${{ steps.retag.outputs.image }}@${{ steps.retag.outputs.digest }} + cosign sign --yes "${IMAGE}@${DIGEST}" diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..af2aac6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,51 @@ +# AGENTS.md + +## Setup Commands + +- Local development: `docker compose up` (starts Zensical dev server on port 8000) +- Helm lint: `helm lint charts/tech-ops-docs/` +- Helm validate: `helm template test charts/tech-ops-docs/ | kubeconform -strict -summary -schema-location default -ignore-missing-schemas` + +## Code Style + +- Documentation is written in Markdown under `docs/` +- Site is built with Zensical (configured in `zensical.toml`) +- Follow conventional commit format for PR titles +- License: MPL-2.0 + +## Project Structure + +- `/docs` — Markdown source files for technical guides and architecture +- `/charts/tech-ops-docs/` — Helm chart for Kubernetes deployment (nested layout) +- `/.github/workflows/` — CI/CD pipelines +- `/conf.d/` — Nginx configuration for serving the static site +- `/zensical.toml` — Static site generator configuration and navigation +- `/Dockerfile` — Multi-stage build: Zensical builder to nginx-unprivileged runtime + +## Architecture + +- **Build**: Zensical (Python SSG) renders Markdown to static HTML +- **Runtime**: nginx-unprivileged serving static files on port 8080 +- **Health endpoint**: `GET /` returns 200 + +## Development Workflow + +- Create feature branches from `main` +- Use pull requests for code review +- PR titles must follow conventional commit format (enforced by `pr-title-lint.yaml`) +- Squash commits before merging + +## CI/CD + +- CI uses shared `bcit-tlu/.github` OCI build reusable workflow +- `helm-lint` validates Helm charts on every push and PR +- `release-please` manages versioning via conventional commits (`release-type: "simple"`) +- Chart `version:` is hand-maintained; only `appVersion:` is managed by release-please (`# x-release-please-version`) +- Images are published to `ghcr.io/bcit-tlu/technical-operations-documentation/tech-ops-docs` +- Charts are published to `oci://ghcr.io/bcit-tlu/technical-operations-documentation/charts` +- `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true` is set in all workflows + +## Deployment + +- Deployed to Kubernetes via Flux CD (see `bcit-tlu/flux-fleet`) +- Served by nginx-unprivileged on port 8080 diff --git a/charts/tech-ops-docs/Chart.yaml b/charts/tech-ops-docs/Chart.yaml index fcb3f7b..e907448 100644 --- a/charts/tech-ops-docs/Chart.yaml +++ b/charts/tech-ops-docs/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: tech-ops-docs description: Technical Operations Documentation — static site served by nginx type: application -version: 0.4.1 # x-release-please-version +version: 0.4.1 appVersion: "0.4.1" # x-release-please-version diff --git a/charts/tech-ops-docs/templates/deployment.yaml b/charts/tech-ops-docs/templates/deployment.yaml index 877f718..2f39494 100644 --- a/charts/tech-ops-docs/templates/deployment.yaml +++ b/charts/tech-ops-docs/templates/deployment.yaml @@ -28,7 +28,7 @@ spec: {{- $merged := dict "podAntiAffinity" (dict "requiredDuringSchedulingIgnoredDuringExecution" (append $existing $zoneRule)) }} {{- $aff = mustMergeOverwrite $aff $merged }} {{- end }} - {{- if $aff }} + {{- if ne (toJson $aff) "{}" }} affinity: {{- toYaml $aff | nindent 8 }} {{- end }} diff --git a/charts/tech-ops-docs/values.yaml b/charts/tech-ops-docs/values.yaml index 420694c..55d5173 100644 --- a/charts/tech-ops-docs/values.yaml +++ b/charts/tech-ops-docs/values.yaml @@ -28,12 +28,6 @@ resources: cpu: 50m memory: 64Mi -# ── High-availability / topology spreading ──────────────────── -# When enabled, adds a required pod anti-affinity rule so that no two -# replicas land in the same topology zone (e.g. datacenter). -# Requires nodes to be labeled with the chosen topologyKey. -# NOTE: replicaCount must not exceed the number of distinct zones, -# otherwise excess pods will remain Pending (hard scheduling constraint). zoneAntiAffinity: enabled: false topologyKey: topology.kubernetes.io/zone diff --git a/release-please-config.json b/release-please-config.json index a16fa12..0e8c6f6 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -8,8 +8,9 @@ "release-type": "simple", "extra-files": [ { - "type": "generic", - "path": "charts/tech-ops-docs/Chart.yaml" + "type": "yaml", + "path": "charts/tech-ops-docs/Chart.yaml", + "jsonpath": "$.appVersion" } ] }