@@ -10,10 +10,13 @@ jobs:
10
10
runs-on : ubuntu-latest
11
11
outputs :
12
12
changes_detected : ${{ steps.check-changes.outputs.changes_detected }}
13
- changed_dir : ${{ steps.check-changes.outputs.changed_dir }}
13
+ changed_dirs : ${{ steps.check-changes.outputs.changed_dirs }}
14
14
branch_name : ${{ steps.create-branch.outputs.branch_name }}
15
15
pr_number : ${{ steps.create-pr.outputs.pr_number }}
16
- auto_merge : ${{ steps.check-changes.outputs.auto_merge }}
16
+ auto_merge : ${{ steps.load-config.outputs.auto_merge }}
17
+ user_name : ${{ steps.load-config.outputs.user_name }}
18
+ user_email : ${{ steps.load-config.outputs.user_email }}
19
+ dirs_length : ${{ steps.load-config.outputs.dirs_length }}
17
20
steps :
18
21
- uses : actions/checkout@v4
19
22
with :
@@ -36,30 +39,79 @@ jobs:
36
39
echo "::error::Config file not found: $config_abs. Please ensure .github/beta-bot.json exists in the repository."
37
40
exit 1
38
41
fi
42
+ user_name=$(jq -r '.git_user.name // "GitHub Actions"' "$config_abs")
43
+ user_email=$(jq -r '.git_user.email // "actions@github.com"' "$config_abs")
44
+ auto_merge=$(jq -r '.auto_merge // false' "$config_abs")
45
+ dirs_length=$(jq '.directories | length' "$config_abs")
46
+ dirs_json=$(jq -c '.directories' "$config_abs")
47
+ # Validate that each package has either tag or pattern, but not both
48
+ for i in $(seq 0 $(($dirs_length - 1))); do
49
+ pkgs_length=$(jq ".directories[$i].packages | length" "$config_abs")
50
+ for j in $(seq 0 $(($pkgs_length - 1))); do
51
+ pkg=$(jq -r ".directories[$i].packages[$j].name" "$config_abs")
52
+ has_tag=$(jq -r ".directories[$i].packages[$j].tag // null" "$config_abs")
53
+ has_pattern=$(jq -r ".directories[$i].packages[$j].pattern // null" "$config_abs")
54
+ if [ "$has_tag" != "null" ] && [ "$has_pattern" != "null" ]; then
55
+ echo "::error::Package $pkg in directory $i has both tag and pattern defined. Specify only one."
56
+ exit 1
57
+ fi
58
+ if [ "$has_tag" = "null" ] && [ "$has_pattern" = "null" ]; then
59
+ echo "::error::Package $pkg in directory $i has neither tag nor pattern defined. Specify one."
60
+ exit 1
61
+ fi
62
+ done
63
+ done
39
64
echo "Config file loaded: $config_abs"
40
65
echo "config_abs=$config_abs" >> $GITHUB_OUTPUT
66
+ echo "user_name=$user_name" >> $GITHUB_OUTPUT
67
+ echo "user_email=$user_email" >> $GITHUB_OUTPUT
68
+ echo "auto_merge=$auto_merge" >> $GITHUB_OUTPUT
69
+ echo "dirs_length=$dirs_length" >> $GITHUB_OUTPUT
70
+ echo "dirs_json=$dirs_json" >> $GITHUB_OUTPUT
71
+
72
+ - name : Configure Git identity
73
+ run : |
74
+ git config user.name "${{ steps.load-config.outputs.user_name }}"
75
+ git config user.email "${{ steps.load-config.outputs.user_email }}"
76
+ echo "Git identity configured: ${{ steps.load-config.outputs.user_name }} <${{ steps.load-config.outputs.user_email }}>"
41
77
42
78
- name : Process directories and packages
43
79
id : process-dirs
44
80
run : |
45
- config ="${{ steps.load-config.outputs.config_abs }}"
46
- dirs_length=$(jq '.directories | length' "$config")
81
+ dirs_length ="${{ steps.load-config.outputs.dirs_length }}"
82
+ dirs_json="${{ steps.load-config.outputs.dirs_json }}"
47
83
echo "Found $dirs_length directories in config"
48
84
for i in $(seq 0 $(($dirs_length - 1))); do
49
- dir=$(jq -r ".directories [$i].directory" "$config ")
85
+ dir=$(echo "$dirs_json" | jq -r ".[$i].directory")
50
86
if [ ! -d "$dir" ]; then
51
87
echo "Directory not found: $dir"
52
88
continue
53
89
fi
54
90
echo "Processing directory: $dir"
55
91
cd "$dir"
56
- pkgs_length=$(jq ".directories [$i].packages | length" "$config ")
92
+ pkgs_length=$(echo "$dirs_json" | jq ".[$i].packages | length")
57
93
echo "Found $pkgs_length packages in $dir"
58
94
for j in $(seq 0 $(($pkgs_length - 1))); do
59
- pkg=$(jq -r ".directories[$i].packages[$j].name" "$config")
60
- tag=$(jq -r ".directories[$i].packages[$j].tag" "$config")
61
- echo "Installing $pkg@$tag in $dir"
62
- npm install "$pkg@$tag" || { echo "Failed to install $pkg@$tag"; exit 1; }
95
+ pkg=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].name")
96
+ tag=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].tag // null")
97
+ pattern=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].pattern // null")
98
+ if [ "$tag" != "null" ]; then
99
+ latest_version=$(npm view "$pkg@$tag" version)
100
+ if [ -z "$latest_version" ]; then
101
+ echo "::error::No version found for $pkg@$tag"
102
+ exit 1
103
+ fi
104
+ echo "Installing $pkg@$latest_version in $dir"
105
+ npm install "$pkg@$latest_version" || { echo "::error::Failed to install $pkg@$latest_version"; exit 1; }
106
+ else
107
+ latest_version=$(npm view "$pkg" versions --json | jq -r ".[] | select(test(\"$pattern\"))" | sort -V | tail -n 1)
108
+ if [ -z "$latest_version" ]; then
109
+ echo "::error::No versions found for $pkg matching pattern $pattern"
110
+ exit 1
111
+ fi
112
+ echo "Installing $pkg@$latest_version in $dir"
113
+ npm install "$pkg@$latest_version" || { echo "::error::Failed to install $pkg@$latest_version"; exit 1; }
114
+ fi
63
115
done
64
116
cd - > /dev/null
65
117
echo "Completed processing $dir"
@@ -68,13 +120,12 @@ jobs:
68
120
- name : Check for changes
69
121
id : check-changes
70
122
run : |
71
- config="${{ steps.load-config.outputs.config_abs }}"
72
- auto_merge=$(jq -r ".auto_merge // false" "$config")
73
- dirs_length=$(jq '.directories | length' "$config")
123
+ dirs_length="${{ steps.load-config.outputs.dirs_length }}"
124
+ dirs_json="${{ steps.load-config.outputs.dirs_json }}"
74
125
changes_detected=false
75
- changed_dir =""
126
+ changed_dirs =""
76
127
for i in $(seq 0 $(($dirs_length - 1))); do
77
- dir=$(jq -r ".directories [$i].directory" "$config ")
128
+ dir=$(echo "$dirs_json" | jq -r ".[$i].directory")
78
129
if [ ! -d "$dir" ]; then
79
130
continue
80
131
fi
@@ -84,27 +135,26 @@ jobs:
84
135
else
85
136
echo "Changes detected in $dir"
86
137
changes_detected=true
87
- changed_dir="$dir"
88
- break # Stop at first change to handle one directory per run
138
+ if [ -z "$changed_dirs" ]; then
139
+ changed_dirs="$dir"
140
+ else
141
+ changed_dirs="$changed_dirs,$dir"
142
+ fi
143
+ git add package.json package-lock.json
89
144
fi
90
145
cd - > /dev/null
91
146
done
92
147
echo "changes_detected=$changes_detected" >> $GITHUB_OUTPUT
93
- echo "changed_dir=$changed_dir" >> $GITHUB_OUTPUT
94
- echo "auto_merge=$auto_merge" >> $GITHUB_OUTPUT
148
+ echo "changed_dirs=$changed_dirs" >> $GITHUB_OUTPUT
95
149
96
150
- name : Create and push branch
97
151
id : create-branch
98
152
if : steps.check-changes.outputs.changes_detected == 'true'
99
153
run : |
100
- dir ="${{ steps.check-changes.outputs.changed_dir }}"
154
+ changed_dirs ="${{ steps.check-changes.outputs.changed_dirs }}"
101
155
branch="update/beta-$(date +%s)"
102
- cd "$dir"
103
- git config user.name "GitHub Actions"
104
- git config user.email "actions@github.com"
105
156
git checkout -b "$branch"
106
- git add package.json package-lock.json
107
- git commit -m "Update beta dependencies in $dir"
157
+ git commit -m "Update beta dependencies in $changed_dirs"
108
158
git push origin "$branch"
109
159
echo "Branch pushed: $branch"
110
160
echo "branch_name=$branch" >> $GITHUB_OUTPUT
@@ -116,8 +166,8 @@ jobs:
116
166
if : steps.check-changes.outputs.changes_detected == 'true'
117
167
run : |
118
168
branch="${{ steps.create-branch.outputs.branch_name }}"
119
- dir ="${{ steps.check-changes.outputs.changed_dir }}"
120
- pr_url=$(gh pr create --title "Update beta dependencies in $dir " --body "Automated dependency update")
169
+ changed_dirs ="${{ steps.check-changes.outputs.changed_dirs }}"
170
+ pr_url=$(gh pr create --title "Update beta dependencies in $changed_dirs " --body "Automated dependency update")
121
171
pr_number="${pr_url##*/}"
122
172
echo "PR created: $pr_url"
123
173
echo "pr_number=$pr_number" >> $GITHUB_OUTPUT
@@ -126,12 +176,10 @@ jobs:
126
176
127
177
- name : Auto-merge PR
128
178
id : auto-merge
129
- if : steps.check-changes.outputs.changes_detected == 'true' && steps.check-changes .outputs.auto_merge == 'true'
179
+ if : steps.check-changes.outputs.changes_detected == 'true' && steps.load-config .outputs.auto_merge == 'true'
130
180
run : |
131
181
pr_number="${{ steps.create-pr.outputs.pr_number }}"
132
182
echo "Auto-merging PR #$pr_number"
133
- git config user.name "GitHub Actions"
134
- git config user.email "actions@github.com"
135
- gh pr merge "$pr_number" --merge --delete-branch || { echo "Failed to merge PR #$pr_number"; exit 1; }
183
+ gh pr merge "$pr_number" --merge --delete-branch || { echo "::error::Failed to merge PR #$pr_number"; exit 1; }
136
184
env :
137
185
GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments