Skip to content

AxoSyslog nightly

AxoSyslog nightly #324

name: AxoSyslog nightly
permissions: write-all
on:
workflow_dispatch:
schedule:
- cron: '00 23 * * *'
jobs:
precheck:
runs-on: ubuntu-latest
outputs:
nightly-needed: ${{ github.event_name != 'schedule' || fromJson(steps.previous-nightly.outputs.data).workflow_runs[0].head_sha != github.sha }}
steps:
- name: Check previous nightly commit
id: previous-nightly
uses: octokit/request-action@v2.x
with:
route: GET /repos/${{github.repository}}/actions/workflows/axosyslog-nightly.yml/runs?per_page=1&status=success
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
echo "The previous nightly was built from commit ${{ fromJson(steps.previous-nightly.outputs.data).workflow_runs[0].head_sha }}"
tarball:
if: needs.precheck.outputs.nightly-needed == 'true'
needs: precheck
runs-on: ubuntu-latest
outputs:
snapshot-version: ${{ steps.snapshot-version.outputs.SNAPSHOT_VERSION }}
steps:
- name: Checkout AxoSyslog source
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Prepare docker image
run: ./dbld/rules cache-image-tarball
- name: Create source tarball
run: ./dbld/rules pkg-tarball
- name: Determine snapshot version
id: snapshot-version
run: |
tarball_filename="$(find dbld/build -name '*.tar.*' -printf '%f\n')"
tarball_name="${tarball_filename/\.tar.*}"
tarball_version="${tarball_name/axosyslog-}"
pkg_version_prefix="$(echo $tarball_version | sed -En 's|(([0-9]+\.){2}[0-9]+).*|\1|p')"
[ -z "$pkg_version_prefix" ] && echo "Error: tarball name contains invalid version prefix" && exit 1
pkg_version="${pkg_version_prefix}_git$(date +%Y%m%d)"
echo "SNAPSHOT_VERSION=${pkg_version}" >> $GITHUB_OUTPUT
- name: Store source tarball as artifact
uses: actions/upload-artifact@v4
with:
name: source-tarball
path: dbld/build/*.tar.*
create-packages:
needs: tarball
uses: ./.github/workflows/create-packages.yml
with:
source-tarball-artifact-name: source-tarball
dbld-image-mode: cache
upload-packages:
needs: create-packages
uses: ./.github/workflows/upload-packages.yml
with:
pkg-type: nightly
secrets:
r2-access-key: ${{ secrets.R2_ACCESS_KEY }}
r2-secret-key: ${{ secrets.R2_SECRET_KEY }}
r2-account-id: ${{ secrets.R2_ACCOUNT_ID }}
index-packages:
needs: upload-packages
uses: ./.github/workflows/index-packages.yml
with:
pkg-type: nightly
secrets:
config-base64: ${{ secrets.PACKAGE_INDEXER_CONFIG_BASE64 }}
gpg-key-base64: ${{ secrets.PACKAGE_INDEXER_GPG_KEY_BASE64 }}
gpg-key-passphrase: ${{ secrets.PACKAGE_INDEXER_GPG_KEY_PASSPHRASE }}
test-packages:
needs: index-packages
uses: ./.github/workflows/test-apt-packages.yml
with:
pkg-type: nightly
publish-image:
uses: ./.github/workflows/axosyslog-docker.yml
needs: tarball
with:
type: snapshot
snapshot-tarball-artifact: source-tarball
snapshot-version: ${{ needs.tarball.outputs.snapshot-version }}
snapshot-tags: nightly,${{ needs.tarball.outputs.snapshot-version }}
# https://github.com/actions/delete-package-versions/issues/90
cleanup-old-images:
if: github.ref == 'refs/heads/main'
needs: publish-image
runs-on: ubuntu-latest
steps:
- name: Clean up old images
uses: actions/github-script@v7
with:
script: |
const nightliesToKeep = 60 * 2
const nightlyTagPattern = /^[0-9.]+_git[0-9]+/
const package_name = "axosyslog"
const org = "axoflow"
const image = `${org}/${package_name}`
const allPackageVersions = await github.paginate(
github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg,
{ package_type: "container", package_name: package_name, org: org }
)
const nightlyPackageVersions = allPackageVersions.filter((p) => {
return p.metadata.container && p.metadata.container.tags.length != 0 && p.metadata.container.tags.every((t) => nightlyTagPattern.test(t))
})
const oldSnapshotVersions = nightlyPackageVersions.sort((a,b) => new Date(b.updated_at) - new Date(a.updated_at)).slice(nightliesToKeep);
if (oldSnapshotVersions.length === 0) {
console.log("Nothing to remove")
return
}
const oldSnapshotTags = oldSnapshotVersions.flatMap(({ metadata }) => metadata.container.tags)
console.log(`Removing the following images: ${oldSnapshotTags}`)
const manifestsRequests = oldSnapshotTags.map((t) => {
const manifest = fetch(`https://ghcr.io/v2/${image}/manifests/${t}`, {
method: "GET",
headers: {
"Authorization": "Bearer ${{ secrets.GITHUB_TOKEN }}",
"Accept": "application/vnd.docker.distribution.manifest.list.v2+json",
"Accept": "application/vnd.docker.distribution.manifest.v2+json",
"Accept": "application/vnd.oci.image.manifest.v1+json",
"Accept": "application/vnd.oci.image.index.v1+json",
},
}).then((d) => d.json())
return manifest
})
const manifestsResponse = await Promise.all(manifestsRequests)
const manifestsToDelete = manifestsResponse.filter((m) => m.manifests).flatMap((m) => m.manifests)
await Promise.all(manifestsToDelete.map((m) => {
const version = allPackageVersions.find((p) => p.name === m.digest)
if (!version) {
return;
}
return github.rest.packages.deletePackageVersionForOrg({ package_type: "container", package_name: package_name, org: org, package_version_id: version.id})
}))
await Promise.all(oldSnapshotVersions.map((v) => {
return github.rest.packages.deletePackageVersionForOrg({ package_type: "container", package_name: package_name, org: org, package_version_id: v.id})
}))