@@ -20,17 +20,17 @@ jobs:
2020 check_bot_commit :
2121 uses : ./.github/workflows/check-bot-commit.yml
2222
23- check_package_json :
23+ check_assets_changes :
2424 permissions :
2525 contents : read
2626 runs-on : ubuntu-24.04
27- name : Check package.json
27+ name : Check assets changes
2828 steps :
2929 - uses : actions/checkout@v6
3030 with :
3131 fetch-depth : 0 # Fetch all history
3232 - name : Get changed files
33- id : changed-package-json
33+ id : changed-files
3434 run : |
3535 if [ "${{ github.event_name }}" = "pull_request" ]; then
3636 BASE_SHA="${{ github.event.pull_request.base.sha }}"
@@ -39,21 +39,21 @@ jobs:
3939 fi
4040 git diff --name-only "$BASE_SHA" ${{ github.sha }} > changed_files
4141 cat changed_files
42- if grep -q package.json changed_files; then
42+ if grep -qE '( package\ .json|^app/javascript/|^app/stylesheets/)' changed_files; then
4343 echo "any_changed=true" > $GITHUB_OUTPUT
4444 else
4545 echo "any_changed=false" > $GITHUB_OUTPUT
4646 fi
4747 outputs :
48- package_json_changed : ${{ steps.changed-package-json .outputs.any_changed }}
48+ assets_changed : ${{ steps.changed-files .outputs.any_changed }}
4949
5050 build_javascript :
5151 permissions :
5252 contents : read
5353 runs-on : ubuntu-24.04
5454 name : Build JS packages
55- needs : check_package_json
56- if : needs.check_package_json .outputs.package_json_changed == 'true'
55+ needs : check_assets_changes
56+ if : needs.check_assets_changes .outputs.assets_changed == 'true'
5757 steps :
5858 - uses : actions/checkout@v6
5959 - name : Setup Bun
@@ -71,47 +71,20 @@ jobs:
7171 run : bun run --bun build
7272 - uses : actions/upload-artifact@v4
7373 with :
74- name : javascript-bundles
75- path : vendor/javascript
76- - uses : actions/upload-artifact@v4
77- with :
78- name : bun-lock
79- path : bun.lock
80-
81- check_build_artifacts :
82- permissions :
83- contents : read
84- runs-on : ubuntu-24.04
85- name : Check build artifacts are up to date
86- steps :
87- - uses : actions/checkout@v6
88- - name : Setup Bun
89- uses : oven-sh/setup-bun@v2
90- - name : Restore node_modules cache
91- uses : actions/cache@v4
92- with :
93- path : node_modules
94- key : ${{ runner.os }}-node-modules-${{ hashFiles('package.json', 'bun.lock') }}
95- restore-keys : |
96- ${{ runner.os }}-node-modules
97- - name : Install dependencies
98- run : bun install
99- - name : Build all artifacts
100- run : bun run --bun build
101- - name : Check for uncommitted changes
102- run : |
103- git diff --exit-code app/assets/builds/alchemy/alchemy_admin.min.js || (echo "ERROR: alchemy_admin.min.js is out of date. Run 'bun run build:admin' and commit the result." && exit 1)
104- git diff --exit-code app/assets/builds/alchemy/admin.css || (echo "ERROR: admin.css is out of date. Run 'bun run build:css' and commit the result." && exit 1)
74+ name : build-artifacts
75+ path : |
76+ vendor/javascript
77+ app/assets/builds/alchemy/
78+ bun.lock
10579
10680 RSpec :
10781 permissions :
10882 contents : read
109- needs : [check_package_json , build_javascript, check_bot_commit, check_build_artifacts ]
83+ needs : [check_assets_changes , build_javascript, check_bot_commit]
11084 if : >
11185 always() &&
11286 needs.check_bot_commit.outputs.is_bot != 'true' &&
113- (needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped') &&
114- needs.check_build_artifacts.result == 'success'
87+ (needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped')
11588 runs-on : ubuntu-24.04
11689 strategy :
11790 fail-fast : false
@@ -225,10 +198,9 @@ jobs:
225198 sudo apt-get update -qq
226199 sudo apt-get install -qq --fix-missing imagemagick
227200 - uses : actions/download-artifact@v4
228- if : needs.check_package_json .outputs.package_json_changed == 'true'
201+ if : needs.check_assets_changes .outputs.assets_changed == 'true'
229202 with :
230- name : javascript-bundles
231- path : vendor/javascript
203+ name : build-artifacts
232204 - name : Prepare database
233205 run : |
234206 bundle exec rake alchemy:spec:prepare
@@ -255,22 +227,21 @@ jobs:
255227 permissions :
256228 contents : read
257229 runs-on : ubuntu-24.04
258- needs : [check_package_json , build_javascript, check_bot_commit, check_build_artifacts ]
230+ needs : [check_assets_changes , build_javascript, check_bot_commit]
259231 if : >
260232 always() &&
261233 needs.check_bot_commit.outputs.is_bot != 'true' &&
262- (needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped') &&
263- needs.check_build_artifacts.result == 'success'
234+ (needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped')
264235 env :
265236 NODE_ENV : test
266237 steps :
267238 - uses : actions/checkout@v6
268239 - name : Setup Bun
269240 uses : oven-sh/setup-bun@v2
270241 - uses : actions/download-artifact@v4
271- if : needs.check_package_json .outputs.package_json_changed == 'true'
242+ if : needs.check_assets_changes .outputs.assets_changed == 'true'
272243 with :
273- name : bun-lock
244+ name : build-artifacts
274245 - name : Restore node modules cache
275246 uses : actions/cache@v4
276247 with :
@@ -286,16 +257,55 @@ jobs:
286257 build-test-success :
287258 name : " Build & Test Success"
288259 if : always()
289- needs : [check_bot_commit, RSpec, Vitest, check_build_artifacts ]
260+ needs : [check_bot_commit, RSpec, Vitest]
290261 runs-on : ubuntu-latest
291262 permissions :
292263 contents : read
293264 steps :
294265 - name : Check results
295266 run : |
296- for result in "${{ needs.RSpec.result }}" "${{ needs.Vitest.result }}" "${{ needs.check_build_artifacts.result }}" ; do
267+ for result in "${{ needs.RSpec.result }}" "${{ needs.Vitest.result }}"; do
297268 if [[ "$result" != "success" && "$result" != "skipped" ]]; then
298269 echo "Failed: $result"
299270 exit 1
300271 fi
301272 done
273+
274+ push_assets :
275+ name : Push build artifacts
276+ needs : [check_assets_changes, build_javascript, build-test-success]
277+ if : >
278+ needs.check_assets_changes.outputs.assets_changed == 'true' &&
279+ needs.build_javascript.result == 'success' &&
280+ needs.build-test-success.result == 'success' &&
281+ github.event_name == 'pull_request'
282+ permissions :
283+ contents : write
284+ runs-on : ubuntu-24.04
285+ steps :
286+ - name : Generate token
287+ id : generate_token
288+ uses : actions/create-github-app-token@v2
289+ with :
290+ app-id : ${{ vars.ALCHEMY_BOT_APP_ID }}
291+ private-key : ${{ secrets.ALCHEMY_BOT_APP_PRIVATE_KEY }}
292+ - uses : actions/checkout@v6
293+ with :
294+ token : ${{ steps.generate_token.outputs.token }}
295+ ref : ${{ github.head_ref }}
296+ persist-credentials : false
297+ fetch-depth : 0
298+ - uses : actions/download-artifact@v4
299+ with :
300+ name : build-artifacts
301+ - name : Check for changes
302+ id : git-status
303+ run : git diff --quiet vendor/javascript app/assets/builds/alchemy/ bun.lock || echo "changed=true" >> $GITHUB_OUTPUT
304+ - name : Commit and push
305+ if : steps.git-status.outputs.changed == 'true'
306+ run : |
307+ git config --local user.name 'AlchemyCMS - CI Bot'
308+ git config --local user.email 'alchemy@blish.cloud'
309+ git add vendor/javascript app/assets/builds/alchemy/ bun.lock
310+ git commit -m "Update build artifacts" -m "Rebuilt assets after source or dependency changes."
311+ git push https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git HEAD:${{ github.head_ref }}
0 commit comments