Skip to content

Preview time select #3161

Preview time select

Preview time select #3161

Workflow file for this run

name: Build & Test
concurrency:
group: test-${{ github.ref_name }}
cancel-in-progress: ${{ github.ref_name != 'main' }}
on:
push:
branches:
- main
- 8.0-stable
- 7.4-stable
- 7.3-stable
- 7.2-stable
- 7.1-stable
- 7.0-stable
pull_request:
jobs:
check_bot_commit:
uses: ./.github/workflows/check-bot-commit.yml
check_assets_changes:
permissions:
contents: read
runs-on: ubuntu-24.04
name: Check assets changes
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # Fetch all history
- name: Get changed files
id: changed-files
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
BASE_SHA="${{ github.event.pull_request.base.sha }}"
else
BASE_SHA="${{ github.event.before }}"
fi
git diff --name-only "$BASE_SHA" ${{ github.sha }} > changed_files
cat changed_files
if grep -qE '(package\.json|^app/javascript/|^app/stylesheets/)' changed_files; then
echo "any_changed=true" > $GITHUB_OUTPUT
else
echo "any_changed=false" > $GITHUB_OUTPUT
fi
outputs:
assets_changed: ${{ steps.changed-files.outputs.any_changed }}
build_javascript:
permissions:
contents: read
runs-on: ubuntu-24.04
name: Build JS packages
needs: check_assets_changes
if: needs.check_assets_changes.outputs.assets_changed == 'true'
steps:
- uses: actions/checkout@v6
- name: Setup Bun
uses: oven-sh/setup-bun@v2
- name: Restore node_modules cache
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-modules-${{ hashFiles('package.json', 'bun.lock') }}
restore-keys: |
${{ runner.os }}-node-modules
- name: Install dependencies
run: bun install
- name: bun build
run: bun run --bun build
- uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: |
vendor/javascript
app/assets/builds/alchemy/
bun.lock
RSpec:
permissions:
contents: read
needs: [check_assets_changes, build_javascript, check_bot_commit]
if: >
always() &&
needs.check_bot_commit.outputs.is_bot != 'true' &&
(needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped')
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- rails: "7.2"
ruby: "3.2"
database: mariadb
storage: dragonfly
- rails: "7.2"
ruby: "3.3"
database: postgresql
storage: active_storage
- rails: "7.2"
ruby: "3.4"
database: sqlite
storage: dragonfly
- rails: "8.0"
ruby: "3.4"
database: postgresql
storage: active_storage
- rails: "8.0"
ruby: "3.4"
database: mariadb
storage: dragonfly
- rails: "8.0"
ruby: "3.4"
database: sqlite
storage: active_storage
- rails: "8.0"
ruby: "4.0"
database: postgresql
storage: active_storage
experimental: true
- rails: "8.1"
ruby: "3.4"
database: postgresql
storage: active_storage
- rails: "8.1"
ruby: "3.4"
database: mariadb
storage: dragonfly
- rails: "8.1"
ruby: "3.4"
database: sqlite
storage: active_storage
continue-on-error: ${{ matrix.experimental == true }}
env:
DB: ${{ matrix.database }}
DB_USER: alchemy_user
DB_PASSWORD: password
DB_HOST: "127.0.0.1"
DEBIAN_FRONTEND: noninteractive
RAILS_ENV: test
RAILS_VERSION: ${{ matrix.rails }}
ALCHEMY_STORAGE_ADAPTER: ${{ matrix.storage }}
RUBY_YJIT_ENABLE: "1"
services:
postgres:
image: postgres:17
env:
POSTGRES_USER: alchemy_user
POSTGRES_PASSWORD: password
POSTGRES_DB: alchemy_cms_dummy_test
ports: ["5432:5432"]
options: --health-cmd pg_isready --health-interval 1s --health-timeout 1s --health-retries 30
mariadb:
image: mariadb:latest
ports: ["3307:3306"]
env:
MARIADB_USER: alchemy_user
MARIADB_PASSWORD: password
MARIADB_DATABASE: alchemy_cms_dummy_test
MARIADB_ROOT_PASSWORD: password
options: --health-cmd="mariadb-admin ping" --health-interval=1s --health-timeout=1s --health-retries=30
steps:
- uses: actions/checkout@v6
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
rubygems: "latest"
- name: Restore apt cache
id: apt-cache
uses: actions/cache@v4
with:
path: /var/cache/apt/archives
key: ${{ runner.os }}-apt-v2-${{ matrix.database }}-${{ matrix.storage }}
restore-keys: |
${{ runner.os }}-apt-v2-${{ matrix.database }}-
- name: Install Postgres headers
if: matrix.database == 'postgresql'
run: |
sudo apt-get update -qq
sudo apt-get install -qq --fix-missing libpq-dev
- name: Install MariaDB headers
if: matrix.database == 'mariadb'
run: |
sudo apt-get update -qq
sudo apt-get install -qq --fix-missing libmysqlclient-dev
- name: Install libvips
if: matrix.storage == 'active_storage'
run: |
sudo apt-get update -qq
sudo apt-get install -qq --fix-missing libvips
- name: Install ImageMagick
if: matrix.storage == 'dragonfly'
run: |
sudo apt-get update -qq
sudo apt-get install -qq --fix-missing imagemagick
- uses: actions/download-artifact@v4
if: needs.check_assets_changes.outputs.assets_changed == 'true'
with:
name: build-artifacts
- name: Prepare database
run: |
bundle exec rake alchemy:spec:prepare
- name: Run tests
run: |
bundle exec rspec
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
if: matrix.rails == '8.0' && matrix.ruby == '3.4'
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: AlchemyCMS/alchemy_cms
disable_search: true
files: ./coverage/coverage.xml
- uses: actions/upload-artifact@v4
if: failure()
with:
name: Screenshots-${{ matrix.database }}-${{ matrix.ruby }}-${{ matrix.rails }}
path: |
spec/dummy/tmp/capybara
spec/dummy/tmp/screenshots
Vitest:
permissions:
contents: read
runs-on: ubuntu-24.04
needs: [check_assets_changes, build_javascript, check_bot_commit]
if: >
always() &&
needs.check_bot_commit.outputs.is_bot != 'true' &&
(needs.build_javascript.result == 'success' || needs.build_javascript.result == 'skipped')
env:
NODE_ENV: test
steps:
- uses: actions/checkout@v6
- name: Setup Bun
uses: oven-sh/setup-bun@v2
- uses: actions/download-artifact@v4
if: needs.check_assets_changes.outputs.assets_changed == 'true'
with:
name: build-artifacts
- name: Restore node modules cache
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('package.json', 'bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
- name: Run vitest
run: bun run test
build-test-success:
name: "Build & Test Success"
if: always()
needs: [check_bot_commit, RSpec, Vitest]
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Check results
run: |
for result in "${{ needs.RSpec.result }}" "${{ needs.Vitest.result }}"; do
if [[ "$result" != "success" && "$result" != "skipped" ]]; then
echo "Failed: $result"
exit 1
fi
done
push_assets:
name: Push build artifacts
needs: [check_assets_changes, build_javascript, build-test-success]
if: >
needs.check_assets_changes.outputs.assets_changed == 'true' &&
needs.build_javascript.result == 'success' &&
needs.build-test-success.result == 'success' &&
github.event_name == 'pull_request'
permissions:
contents: write
runs-on: ubuntu-24.04
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.ALCHEMY_BOT_APP_ID }}
private-key: ${{ secrets.ALCHEMY_BOT_APP_PRIVATE_KEY }}
- uses: actions/checkout@v6
with:
token: ${{ steps.generate_token.outputs.token }}
ref: ${{ github.head_ref }}
persist-credentials: false
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
name: build-artifacts
- name: Check for changes
id: git-status
run: git diff --quiet vendor/javascript app/assets/builds/alchemy/ bun.lock || echo "changed=true" >> $GITHUB_OUTPUT
- name: Commit and push
if: steps.git-status.outputs.changed == 'true'
run: |
git config --local user.name 'AlchemyCMS - CI Bot'
git config --local user.email 'alchemy@blish.cloud'
git add vendor/javascript app/assets/builds/alchemy/ bun.lock
git commit -m "Update build artifacts" -m "Rebuilt assets after source or dependency changes."
git push https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/${{ github.repository }}.git HEAD:${{ github.head_ref }}