diff --git a/.github/workflows/delete-test-app.yaml b/.github/workflows/delete-test-app.yaml new file mode 100644 index 000000000..d89d8646b --- /dev/null +++ b/.github/workflows/delete-test-app.yaml @@ -0,0 +1,54 @@ +on: + pull_request: + types: ["closed"] + +env: + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} + +jobs: + remove-test: + if: contains(github.event.pull_request.labels.*.name, 'testing') + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + + name: Delete Cloudflare Page + steps: + - name: Set Project Name + run: | + export NAME=$(echo ${{ env.BRANCH_NAME }} | tr -d -c '[:alnum:]' | tr '[:upper:]' '[:lower:]') + echo "PROJECT_NAME=widget-${NAME:0:10}" >> $GITHUB_ENV + + - name: Delete project if present + uses: actions/github-script@v6 + with: + script: | + fetch('https://api.cloudflare.com/client/v4/accounts/${{ secrets.CF_ACCOUNT_ID }}/pages/projects/${{ env.PROJECT_NAME }}', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${{ secrets.CF_PAGES_API_TOKEN }}' + }, + }) + .then(r => r.json()) + .then(r => { + if (!r || !r.success || !r.result) { + console.log(r) + process.exit(1) + } + fetch('https://api.cloudflare.com/client/v4/accounts/${{ secrets.CF_ACCOUNT_ID }}/pages/projects/${{ env.PROJECT_NAME }}', { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${{ secrets.CF_PAGES_API_TOKEN }}' + }, + }) + .then(r => r.json()) + .then(r => { + if (!r?.success) { + console.log(r) + process.exit(1) + } + }) + }) diff --git a/.github/workflows/deploy-test-app.yaml b/.github/workflows/deploy-test-app.yaml new file mode 100644 index 000000000..7e06fc1d3 --- /dev/null +++ b/.github/workflows/deploy-test-app.yaml @@ -0,0 +1,142 @@ +on: + pull_request: + +env: + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} + +jobs: + deploy-test: + if: contains(github.event.pull_request.labels.*.name, 'testing') + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + pull-requests: write + + name: Publish to Cloudflare Pages + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install dependencies + uses: ./.github/actions/yarn-install + + - name: Build project + env: + NODE_OPTIONS: "--max_old_space_size=4096" + run: yarn build + + - name: Set Project Name + run: | + export NAME=$(echo ${{ env.BRANCH_NAME }} | tr -d -c '[:alnum:]' | tr '[:upper:]' '[:lower:]') + echo "PROJECT_NAME=widget-${NAME:0:10}" >> $GITHUB_ENV + + - name: Create project if not present + uses: actions/github-script@v6 + with: + script: | + fetch('https://api.cloudflare.com/client/v4/accounts/${{ secrets.CF_ACCOUNT_ID }}/pages/projects/${{ env.PROJECT_NAME }}', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${{ secrets.CF_PAGES_API_TOKEN }}' + }, + }) + .then(r => r.json()) + .then(r => { + if (r.success) { + // project already created + return + } else if (r.error) { + console.log(r) + process.exit(1) + } + fetch('https://api.cloudflare.com/client/v4/accounts/${{ secrets.CF_ACCOUNT_ID }}/pages/projects', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${{ secrets.CF_PAGES_API_TOKEN }}' + }, + body: JSON.stringify({ + build_config: { + build_command: "yarn run build", + destination_dir: "packages/widget-playground/dist/", + root_dir: "/", + }, + canonical_deployment: null, + deployment_configs: { + preview: { + analytics_engine_datasets: { + ANALYTICS_ENGINE_BINDING: { + dataset: "api_analytics" + } + }, + compatibility_date: "2022-01-01", + compatibility_flags: [ + "url_standard" + ], + placement: { + mode: "smart" + }, + }, + production: { + analytics_engine_datasets: { + ANALYTICS_ENGINE_BINDING: { + dataset: "api_analytics" + } + }, + compatibility_date: "2022-01-01", + compatibility_flags: [ + "url_standard" + ], + placement: { + mode: "smart" + }, + } + }, + latest_deployment: null, + name: "${{ env.PROJECT_NAME }}", + production_branch: "${{ env.BRANCH_NAME }}" + }) + }) + .then(r => r.json()) + .then(r => { + if (!r?.success) { + console.log(r) + process.exit(1) + } + }) + }) + + - name: Deploy Page + uses: cloudflare/wrangler-action@2.0.0 + with: + apiToken: ${{ secrets.CF_PAGES_API_TOKEN }} + accountId: ${{ secrets.CF_ACCOUNT_ID }} + command: | + pages deploy ./packages/widget-playground/dist/ --project-name ${{ env.PROJECT_NAME }} --branch ${{ env.BRANCH_NAME }} + + - name: Comment Test Endpoint + uses: actions/github-script@v6 + with: + script: | + fetch("https://api.cloudflare.com/client/v4/accounts/${{ secrets.CF_ACCOUNT_ID }}/pages/projects/${{ env.PROJECT_NAME }}/deployments", { + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${{ secrets.CF_PAGES_API_TOKEN }}' + } + }) + .then((r) => r.json()) + .then((r) => { + if (!r.success) { + console.log(r) + process.exit(1) + } + const obj = r.result[0] + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `Hey! This is your new endopint: [${obj.url}](${obj.url})` + }) + })