Skip to content

Commit

Permalink
Add release toolkit to this repository
Browse files Browse the repository at this point in the history
  • Loading branch information
Juan Manuel "Kang" Perez committed Jun 7, 2024
1 parent 74e017a commit 95e65f7
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 9 deletions.
8 changes: 8 additions & 0 deletions .github/rt-dictionary.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# This file is a dictionary used by the [link-dependencies](https://github.com/newrelic/release-toolkit/tree/main/link-dependencies) action.
# Notice that the implementation uses dep.To.ToString that removes the leading v if present.
dictionary:
# TODO: Unable to link dependency for Power DNS because it uses a weird changelog URL scheme:
# https://doc.powerdns.com/authoritative/changelog/4.9.html#change-4.9.1
# txqueuelen/powerdns-docker: "https://github.com/txqueuelen/powerdns-docker/releases/tag/{{.To}}"

external-dns/external-dns: "https://github.com/kubernetes-sigs/external-dns/releases/tag/v{{.To}}"
46 changes: 45 additions & 1 deletion .github/workflows/lint-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,52 @@ jobs:
fi
done
changelog-checks:
name: Test changelog correctness and get next-version
runs-on: ubuntu-latest
outputs:
is-empty: ${{ steps.empty.outputs.is-empty }}
is-held: ${{ steps.held.outputs.is-held }}
skip-release: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
next-version: ${{ steps.version.outputs.next-version }}

steps:
- name: Validate that the markdown is correct
uses: newrelic/release-toolkit/validate-markdown@v1
- name: Generate YAML
uses: newrelic/release-toolkit/generate-yaml@v1
with:
excluded-dirs: .github
excluded-files: README.md
exit-code: "0"
- name: Check if the release is empty
id: empty
uses: newrelic/release-toolkit/is-empty@v1
- name: Check if the release is held
id: held
uses: newrelic/release-toolkit/is-held@v1

- name: Link dependencies
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
uses: newrelic/release-toolkit/link-dependencies@v1
with:
dictionary: .github/rt-dictionary.yaml

- name: Calculate next version
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
id: version
uses: newrelic/release-toolkit/next-version@v1

chart-install:
name: Installation test for Helm charts
runs-on: ubuntu-latest
needs:
# This test is expensive so only run it when cheap tests pass:
# This test is expensive so only run when cheap tests pass.
- chart-lint
- chart-unittest
# To test the upgrade path we need the previous and next version.
- changelog-checks
if: ${{ needs.changelog-checks.outputs.skip-release != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
Expand All @@ -55,6 +94,11 @@ jobs:
driver: docker
start args: "--container-runtime=containerd"

# Change version of the Helm chart to the next one so test upgrade path
- name: Set chart version to rt's next-version
run: |
yq -i '.version = ${{ needs.changelog-checks.outputs.next-version }}' charts/stateless-dns/Chart.yaml
# Test chart installation
- name: Install helm/chart-testing
uses: helm/[email protected]
Expand Down
66 changes: 58 additions & 8 deletions .github/workflows/publish-charts.yaml
Original file line number Diff line number Diff line change
@@ -1,30 +1,80 @@
# Publish chart as OCI image to GitHub registry. Version is automatically gathered from the tag name.
# For this workflow to work, GITHUB_TOKEN needs to be configured with write permissions.
# Additionally, the repository must be granted access in the package settings.

name: Publish chart

on:
release:
types: [ released ]

permissions:
contents: write
packages: write

jobs:
release:
name: Publish chart to OCI registry
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Checkout code
uses: actions/checkout@v3

# Create release-toolkit data file and hydrate it.
- name: Generate changelog YAML
uses: newrelic/release-toolkit/generate-yaml@v1
with:
excluded-dirs: .github
excluded-files: README.md
exit-code: "0"
- name: Link dependencies
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
uses: newrelic/release-toolkit/link-dependencies@v1
with:
dictionary: .github/rt-dictionary.yaml

# Check if we have something to release and if the release is not blocked.
- name: Check if the release is empty
id: empty
uses: newrelic/release-toolkit/is-empty@v1
- name: Check if the release is held
id: held
uses: newrelic/release-toolkit/is-held@v1

# Calculate next-version and generate change logs
- name: Calculate next version
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
id: version
uses: newrelic/release-toolkit/next-version@v1
- name: Generate release notes
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
uses: newrelic/release-toolkit/render@v1
- name: Update CHANGELOG.md
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
uses: newrelic/release-toolkit/update-markdown@v1
with:
next-version: ${{ steps.next-version.outputs.version }}

# Commit to main branch and push changes. Then create a release.
- name: Commit and tag release
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
run: |
git add CHANGELOG.md
git commit -m "[no ci] Automatic ${{ steps.next-version.outputs.next-version }} release"
git push
gh release create "${{ steps.next-version.outputs.next-version }}" -F CHANGELOG.partial.md
# Login to GitHub Packages to upload the chart to the OCI repository.
- name: Helm login
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | \
helm registry login ghcr.io \
--username "$GITHUB_REPOSITORY_OWNER" \
--password-stdin
- name: Helm package
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
run: |
helm package charts/stateless-dns -u --version "${GITHUB_REF_NAME#v}"
helm package charts/stateless-dns -u --version "${{ steps.next-version.outputs.version }}"
- name: Helm push
if: ${{ steps.empty.outputs.is-empty == 'true' || steps.held.outputs.is-held == 'true' }}
run: |
helm push \
"stateless-dns-${GITHUB_REF_NAME#v}.tgz" \
"oci://ghcr.io/${GITHUB_REPOSITORY_OWNER}/charts"
"stateless-dns-${{ steps.next-version.outputs.version }}.tgz" \
"oci://ghcr.io/${GITHUB_REPOSITORY_OWNER}/pdns-stateless"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Release toolkit
/changelog.yaml
/CHANGELOG.partial.md
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Changelog

## Unreleased

### Note

All the previous release contain no changelog as it was no automation.

I am solving this with this PR/release/automation that automates the
generation of change logs and releases.

I am leveraging this 0ver to do a breaking change. I am changing the
URL for this chart from oci://ghcr.io/txqueuelen/charts to
oci://ghcr.io/txqueuelen/pdns-stateless.

It seemed that is awesome to have all charts on the same path and loved
that Github supported it but I found that is hard to follow the origin
of a chart. Users expect to have the chart in a repository called
`charts`.

This breaking change should not affect too much as almost no user is
using this release note is a way of documenting the changes.

Luckily there are only a few 0ver releases from here once we merge all
dependencies that need to be upgraded and make the last changes before
creating the v1 release :D

### Enhancements
- Automatic dependency upgrade and release system

0 comments on commit 95e65f7

Please sign in to comment.