Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
232 changes: 232 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
name: Release

on:
release:
types: [created]

jobs:
build-release:
name: Build Release Package
runs-on: ubuntu-latest
permissions:
contents: write

container:
image: chocotechnologies/dmod:1.0.4

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Extract version from tag
id: get_version
run: |
# Extract version from tag (e.g., v1.2 -> 1.2)
VERSION="${{ github.event.release.tag_name }}"
VERSION="${VERSION#v}" # Remove 'v' prefix if present
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"

- name: Prepare release package
run: |
set -e
mkdir -p release_package

# Copy dmlist resource file
cp dmlist.dmr release_package/

# Copy header files
mkdir -p release_package/include
cp include/dmlist.h release_package/include/

# Copy documentation and license
cp README.md release_package/
cp LICENSE release_package/

# Create release notes file from GitHub release
echo "${{ github.event.release.body }}" > release_package/RELEASE_NOTES.txt

echo "Package contents:"
ls -la release_package/
ls -la release_package/include/

- name: Create release archive
run: |
cd release_package
# dmlist is architecture-independent (headers only), so no arch suffix needed
zip -r ../dmlist-${{ github.event.release.tag_name }}.zip .
cd ..
echo "Created archive:"
ls -lh dmlist-*.zip

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: release-package
path: dmlist-${{ github.event.release.tag_name }}.zip
retention-days: 1

generate-versions-manifest:
name: Generate versions.dmm
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history to get all tags

- name: Generate versions.dmm
run: |
set -e
echo "# List of available versions for dmlist module" > versions.dmm
echo "# Generated automatically by CI" >> versions.dmm
echo "" >> versions.dmm

# Get all version tags (starting with 'v') and extract version numbers
# Exclude vlatest tag from the list
VERSIONS=$(git tag -l 'v*' | grep -v '^vlatest$' | sed 's/^v//' | sort -V | tr '\n' ' ' | sed 's/ $//' | xargs)

if [ -z "$VERSIONS" ]; then
echo "Warning: No version tags found"
VERSIONS="${{ github.event.release.tag_name }}"
VERSIONS="${VERSIONS#v}"
fi

echo "Found versions: $VERSIONS"

# Add $version-available directive for dmlist module
echo "\$version-available dmlist $VERSIONS" >> versions.dmm

echo "Generated versions.dmm:"
cat versions.dmm

- name: Upload versions.dmm as artifact
uses: actions/upload-artifact@v4
with:
name: versions-manifest
path: |
versions.dmm
manifest.dmm
retention-days: 1


upload-release-assets:
name: Upload Release Assets
needs: [build-release, generate-versions-manifest]
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Display artifact structure
run: |
echo "Downloaded artifacts:"
ls -lR artifacts/

- name: Upload release assets to versioned tag
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -e
# Upload all release archives to the GitHub release
shopt -s nullglob
zip_files=(artifacts/release-package/*.zip)

if [ ${#zip_files[@]} -eq 0 ]; then
echo "Error: No artifacts found to upload"
exit 1
fi

for zip_file in "${zip_files[@]}"; do
echo "Uploading $zip_file to ${{ github.event.release.tag_name }}..."
gh release upload ${{ github.event.release.tag_name }} \
"$zip_file" \
--repo ${{ github.repository }} \
--clobber
done

# Upload versions.dmm to the versioned release
if [ -f artifacts/versions-manifest/versions.dmm ]; then
echo "Uploading versions.dmm to ${{ github.event.release.tag_name }}..."
gh release upload ${{ github.event.release.tag_name }} \
artifacts/versions-manifest/versions.dmm \
--repo ${{ github.repository }} \
--clobber
fi

# Upload manifest.dmm to the versioned release
if [ -f artifacts/versions-manifest/manifest.dmm ]; then
echo "Uploading manifest.dmm to ${{ github.event.release.tag_name }}..."
gh release upload ${{ github.event.release.tag_name }} \
artifacts/versions-manifest/manifest.dmm \
--repo ${{ github.repository }} \
--clobber
fi

echo "Successfully uploaded ${#zip_files[@]} artifact(s) to ${{ github.event.release.tag_name }}"

- name: Create or update latest release
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -e

# Check if vlatest release exists
if gh release view vlatest --repo ${{ github.repository }} >/dev/null 2>&1; then
echo "Release vlatest exists, deleting it..."
gh release delete vlatest --repo ${{ github.repository }} --yes
fi

# Create new vlatest release
echo "Creating vlatest release..."
gh release create vlatest \
--repo ${{ github.repository }} \
--title "Latest Release (based on ${{ github.event.release.tag_name }})" \
--notes "This release always points to the latest stable version. Currently based on ${{ github.event.release.tag_name }}."

- name: Upload release assets to latest tag
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -e
shopt -s nullglob
zip_files=(artifacts/release-package/*.zip)

for zip_file in "${zip_files[@]}"; do
echo "Uploading $zip_file to vlatest..."
gh release upload vlatest \
"$zip_file" \
--repo ${{ github.repository }} \
--clobber
done

# Upload versions.dmm to the latest release
if [ -f artifacts/versions-manifest/versions.dmm ]; then
echo "Uploading versions.dmm to vlatest..."
gh release upload vlatest \
artifacts/versions-manifest/versions.dmm \
--repo ${{ github.repository }} \
--clobber
fi

# Upload manifest.dmm to the latest release
if [ -f artifacts/versions-manifest/manifest.dmm ]; then
echo "Uploading manifest.dmm to vlatest..."
gh release upload vlatest \
artifacts/versions-manifest/manifest.dmm \
--repo ${{ github.repository }} \
--clobber
fi

echo "Successfully uploaded ${#zip_files[@]} artifact(s) to vlatest"
15 changes: 15 additions & 0 deletions dmlist.dmr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# DMOD Resource File for dmlist
# This file specifies where resources should be installed
# Note: dmlist is a built-in module, so no .dmf file is distributed

# === Header Files ===
# Include directory with dmlist.h header
inc=./include => ${destination}/${module}/include

# === Documentation ===
# README file
readme=./README.md => ${destination}/${module}/README.md

# === License ===
# License file
license=./LICENSE => ${destination}/${module}/LICENSE
6 changes: 6 additions & 0 deletions manifest.dmm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Include dynamically generated versions list from latest release
$include https://github.com/choco-technologies/dmlist/releases/download/vlatest/versions.dmm

# Module entries with version placeholder - will be expanded by $version-available
# dmlist is architecture-independent (headers only)
dmlist https://github.com/choco-technologies/dmlist/releases/download/v<version>/dmlist-v<version>.zip