[pull] main from forem:main #1
This file contains 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: CI | |
on: | |
pull_request: | |
branches: | |
- main | |
merge_group: | |
branches: | |
- main | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | |
env: | |
COVERAGE: true | |
RAILS_ENV: test | |
NODE_ENV: test | |
DATABASE_URL_TEST: postgres://postgres:postgres@localhost:5432/Forem_test | |
DATABASE_NAME_TEST: Forem_test | |
KNAPSACK_PRO_FIXED_QUEUE_SPLIT: true | |
POSTGRES_PASSWORD: postgres | |
KNAPSACK_PRO_LOG_LEVEL: info | |
YARN_ENABLE_HARDENED_MODE: 0 | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
env: | |
E2E: true | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- name: Cache pre-compiled assets | |
uses: actions/cache@v4 | |
id: assetscache | |
with: | |
path: | | |
public/assets | |
key: ${{ runner.os }}-compiled-assets-v3-${{ hashFiles('app/assets/**', 'app/javascript/**', '**/package.json', '**/yarn.lock') }} | |
restore-keys: ${{ runner.os }}-compiled-assets-v3- | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
if: steps.assetscache.outputs.cache-hit != 'true' | |
- run: yarn install --immutable | |
if: steps.assetscache.outputs.cache-hit != 'true' | |
- run: bundle exec rails assets:precompile | |
if: steps.assetscache.outputs.cache-hit != 'true' | |
audit: | |
runs-on: ubuntu-latest | |
needs: [build] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: setup ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- run: yarn install --immutable | |
- name: rubocop | |
uses: reviewdog/action-rubocop@v2 | |
with: | |
rubocop_version: gemfile | |
rubocop_extensions: rubocop-performance:gemfile rubocop-rails:gemfile rubocop-rspec:gemfile rubocop-capybara:gemfile | |
reporter: github-pr-review # Default is github-pr-check | |
- run: yarn lint:frontend | |
- run: bundle exec bundle-audit check --update --ignore CVE-2023-26141 | |
rspec: | |
runs-on: ubuntu-latest | |
needs: [build] | |
timeout-minutes: 20 | |
env: | |
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }} | |
KNAPSACK_PRO_CI_NODE_INDEX: ${{ matrix.ci_node_index }} | |
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: ${{ secrets.KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC }} | |
services: | |
postgres: | |
image: postgres:13-alpine | |
env: | |
POSTGRES_PASSWORD: postgres | |
ports: | |
- 5432:5432 | |
redis: | |
image: redis | |
ports: | |
- 6379:6379 | |
strategy: | |
fail-fast: false | |
matrix: | |
ci_node_total: [8] | |
ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Restore compiled assets | |
uses: actions/cache/restore@v4 | |
with: | |
fail-on-cache-miss: true | |
path: | | |
public/assets | |
key: ${{ runner.os }}-compiled-assets-v3-${{ hashFiles('app/assets/**', 'app/javascript/**', '**/package.json', '**/yarn.lock') }} | |
restore-keys: ${{ runner.os }}-compiled-assets-v3- | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- name: setup ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- run: bundle exec rails db:test:prepare | |
- name: RSpec | |
run: bin/knapsack_pro_rspec | |
- name: Upload RSpec artifacts | |
uses: actions/upload-artifact@v4 | |
if: failure() | |
with: | |
name: rspec-artifacts-${{ matrix.ci_node_index }} | |
path: tmp/capybara | |
- name: Rename folder | |
run: mv coverage/simplecov coverage/simplecov-${{ matrix.ci_node_index }} | |
- name: Upload test coverage result | |
uses: actions/upload-artifact@v4 | |
with: | |
name: coverage-rspec-${{ matrix.ci_node_index }} | |
path: coverage/ | |
- name: Upload test results to BuildPulse for flaky test detection | |
if: '!cancelled()' # Run this step even when the tests fail. Skip if the workflow is cancelled. | |
uses: Workshop64/buildpulse-action@master | |
with: | |
account: ${{ secrets.BUILDPULSE_ACCOUNT }} | |
repository: ${{ secrets.BUILDPULSE_REPOSITORY }} | |
path: tmp/rspec_final_results.xml | |
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }} | |
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }} | |
jest: | |
runs-on: ubuntu-latest | |
needs: [build] | |
timeout-minutes: 20 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- run: yarn install --immutable | |
- run: yarn test --colors --ci --reporters="jest-junit" --reporters="default" | |
- name: Upload test results to BuildPulse for flaky test detection | |
if: '!cancelled()' # Run this step even when the tests fail. Skip if the workflow is cancelled. | |
uses: Workshop64/buildpulse-action@master | |
with: | |
account: ${{ secrets.BUILDPULSE_ACCOUNT }} | |
repository: ${{ secrets.BUILDPULSE_REPOSITORY }} | |
path: junit.xml | |
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }} | |
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }} | |
- name: Upload test coverage result | |
uses: actions/upload-artifact@v4 | |
with: | |
name: coverage-jest | |
path: coverage/ | |
storybook: | |
runs-on: ubuntu-latest | |
needs: [build] | |
timeout-minutes: 20 | |
steps: | |
- uses: actions/checkout@v4 | |
- run: yarn install --immutable | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- run: yarn build-storybook | |
build_test: | |
runs-on: ubuntu-latest | |
needs: [build] | |
timeout-minutes: 20 | |
env: | |
RAILS_ENV: production | |
NODE_ENV: production | |
DATABASE_URL: postgres://postgres:postgres@localhost:5432/Forem_prod_test | |
DATABASE_NAME: Forem_prod_test | |
APP_PROTOCOL: http:// | |
APP_DOMAIN: localhost:3000 | |
HEROKU_APP_URL: practicaldev.herokuapp.com | |
SECRET_KEY_BASE: dummydummydummy | |
GITHUB_KEY: dummy | |
GITHUB_SECRET: dummy | |
YARN_ENABLE_HARDENED_MODE: 1 | |
services: | |
postgres: | |
image: postgres:13-alpine | |
env: | |
POSTGRES_PASSWORD: postgres | |
ports: | |
- 5432:5432 | |
redis: | |
image: redis | |
ports: | |
- 6379:6379 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- name: setup ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- run: yarn install --immutable | |
- run: bundle exec rails assets:precompile | |
- run: RAILS_ENV=test bin/test-console-check | |
cypress: | |
runs-on: ubuntu-latest | |
timeout-minutes: 20 | |
needs: [build] | |
env: | |
E2E: true | |
services: | |
postgres: | |
image: postgres:13-alpine | |
env: | |
POSTGRES_PASSWORD: postgres | |
ports: | |
- 5432:5432 | |
redis: | |
image: redis | |
ports: | |
- 6379:6379 | |
strategy: | |
fail-fast: false | |
matrix: | |
ci_node_total: [8] | |
ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7, non-seed] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Restore compiled assets | |
uses: actions/cache/restore@v4 | |
with: | |
fail-on-cache-miss: true | |
path: | | |
public/assets | |
key: ${{ runner.os }}-compiled-assets-v3-${{ hashFiles('app/assets/**', 'app/javascript/**', '**/package.json', '**/yarn.lock') }} | |
restore-keys: ${{ runner.os }}-compiled-assets-v3- | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: yarn | |
- run: yarn install --immutable | |
- name: setup ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- run: bundle exec rails db:test:prepare | |
- run: yarn cypress install | |
- name: cypress | |
env: | |
CYPRESS_RAILS_HOST: localhost | |
CYPRESS_RAILS_PORT: 3000 | |
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }} | |
KNAPSACK_PRO_CI_NODE_INDEX: ${{ matrix.ci_node_index }} | |
KNAPSACK_PRO_TEST_SUITE_TOKEN_CYPRESS: ${{ secrets.KNAPSACK_PRO_TEST_SUITE_TOKEN_CYPRESS }} | |
KNAPSACK_PRO_TEST_FILE_PATTERN: "cypress/e2e/seededFlows/**/*.spec.js" | |
run: bin/knapsack_pro_cypress | |
if: ${{ matrix.ci_node_index != 'non-seed' }} | |
- name: cypress non-seed | |
run: CREATOR_ONBOARDING_SEED_DATA=1 E2E_FOLDER=creatorOnboardingFlows E2E=true bin/rails cypress:run | |
if: ${{ matrix.ci_node_index == 'non-seed' }} | |
- name: Upload Cypress artifacts | |
uses: actions/upload-artifact@v4 | |
if: failure() | |
with: | |
name: cypress-artifacts-${{ matrix.ci_node_index }} | |
path: | | |
tmp/cypress_screenshots | |
cypress/logs | |
- name: Upload test results to BuildPulse for flaky test detection | |
if: '!cancelled()' # Run this step even when the tests fail. Skip if the workflow is cancelled. | |
uses: Workshop64/buildpulse-action@master | |
with: | |
account: ${{ secrets.BUILDPULSE_ACCOUNT }} | |
repository: ${{ secrets.BUILDPULSE_REPOSITORY }} | |
path: cypress/results | |
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }} | |
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }} | |
upload-coverage: | |
runs-on: ubuntu-latest | |
needs: [rspec, jest, cypress] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: coverage-* | |
merge-multiple: true | |
- run: | | |
mkdir coverage coverage/simplecov coverage/cypress | |
mv simplecov-* coverage/simplecov | |
mv jest coverage/jest | |
- uses: Wandalen/wretry.action@master | |
with: | |
action: codecov/codecov-action@v4 | |
with: | | |
flags: ruby | |
directory: coverage/simplecov | |
fail_ci_if_error: ${{ github.ref != 'refs/heads/main' }} | |
token: ${{ secrets.CODECOV_TOKEN }} | |
attempt_limit: 5 | |
attempt_delay: 60000 | |
- uses: Wandalen/wretry.action@master | |
with: | |
action: codecov/codecov-action@v4 | |
with: | | |
flags: jest, javascript | |
directory: coverage/jest | |
fail_ci_if_error: ${{ github.ref != 'refs/heads/main' }} | |
token: ${{ secrets.CODECOV_TOKEN }} | |
attempt_limit: 5 | |
attempt_delay: 60000 | |
CI-status-report: | |
runs-on: ubuntu-latest | |
needs: [rspec, jest, cypress, build_test, audit, storybook] | |
if: always() | |
steps: | |
- name: Decide whether the needed jobs succeeded or failed | |
uses: re-actors/alls-green@release/v1 | |
with: | |
jobs: ${{ toJSON(needs) }} |