Preview time select #3161
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }} |