diff --git a/.github/workflows/run-obs.yml b/.github/workflows/run-obs.yml index f9fb3a30..924a059f 100644 --- a/.github/workflows/run-obs.yml +++ b/.github/workflows/run-obs.yml @@ -18,9 +18,117 @@ on: - cron: '0 */3 * * *' # Every 3 hours for dms-git builds jobs: - update-obs: + 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 latest commit hash from master branch + LATEST_COMMIT=$(git rev-parse origin/master 2>/dev/null || git rev-parse master 2>/dev/null || echo "") + + if [[ -z "$LATEST_COMMIT" ]]; then + echo "has_updates=true" >> $GITHUB_OUTPUT + echo "Could not determine git commit, proceeding with update" + else + # 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 + + # Check tarball age - if older than 3 hours, update needed + if [[ -f "dms-git-source.tar.gz" ]]; then + TARBALL_MTIME=$(stat -c%Y "dms-git-source.tar.gz" 2>/dev/null || echo "0") + CURRENT_TIME=$(date +%s) + AGE_SECONDS=$((CURRENT_TIME - TARBALL_MTIME)) + AGE_HOURS=$((AGE_SECONDS / 3600)) + + # If tarball is older than 3 hours, check for new commits + if [[ $AGE_HOURS -ge 3 ]]; then + # Check if there are new commits in the last 3 hours + cd "${{ github.workspace }}" + NEW_COMMITS=$(git log --since="3 hours ago" --oneline origin/master 2>/dev/null | wc -l) + + if [[ $NEW_COMMITS -gt 0 ]]; then + echo "has_updates=true" >> $GITHUB_OUTPUT + echo "📋 New commits detected in last 3 hours, update needed" + else + echo "has_updates=false" >> $GITHUB_OUTPUT + echo "📋 No new commits in last 3 hours, skipping update" + fi + else + echo "has_updates=false" >> $GITHUB_OUTPUT + echo "📋 Recent upload exists (< 3 hours), skipping update" + fi + else + echo "has_updates=true" >> $GITHUB_OUTPUT + echo "📋 No existing tarball in OBS, update needed" + fi + cd "${{ github.workspace }}" + else + echo "has_updates=true" >> $GITHUB_OUTPUT + echo "📋 First upload to OBS, update needed" + fi + 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_name == 'workflow_dispatch' || + needs.check-updates.outputs.has_updates == 'true' + steps: - name: Checkout uses: actions/checkout@v4 @@ -36,13 +144,13 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Triggered by tag: $VERSION" elif [[ "${{ github.event_name }}" == "schedule" ]]; then - echo "packages=dms-git" >> $GITHUB_OUTPUT + 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=all" >> $GITHUB_OUTPUT + echo "packages=${{ needs.check-updates.outputs.packages }}" >> $GITHUB_OUTPUT fi - name: Update version in packaging files @@ -85,6 +193,7 @@ jobs: - 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 }}" @@ -111,4 +220,7 @@ jobs: 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 diff --git a/distro/scripts/obs-upload.sh b/distro/scripts/obs-upload.sh index f9504477..63f567ea 100644 --- a/distro/scripts/obs-upload.sh +++ b/distro/scripts/obs-upload.sh @@ -595,6 +595,9 @@ if [[ "$UPLOAD_DEBIAN" == true ]] && [[ "$SOURCE_FORMAT" == *"native"* ]] && [[ if [[ -n "${REBUILD_RELEASE:-}" ]]; then IS_MANUAL=true echo "==> Manual rebuild detected (REBUILD_RELEASE=$REBUILD_RELEASE)" + elif [[ -n "${FORCE_REBUILD:-}" ]] && [[ "${FORCE_REBUILD}" == "true" ]]; then + IS_MANUAL=true + echo "==> Manual workflow trigger detected (FORCE_REBUILD=true)" elif [[ -z "${GITHUB_ACTIONS:-}" ]] && [[ -z "${CI:-}" ]]; then IS_MANUAL=true echo "==> Local/manual run detected (not in CI)"