name: CI Pipeline for the Backend and Frontend on: pull_request: types: [opened, review_requested, synchronize] jobs: backend: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: node: ["20", "21"] flavor: ["dev", "prod"] fail-fast: false runs-on: "ubuntu-latest" name: Backend (${{ matrix.flavor }}) - node ${{ matrix.node }} steps: - name: Checkout uses: actions/checkout@v3 with: path: ${{ matrix.node }}/${{ matrix.flavor }} - name: Setup Node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} registry-url: "https://registry.npmjs.org" - name: Read rust-toolchain file from repository id: gettoolchain run: echo "::set-output name=toolchain::$(cat ./rust/gbt/rust-toolchain)" working-directory: ${{ matrix.node }}/${{ matrix.flavor }} - name: Install ${{ steps.gettoolchain.outputs.toolchain }} Rust toolchain # Latest version available on this commit is 1.71.1 # Commit date is Aug 3, 2023 uses: dtolnay/rust-toolchain@dc6353516c68da0f06325f42ad880f76a5e77ec9 with: toolchain: ${{ steps.gettoolchain.outputs.toolchain }} - name: Install if: ${{ matrix.flavor == 'dev'}} run: npm ci working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend - name: Install (Prod dependencies only) if: ${{ matrix.flavor == 'prod'}} run: npm ci --omit=dev --omit=optional working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend - name: Lint if: ${{ matrix.flavor == 'dev'}} run: npm run lint working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend - name: Unit Tests if: ${{ matrix.flavor == 'dev'}} run: npm run test:ci working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend - name: Build run: npm run build working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend cache: name: "Cache assets for builds" runs-on: "ubuntu-latest" steps: - name: Checkout uses: actions/checkout@v3 with: path: assets - name: Setup Node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} registry-url: "https://registry.npmjs.org" - name: Install (Prod dependencies only) run: npm ci --omit=dev --omit=optional working-directory: assets/frontend - name: Restore cached mining pool assets continue-on-error: true id: cache-mining-pool-restore uses: actions/cache/restore@v4 with: path: | mining-pool-assets.zip key: mining-pool-assets-cache - name: Restore promo video assets continue-on-error: true id: cache-promo-video-restore uses: actions/cache/restore@v4 with: path: | promo-video-assets.zip key: promo-video-assets-cache - name: Unzip assets before building (src/resources) continue-on-error: true run: unzip -o mining-pool-assets.zip -d assets/frontend/src/resources/mining-pools - name: Unzip assets before building (src/resources) continue-on-error: true run: unzip -o promo-video-assets.zip -d assets/frontend/src/resources/promo-video # - name: Unzip assets before building (dist) # continue-on-error: true # run: unzip assets.zip -d assets/frontend/dist/mempool/browser/resources - name: Sync-assets run: npm run sync-assets-dev env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} MEMPOOL_CDN: 1 VERBOSE: 1 working-directory: assets/frontend - name: Zip mining-pool assets run: zip -jrq mining-pool-assets.zip assets/frontend/src/resources/mining-pools/* - name: Zip promo-video assets run: zip -jrq promo-video-assets.zip assets/frontend/src/resources/promo-video/* - name: Upload mining pool assets as artifact uses: actions/upload-artifact@v4 with: name: mining-pool-assets path: mining-pool-assets.zip - name: Upload promo video assets as artifact uses: actions/upload-artifact@v4 with: name: promo-video-assets path: promo-video-assets.zip - name: Save mining pool assets cache id: cache-mining-pool-save uses: actions/cache/save@v4 with: path: | mining-pool-assets.zip key: mining-pool-assets-cache - name: Save promo video assets cache id: cache-promo-video-save uses: actions/cache/save@v4 with: path: | promo-video-assets.zip key: promo-video-assets-cache frontend: needs: cache if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: node: ["20", "21"] flavor: ["dev", "prod"] fail-fast: false runs-on: "ubuntu-latest" name: Frontend (${{ matrix.flavor }}) - node ${{ matrix.node }} steps: - name: Checkout uses: actions/checkout@v3 with: path: ${{ matrix.node }}/${{ matrix.flavor }} - name: Setup Node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} registry-url: "https://registry.npmjs.org" - name: Install (Prod dependencies only) run: npm ci --omit=dev --omit=optional if: ${{ matrix.flavor == 'prod'}} working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend - name: Install if: ${{ matrix.flavor == 'dev'}} run: npm ci working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend - name: Lint if: ${{ matrix.flavor == 'dev'}} run: npm run lint working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend # - name: Test # run: npm run test - name: Restore cached mining pool assets continue-on-error: true id: cache-mining-pool-restore uses: actions/cache/restore@v4 with: path: | mining-pool-assets.zip key: mining-pool-assets-cache - name: Restore promo video assets continue-on-error: true id: cache-promo-video-restore uses: actions/cache/restore@v4 with: path: | promo-video-assets.zip key: promo-video-assets-cache - name: Download artifact uses: actions/download-artifact@v4 with: name: mining-pool-assets - name: Unzip assets before building (src/resources) run: unzip -o mining-pool-assets.zip -d ${{ matrix.node }}/${{ matrix.flavor }}/frontend/src/resources/mining-pools - name: Download artifact uses: actions/download-artifact@v4 with: name: promo-video-assets - name: Unzip assets before building (src/resources) run: unzip -o promo-video-assets.zip -d ${{ matrix.node }}/${{ matrix.flavor }}/frontend/src/resources/promo-video # - name: Unzip assets before building (dist) # run: unzip assets.zip -d ${{ matrix.node }}/${{ matrix.flavor }}/frontend/dist/mempool/browser/resources - name: Display resulting source tree run: ls -R - name: Build run: npm run build working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} MEMPOOL_CDN: 1 VERBOSE: 1 e2e: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" runs-on: "ubuntu-latest" needs: frontend strategy: fail-fast: false matrix: module: ["mempool", "liquid"] include: - module: "mempool" spec: | cypress/e2e/mainnet/*.spec.ts cypress/e2e/signet/*.spec.ts cypress/e2e/testnet/*.spec.ts - module: "liquid" spec: | cypress/e2e/liquid/liquid.spec.ts cypress/e2e/liquidtestnet/liquidtestnet.spec.ts name: E2E tests for ${{ matrix.module }} steps: - name: Checkout uses: actions/checkout@v3 with: path: ${{ matrix.module }} - name: Setup node uses: actions/setup-node@v3 with: node-version: 20 cache: "npm" cache-dependency-path: ${{ matrix.module }}/frontend/package-lock.json - name: Restore cached mining pool assets continue-on-error: true id: cache-mining-pool-restore uses: actions/cache/restore@v4 with: path: | mining-pool-assets.zip key: mining-pool-assets-cache - name: Restore cached promo video assets continue-on-error: true id: cache-promo-video-restore uses: actions/cache/restore@v4 with: path: | promo-video-assets.zip key: promo-video-assets-cache - name: Download artifact uses: actions/download-artifact@v4 with: name: mining-pool-assets - name: Unzip assets before building (src/resources) run: unzip -o mining-pool-assets.zip -d ${{ matrix.module }}/frontend/src/resources/mining-pools - name: Download artifact uses: actions/download-artifact@v4 with: name: promo-video-assets - name: Unzip assets before building (src/resources) run: unzip -o promo-video-assets.zip -d ${{ matrix.module }}/frontend/src/resources/promo-video - name: Chrome browser tests (${{ matrix.module }}) uses: cypress-io/github-action@v5 with: tag: ${{ github.event_name }} working-directory: ${{ matrix.module }}/frontend build: npm run config:defaults:${{ matrix.module }} start: npm run start:local-staging wait-on: "http://localhost:4200" wait-on-timeout: 120 record: true parallel: true spec: ${{ matrix.spec }} group: Tests on Chrome (${{ matrix.module }}) browser: "chrome" ci-build-id: "${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}" env: COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }} validate_docker_json: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" runs-on: "ubuntu-latest" name: Validate generated backend Docker JSON steps: - name: Checkout uses: actions/checkout@v3 with: path: docker - name: Install jq run: sudo apt-get install jq -y - name: Create new start script to run on CI run: | sed '$d' start.sh > start_ci.sh working-directory: docker/docker/backend - name: Run the script to generate the sample JSON run: | sh start_ci.sh working-directory: docker/docker/backend - name: Validate JSON syntax run: | cat mempool-config.json | jq working-directory: docker/docker/backend