diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..62bf8da --- /dev/null +++ b/.github/workflows/release.yml @@ -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" diff --git a/dmlist.dmr b/dmlist.dmr new file mode 100644 index 0000000..4000cb4 --- /dev/null +++ b/dmlist.dmr @@ -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 diff --git a/manifest.dmm b/manifest.dmm new file mode 100644 index 0000000..e37e9ce --- /dev/null +++ b/manifest.dmm @@ -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/dmlist-v.zip