diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4393479..502b25b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,30 +9,163 @@ on: - main jobs: - test: + setup: runs-on: ubuntu-latest - + outputs: + node_version: ${{ steps.nvmrc.outputs.NODE_VERSION }} steps: - name: Checkout code uses: actions/checkout@v2 - name: Read Node.js version from .nvmrc id: nvmrc - run: echo "NODE_VERSION=$(cat .nvmrc)" >> $GITHUB_ENV + run: echo "NODE_VERSION=$(cat .nvmrc)" >> $GITHUB_ENV && echo "::set-output name=NODE_VERSION::$(cat .nvmrc)" - name: Set up Node.js uses: actions/setup-node@v2 with: - node-version: ${{ env.NODE_VERSION }} + node-version: ${{ steps.nvmrc.outputs.NODE_VERSION }} + + - name: Cache node modules + id: cache-node-modules + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ steps.nvmrc.outputs.NODE_VERSION }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ steps.nvmrc.outputs.NODE_VERSION }}- - name: Install dependencies run: npm install + - name: Save node_modules + if: steps.cache-node-modules.outputs.cache-hit != 'true' + uses: actions/upload-artifact@v3 + with: + name: node-modules + path: node_modules + + unit-tests: + needs: setup + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ needs.setup.outputs.node_version }} + + - name: Restore node_modules + uses: actions/download-artifact@v3 + with: + name: node-modules + path: node_modules + - name: Run unit tests run: npm test + lint: + needs: setup + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ needs.setup.outputs.node_version }} + + - name: Restore node_modules + uses: actions/download-artifact@v3 + with: + name: node-modules + path: node_modules + - name: Lint code run: npm run lint + build: + needs: [unit-tests, lint] + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ needs.setup.outputs.node_version }} + + - name: Restore node_modules + uses: actions/download-artifact@v3 + with: + name: node-modules + path: node_modules + - name: Build project run: npm run build + + - name: Save build output + uses: actions/upload-artifact@v3 + with: + name: build-output + path: build + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ needs.setup.outputs.node_version }} + + - name: Restore build output + uses: actions/download-artifact@v3 + with: + name: build-output + path: build + + - name: Deploy to Netlify + run: | + npm install netlify-cli -g + netlify deploy --dir=build --prodIfUnlocked=false --json > netlify-output.json + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + + - name: Extract Netlify deploy URL + id: extract_url + run: echo "DEPLOY_URL=$(cat netlify-output.json | jq -r '.deploy_url')" >> $GITHUB_ENV && echo "::set-output name=DEPLOY_URL::$(cat netlify-output.json | jq -r '.deploy_url')" + + cypress-tests: + needs: deploy + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ needs.setup.outputs.node_version }} + + - name: Restore node_modules + uses: actions/download-artifact@v3 + with: + name: node-modules + path: node_modules + + - name: Install Cypress + run: npm install cypress --save-dev + + - name: Run Cypress tests + run: npx cypress run --env baseUrl=${{ needs.deploy.outputs.DEPLOY_URL }} + env: + CYPRESS_baseUrl: ${{ needs.deploy.outputs.DEPLOY_URL }}