diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 10e4139..ac27aa7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,51 +1,82 @@ -name: Deploy to GitHub Pages +name: Deploy to Production on: push: branches: ['main'] - workflow_dispatch: permissions: contents: read pages: write id-token: write + deployments: write + statuses: write concurrency: - group: 'pages' + group: "pages" cancel-in-progress: true jobs: + quality: + name: Code Quality + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Run tests + run: npm test + deploy: + needs: quality + runs-on: ubuntu-latest environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest + steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Set up Node - uses: actions/setup-node@v3 + - name: Setup Node.js + uses: actions/setup-node@v4 with: node-version: 18 cache: 'npm' - name: Install dependencies - run: npm install + run: npm ci - name: Build run: npm run build - + env: + VITE_APP_ENV: production + GITHUB_PAGES: true + BASE_URL: /copy-trading/ + - name: Setup Pages - uses: actions/configure-pages@v3 - + uses: actions/configure-pages@v4 + - name: Upload artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: - path: './dist' + path: dist + name: github-pages - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 - + uses: actions/deploy-pages@v3 + with: + artifact_name: github-pages diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml new file mode 100644 index 0000000..ab4161e --- /dev/null +++ b/.github/workflows/preview-deploy.yml @@ -0,0 +1,140 @@ +name: Deploy PR Preview + +on: + pull_request: + types: [opened, synchronize, reopened] + branches: ['main'] + +permissions: + contents: read + pages: write + id-token: write + pull-requests: write + deployments: write + statuses: write + +concurrency: + group: "preview-${{ github.event.pull_request.number }}" + cancel-in-progress: true + +jobs: + quality: + name: Code Quality + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + continue-on-error: true + + - name: Run tests + run: npm test + continue-on-error: true + + deploy-preview: + needs: quality + runs-on: ubuntu-latest + environment: + name: preview + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + env: + VITE_APP_ENV: preview + GITHUB_PAGES: true + BASE_URL: /copy-trading/ + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: dist + name: github-pages + + - name: Deploy Preview + id: deployment + uses: actions/deploy-pages@v3 + with: + preview: true + artifact_name: github-pages + + - name: Comment PR + if: success() + uses: actions/github-script@v7 + with: + script: | + const url = `${{ steps.deployment.outputs.page_url }}`; + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `šŸš€ Preview deployed to: ${url}` + }); + + - name: Check required secrets + run: | + if [ -z "${{ secrets.AUTOMAGICALLY_TOKEN }}" ]; then + echo "::error::Missing required secret: AUTOMAGICALLY_TOKEN" + exit 1 + fi + if [ -z "${{ secrets.AUTOMAGICALLY_TEST_TARGET_ID }}" ]; then + echo "::error::Missing required secret: AUTOMAGICALLY_TEST_TARGET_ID" + exit 1 + fi + - name: Run E2E tests + id: e2e + uses: OctoMind-dev/automagically-action-execute@v2 + continue-on-error: true + with: + url: ${{ steps.deployment.outputs.page_url }} + token: ${{ secrets.AUTOMAGICALLY_TOKEN }} + testTargetId: ${{ secrets.AUTOMAGICALLY_TEST_TARGET_ID }} + blocking: true + + - name: Report Workflow Status + if: always() + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const run_id = context.runId; + const run_url = `https://github.com/${owner}/${repo}/actions/runs/${run_id}`; + const status = '${{ steps.e2e.conclusion || steps.e2e.outcome || '' }}' === 'failure' + ? 'āŒ E2E tests failed' + : 'āœ… All checks completed'; + + const body = `### Workflow Status\n${status}\n\nFor detailed test results, check the OctoMind report in the PR.\n\nšŸ” [View Workflow Details](${run_url})`; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: owner, + repo: repo, + body: body + });