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: Check for updates id: check env: OBS_USERNAME: ${{ secrets.OBS_USERNAME }} OBS_PASSWORD: ${{ secrets.OBS_PASSWORD }} 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) # Query OBS API for current spec file version # Format: Version: 1.0.2+git2528.d336866f OBS_SPEC=$(curl -s -u "$OBS_USERNAME:$OBS_PASSWORD" "https://api.opensuse.org/source/home:AvengeMedia:dms-git/dms-git/dms-git.spec" 2>/dev/null || echo "") if [[ -n "$OBS_SPEC" && "$OBS_SPEC" != *"error"* ]]; then # Extract commit hash from Version line (e.g., d336866f from 1.0.2+git2528.d336866f) OBS_COMMIT=$(echo "$OBS_SPEC" | grep "^Version:" | 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 "📋 Could not fetch OBS spec, proceeding with update" 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 if: | github.event.inputs.force_upload == 'true' || github.event_name == 'workflow_dispatch' || needs.check-updates.outputs.has_updates == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine packages to update 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: contains(steps.packages.outputs.packages, 'dms-git') || steps.packages.outputs.packages == 'all' run: | 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" sed -i "s/^Version:.*/Version: $NEW_VERSION/" distro/opensuse/dms-git.spec # Single changelog entry (git snapshots don't need history) DATE_STR=$(date "+%a %b %d %Y") LOCAL_SPEC_HEAD=$(sed -n '1,/%changelog/{ /%changelog/d; p }' distro/opensuse/dms-git.spec) { echo "$LOCAL_SPEC_HEAD" echo "%changelog" echo "* $DATE_STR Avenge Media - ${NEW_VERSION}-1" echo "- Git snapshot (commit $COMMIT_COUNT: $COMMIT_HASH)" } > distro/opensuse/dms-git.spec - name: Update Debian dms-git changelog version if: contains(steps.packages.outputs.packages, 'dms-git') || steps.packages.outputs.packages == 'all' run: | 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 Debian dms-git changelog to version: $NEW_VERSION" # Single changelog entry (git snapshots don't need history) CHANGELOG_DATE=$(date -R) { echo "dms-git ($NEW_VERSION) nightly; urgency=medium" echo "" echo " * Git snapshot (commit $COMMIT_COUNT: $COMMIT_HASH)" echo "" echo " -- Avenge Media $CHANGELOG_DATE" } > "distro/debian/dms-git/debian/changelog" - name: Update dms stable version if: steps.packages.outputs.version != '' run: | VERSION="${{ steps.packages.outputs.version }}" VERSION_NO_V="${VERSION#v}" echo "Updating packaging to version $VERSION_NO_V" sed -i "s/^Version:.*/Version: $VERSION_NO_V/" distro/opensuse/dms.spec # Single changelog entry (full history on OBS website) DATE_STR=$(date "+%a %b %d %Y") LOCAL_SPEC_HEAD=$(sed -n '1,/%changelog/{ /%changelog/d; p }' distro/opensuse/dms.spec) { echo "$LOCAL_SPEC_HEAD" echo "%changelog" echo "* $DATE_STR AvengeMedia - ${VERSION_NO_V}-1" echo "- Update to stable $VERSION release" } > 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|v[0-9.]*|$VERSION|" "$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 (single entry, history on OBS website) if [[ -f "distro/debian/dms/debian/changelog" ]]; then CHANGELOG_DATE=$(date -R) { echo "dms ($VERSION_NO_V) stable; urgency=medium" echo "" echo " * Update to $VERSION stable release" echo "" echo " -- Avenge Media $CHANGELOG_DATE" } > "distro/debian/dms/debian/changelog" echo "✓ Updated Debian changelog to $VERSION_NO_V" fi - name: Install Go uses: actions/setup-go@v5 with: go-version: "1.24" - 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: Upload to OBS 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: 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