mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-01-24 13:32:50 -05:00
384 lines
16 KiB
YAML
384 lines
16 KiB
YAML
name: Update OBS Packages
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
package:
|
|
description: "Package to update (dms, dms-git, or all)"
|
|
required: false
|
|
default: "all"
|
|
force_upload:
|
|
description: "Force upload without version check"
|
|
required: false
|
|
default: "false"
|
|
type: choice
|
|
options:
|
|
- "false"
|
|
- "true"
|
|
rebuild_release:
|
|
description: "Release number for rebuilds (e.g., 2, 3, 4 to increment spec Release)"
|
|
required: false
|
|
default: ""
|
|
push:
|
|
tags:
|
|
- "v*"
|
|
schedule:
|
|
- cron: "0 */3 * * *" # Every 3 hours for dms-git builds
|
|
|
|
jobs:
|
|
check-updates:
|
|
name: Check for updates
|
|
runs-on: ubuntu-latest
|
|
|
|
outputs:
|
|
has_updates: ${{ steps.check.outputs.has_updates }}
|
|
packages: ${{ steps.check.outputs.packages }}
|
|
version: ${{ steps.check.outputs.version }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Install OSC
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y osc
|
|
|
|
mkdir -p ~/.config/osc
|
|
cat > ~/.config/osc/oscrc << EOF
|
|
[general]
|
|
apiurl = https://api.opensuse.org
|
|
|
|
[https://api.opensuse.org]
|
|
user = ${{ secrets.OBS_USERNAME }}
|
|
pass = ${{ secrets.OBS_PASSWORD }}
|
|
EOF
|
|
chmod 600 ~/.config/osc/oscrc
|
|
|
|
- name: Check for updates
|
|
id: check
|
|
run: |
|
|
if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" =~ ^refs/tags/ ]]; then
|
|
echo "packages=dms" >> $GITHUB_OUTPUT
|
|
VERSION="${GITHUB_REF#refs/tags/}"
|
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "Triggered by tag: $VERSION (always update)"
|
|
elif [[ "${{ github.event_name }}" == "schedule" ]]; then
|
|
echo "packages=dms-git" >> $GITHUB_OUTPUT
|
|
echo "Checking if dms-git source has changed..."
|
|
|
|
# Get current commit hash (8 chars to match spec format)
|
|
CURRENT_COMMIT=$(git rev-parse --short=8 HEAD)
|
|
|
|
# Check OBS for last uploaded commit
|
|
OBS_BASE="$HOME/.cache/osc-checkouts"
|
|
mkdir -p "$OBS_BASE"
|
|
OBS_PROJECT="home:AvengeMedia:dms-git"
|
|
|
|
if [[ -d "$OBS_BASE/$OBS_PROJECT/dms-git" ]]; then
|
|
cd "$OBS_BASE/$OBS_PROJECT/dms-git"
|
|
osc up -q 2>/dev/null || true
|
|
|
|
# Extract commit hash from spec Version line & format like; 0.6.2+git2264.a679be68
|
|
if [[ -f "dms-git.spec" ]]; then
|
|
OBS_COMMIT=$(grep "^Version:" "dms-git.spec" | grep -oP '\.[a-f0-9]{8}' | tr -d '.' || echo "")
|
|
|
|
if [[ -n "$OBS_COMMIT" ]]; then
|
|
if [[ "$CURRENT_COMMIT" == "$OBS_COMMIT" ]]; then
|
|
echo "has_updates=false" >> $GITHUB_OUTPUT
|
|
echo "📋 Commit $CURRENT_COMMIT already uploaded to OBS, skipping"
|
|
else
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "📋 New commit detected: $CURRENT_COMMIT (OBS has $OBS_COMMIT)"
|
|
fi
|
|
else
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "📋 Could not extract OBS commit, proceeding with update"
|
|
fi
|
|
else
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "📋 No spec file in OBS, proceeding with update"
|
|
fi
|
|
|
|
cd "${{ github.workspace }}"
|
|
else
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "📋 First upload to OBS, update needed"
|
|
fi
|
|
elif [[ "${{ github.event.inputs.force_upload }}" == "true" ]]; then
|
|
PKG="${{ github.event.inputs.package }}"
|
|
if [[ -z "$PKG" || "$PKG" == "all" ]]; then
|
|
echo "packages=all" >> $GITHUB_OUTPUT
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "🚀 Force upload: all packages"
|
|
else
|
|
echo "packages=$PKG" >> $GITHUB_OUTPUT
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "🚀 Force upload: $PKG"
|
|
fi
|
|
elif [[ -n "${{ github.event.inputs.package }}" ]]; then
|
|
echo "packages=${{ github.event.inputs.package }}" >> $GITHUB_OUTPUT
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
echo "Manual trigger: ${{ github.event.inputs.package }}"
|
|
else
|
|
echo "packages=all" >> $GITHUB_OUTPUT
|
|
echo "has_updates=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
update-obs:
|
|
name: Upload to OBS
|
|
needs: check-updates
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: write
|
|
pull-requests: write
|
|
if: |
|
|
github.event.inputs.force_upload == 'true' ||
|
|
github.event_name == 'workflow_dispatch' ||
|
|
needs.check-updates.outputs.has_updates == 'true'
|
|
|
|
steps:
|
|
- name: Generate GitHub App Token
|
|
id: generate_token
|
|
uses: actions/create-github-app-token@v1
|
|
with:
|
|
app-id: ${{ secrets.APP_ID }}
|
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
token: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Check if last commit was automated
|
|
id: check-loop
|
|
run: |
|
|
LAST_COMMIT_MSG=$(git log -1 --pretty=%B | head -1)
|
|
if [[ "$LAST_COMMIT_MSG" == "ci: Auto-update PPA packages"* ]] || [[ "$LAST_COMMIT_MSG" == "ci: Auto-update OBS packages"* ]]; then
|
|
echo "⏭️ Last commit was automated ($LAST_COMMIT_MSG), skipping to prevent infinite loop"
|
|
echo "skip=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "✅ Last commit was not automated, proceeding"
|
|
echo "skip=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Determine packages to update
|
|
if: steps.check-loop.outputs.skip != 'true'
|
|
id: packages
|
|
run: |
|
|
if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" =~ ^refs/tags/ ]]; then
|
|
echo "packages=dms" >> $GITHUB_OUTPUT
|
|
VERSION="${GITHUB_REF#refs/tags/}"
|
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
echo "Triggered by tag: $VERSION"
|
|
elif [[ "${{ github.event_name }}" == "schedule" ]]; then
|
|
echo "packages=${{ needs.check-updates.outputs.packages }}" >> $GITHUB_OUTPUT
|
|
echo "Triggered by schedule: updating git package"
|
|
elif [[ -n "${{ github.event.inputs.package }}" ]]; then
|
|
echo "packages=${{ github.event.inputs.package }}" >> $GITHUB_OUTPUT
|
|
echo "Manual trigger: ${{ github.event.inputs.package }}"
|
|
else
|
|
echo "packages=${{ needs.check-updates.outputs.packages }}" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Update dms-git spec version
|
|
if: steps.check-loop.outputs.skip != 'true' && (contains(steps.packages.outputs.packages, 'dms-git') || steps.packages.outputs.packages == 'all')
|
|
run: |
|
|
# Get commit info for dms-git versioning
|
|
COMMIT_HASH=$(git rev-parse --short=8 HEAD)
|
|
COMMIT_COUNT=$(git rev-list --count HEAD)
|
|
BASE_VERSION=$(grep -oP '^Version:\s+\K[0-9.]+' distro/opensuse/dms.spec | head -1 || echo "0.6.2")
|
|
|
|
NEW_VERSION="${BASE_VERSION}+git${COMMIT_COUNT}.${COMMIT_HASH}"
|
|
echo "📦 Updating dms-git.spec to version: $NEW_VERSION"
|
|
|
|
# Update version in spec
|
|
sed -i "s/^Version:.*/Version: $NEW_VERSION/" distro/opensuse/dms-git.spec
|
|
|
|
# Add changelog entry
|
|
DATE_STR=$(date "+%a %b %d %Y")
|
|
CHANGELOG_ENTRY="* $DATE_STR Avenge Media <AvengeMedia.US@gmail.com> - ${NEW_VERSION}-1\n- Git snapshot (commit $COMMIT_COUNT: $COMMIT_HASH)"
|
|
sed -i "/%changelog/a\\$CHANGELOG_ENTRY" distro/opensuse/dms-git.spec
|
|
|
|
- name: Update Debian dms-git changelog version
|
|
if: steps.check-loop.outputs.skip != 'true' && (contains(steps.packages.outputs.packages, 'dms-git') || steps.packages.outputs.packages == 'all')
|
|
run: |
|
|
# Get commit info for dms-git versioning
|
|
COMMIT_HASH=$(git rev-parse --short=8 HEAD)
|
|
COMMIT_COUNT=$(git rev-list --count HEAD)
|
|
BASE_VERSION=$(grep -oP '^Version:\s+\K[0-9.]+' distro/opensuse/dms.spec | head -1 || echo "0.6.2")
|
|
|
|
# Debian version format: 0.6.2+git2256.9162e314
|
|
NEW_VERSION="${BASE_VERSION}+git${COMMIT_COUNT}.${COMMIT_HASH}"
|
|
echo "📦 Updating Debian dms-git changelog to version: $NEW_VERSION"
|
|
|
|
CHANGELOG_DATE=$(date -R)
|
|
|
|
CHANGELOG_FILE="distro/debian/dms-git/debian/changelog"
|
|
|
|
# Get current version from changelog
|
|
CURRENT_VERSION=$(head -1 "$CHANGELOG_FILE" | sed 's/.*(\([^)]*\)).*/\1/')
|
|
|
|
echo "Current Debian version: $CURRENT_VERSION"
|
|
echo "New version: $NEW_VERSION"
|
|
|
|
# Only update if version changed
|
|
if [ "$CURRENT_VERSION" != "$NEW_VERSION" ]; then
|
|
# Create new changelog entry at top
|
|
TEMP_CHANGELOG=$(mktemp)
|
|
|
|
cat > "$TEMP_CHANGELOG" << EOF
|
|
dms-git ($NEW_VERSION) nightly; urgency=medium
|
|
|
|
* Git snapshot (commit $COMMIT_COUNT: $COMMIT_HASH)
|
|
|
|
-- Avenge Media <AvengeMedia.US@gmail.com> $CHANGELOG_DATE
|
|
|
|
EOF
|
|
|
|
# Prepend to existing changelog
|
|
cat "$CHANGELOG_FILE" >> "$TEMP_CHANGELOG"
|
|
mv "$TEMP_CHANGELOG" "$CHANGELOG_FILE"
|
|
|
|
echo "✓ Updated Debian changelog: $CURRENT_VERSION → $NEW_VERSION"
|
|
else
|
|
echo "✓ Debian changelog already at version $NEW_VERSION"
|
|
fi
|
|
|
|
- name: Update dms stable version
|
|
if: steps.check-loop.outputs.skip != 'true' && steps.packages.outputs.version != ''
|
|
run: |
|
|
VERSION="${{ steps.packages.outputs.version }}"
|
|
VERSION_NO_V="${VERSION#v}"
|
|
echo "Updating packaging to version $VERSION_NO_V"
|
|
|
|
# Update openSUSE dms spec (stable only)
|
|
sed -i "s/^Version:.*/Version: $VERSION_NO_V/" distro/opensuse/dms.spec
|
|
|
|
# Update openSUSE spec changelog
|
|
DATE_STR=$(date "+%a %b %d %Y")
|
|
CHANGELOG_ENTRY="* $DATE_STR AvengeMedia <maintainer@avengemedia.com> - ${VERSION_NO_V}-1\\n- Update to stable $VERSION release\\n- Bug fixes and improvements"
|
|
sed -i "/%changelog/a\\$CHANGELOG_ENTRY\\n" distro/opensuse/dms.spec
|
|
|
|
# Update Debian _service files (both tar_scm and download_url formats)
|
|
for service in distro/debian/*/_service; do
|
|
if [[ -f "$service" ]]; then
|
|
# Update tar_scm revision parameter (for dms-git)
|
|
sed -i "s|<param name=\"revision\">v[0-9.]*</param>|<param name=\"revision\">$VERSION</param>|" "$service"
|
|
|
|
# Update download_url paths (for dms stable)
|
|
sed -i "s|/v[0-9.]\+/|/$VERSION/|g" "$service"
|
|
sed -i "s|/tags/v[0-9.]\+\.tar\.gz|/tags/$VERSION.tar.gz|g" "$service"
|
|
fi
|
|
done
|
|
|
|
# Update Debian changelog for dms stable
|
|
if [[ -f "distro/debian/dms/debian/changelog" ]]; then
|
|
CHANGELOG_DATE=$(date -R)
|
|
TEMP_CHANGELOG=$(mktemp)
|
|
|
|
cat > "$TEMP_CHANGELOG" << EOF
|
|
dms ($VERSION_NO_V) stable; urgency=medium
|
|
|
|
* Update to $VERSION stable release
|
|
* Bug fixes and improvements
|
|
|
|
-- Avenge Media <AvengeMedia.US@gmail.com> $CHANGELOG_DATE
|
|
|
|
EOF
|
|
|
|
cat "distro/debian/dms/debian/changelog" >> "$TEMP_CHANGELOG"
|
|
mv "$TEMP_CHANGELOG" "distro/debian/dms/debian/changelog"
|
|
|
|
echo "✓ Updated Debian changelog to $VERSION_NO_V"
|
|
fi
|
|
|
|
- name: Install Go
|
|
if: steps.check-loop.outputs.skip != 'true'
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: "1.24"
|
|
|
|
- name: Install OSC
|
|
if: steps.check-loop.outputs.skip != 'true'
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y osc
|
|
|
|
mkdir -p ~/.config/osc
|
|
cat > ~/.config/osc/oscrc << EOF
|
|
[general]
|
|
apiurl = https://api.opensuse.org
|
|
|
|
[https://api.opensuse.org]
|
|
user = ${{ secrets.OBS_USERNAME }}
|
|
pass = ${{ secrets.OBS_PASSWORD }}
|
|
EOF
|
|
chmod 600 ~/.config/osc/oscrc
|
|
|
|
- name: Upload to OBS
|
|
if: steps.check-loop.outputs.skip != 'true'
|
|
env:
|
|
FORCE_UPLOAD: ${{ github.event.inputs.force_upload }}
|
|
REBUILD_RELEASE: ${{ github.event.inputs.rebuild_release }}
|
|
run: |
|
|
PACKAGES="${{ steps.packages.outputs.packages }}"
|
|
MESSAGE="Automated update from GitHub Actions"
|
|
|
|
if [[ -n "${{ steps.packages.outputs.version }}" ]]; then
|
|
MESSAGE="Update to ${{ steps.packages.outputs.version }}"
|
|
fi
|
|
|
|
if [[ "$PACKAGES" == "all" ]]; then
|
|
bash distro/scripts/obs-upload.sh dms "$MESSAGE"
|
|
bash distro/scripts/obs-upload.sh dms-git "Automated git update"
|
|
else
|
|
bash distro/scripts/obs-upload.sh "$PACKAGES" "$MESSAGE"
|
|
fi
|
|
|
|
- name: Get changed packages
|
|
if: steps.check-loop.outputs.skip != 'true'
|
|
id: changed-packages
|
|
run: |
|
|
# Check if there are any changes to commit
|
|
if git diff --exit-code distro/debian/ distro/opensuse/ >/dev/null 2>&1; then
|
|
echo "has_changes=false" >> $GITHUB_OUTPUT
|
|
echo "📋 No changelog or spec changes to commit"
|
|
else
|
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
|
# Get list of changed packages for commit message
|
|
CHANGED_DEB=$(git diff --name-only distro/debian/ 2>/dev/null | grep 'debian/changelog' | xargs dirname 2>/dev/null | xargs dirname 2>/dev/null | xargs basename 2>/dev/null | tr '\n' ', ' | sed 's/, $//' || echo "")
|
|
CHANGED_SUSE=$(git diff --name-only distro/opensuse/ 2>/dev/null | grep '\.spec$' | sed 's|distro/opensuse/||' | sed 's/\.spec$//' | tr '\n' ', ' | sed 's/, $//' || echo "")
|
|
|
|
PKGS=$(echo "$CHANGED_DEB,$CHANGED_SUSE" | tr ',' '\n' | grep -v '^$' | sort -u | tr '\n' ',' | sed 's/,$//')
|
|
echo "packages=$PKGS" >> $GITHUB_OUTPUT
|
|
echo "📋 Changed packages: $PKGS"
|
|
fi
|
|
|
|
- name: Commit packaging changes
|
|
if: steps.check-loop.outputs.skip != 'true' && steps.changed-packages.outputs.has_changes == 'true'
|
|
run: |
|
|
git config user.name "dms-ci[bot]"
|
|
git config user.email "dms-ci[bot]@users.noreply.github.com"
|
|
git add distro/debian/*/debian/changelog distro/opensuse/*.spec
|
|
git commit -m "ci: Auto-update OBS packages [${{ steps.changed-packages.outputs.packages }}]" -m "🤖 Automated by GitHub Actions"
|
|
git pull --rebase origin master
|
|
git push
|
|
|
|
- name: Summary
|
|
run: |
|
|
echo "### OBS Package Update Complete" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "- **Packages**: ${{ steps.packages.outputs.packages }}" >> $GITHUB_STEP_SUMMARY
|
|
if [[ -n "${{ steps.packages.outputs.version }}" ]]; then
|
|
echo "- **Version**: ${{ steps.packages.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
fi
|
|
if [[ "${{ needs.check-updates.outputs.has_updates }}" == "false" ]]; then
|
|
echo "- **Status**: Skipped (no changes detected)" >> $GITHUB_STEP_SUMMARY
|
|
fi
|
|
echo "- **Project**: https://build.opensuse.org/project/show/home:AvengeMedia" >> $GITHUB_STEP_SUMMARY
|