363 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
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@d8352f6b1d2e870bc5716e7a6d9b65c4cc244a1a
 | 
						|
        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/testnet4/*.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
 |