1+ name : Sync Dev to Main
2+
3+ on :
4+ # Manual trigger
5+ workflow_dispatch :
6+
7+ # Daily schedule at 2 AM UTC
8+ schedule :
9+ - cron : ' 0 2 * * *'
10+
11+ jobs :
12+ sync-branches :
13+ runs-on : ubuntu-latest
14+
15+ steps :
16+ - name : Checkout repository
17+ uses : actions/checkout@v4
18+ with :
19+ fetch-depth : 0
20+ token : ${{ secrets.GITHUB_TOKEN }}
21+
22+ - name : Configure Git
23+ run : |
24+ git config --global user.name "github-actions[bot]"
25+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
26+
27+ - name : Check if dev branch exists
28+ id : check_dev
29+ run : |
30+ if git show-ref --verify --quiet refs/remotes/origin/dev; then
31+ echo "dev_exists=true" >> $GITHUB_OUTPUT
32+ else
33+ echo "dev_exists=false" >> $GITHUB_OUTPUT
34+ fi
35+
36+ - name : Exit if dev branch doesn't exist
37+ if : steps.check_dev.outputs.dev_exists == 'false'
38+ run : |
39+ echo "Dev branch does not exist. Skipping sync."
40+ exit 0
41+
42+ - name : Check for changes between dev and main
43+ id : check_changes
44+ run : |
45+ # Fetch the latest changes from both branches
46+ git fetch origin dev
47+ git fetch origin main
48+
49+ # Check if there are any differences between remote branches
50+ if git diff --quiet origin/main origin/dev; then
51+ echo "has_changes=false" >> $GITHUB_OUTPUT
52+ echo "No changes detected between dev and main"
53+ else
54+ echo "has_changes=true" >> $GITHUB_OUTPUT
55+ echo "Changes detected between dev and main"
56+ fi
57+
58+ - name : Exit if no changes
59+ if : steps.check_changes.outputs.has_changes == 'false'
60+ run : |
61+ echo "No changes to sync. Exiting."
62+ exit 0
63+
64+ - name : Attempt merge
65+ id : merge
66+ run : |
67+ git checkout main
68+ git pull origin main
69+
70+ # Try to merge dev into main
71+ if git merge origin/dev --no-edit; then
72+ echo "merge_success=true" >> $GITHUB_OUTPUT
73+ echo "Merge completed successfully"
74+ else
75+ echo "merge_success=false" >> $GITHUB_OUTPUT
76+ echo "Merge failed due to conflicts"
77+ git merge --abort
78+ fi
79+
80+ - name : Push changes if merge succeeded
81+ if : steps.merge.outputs.merge_success == 'true'
82+ run : |
83+ git push origin main
84+ echo "Successfully synced dev to main"
0 commit comments