name: Update OBS Packages on: workflow_dispatch: inputs: package: description: "Package to update (dms, dms-git, or all)" required: false default: "all" 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 [[ -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_name == 'workflow_dispatch' || needs.check-updates.outputs.has_updates == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - 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: | # 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 - ${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: 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 $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.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 - ${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|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 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 $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 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_REBUILD: ${{ github.event_name == 'workflow_dispatch' && 'true' || '' }} 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 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.changed-packages.outputs.has_changes == 'true' run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[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 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