diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 542397c..68271f2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,107 +2,37 @@ name: Deploy to Cloudflare on: push: - branches: ['main'] + branches: + - main jobs: build-and-deploy: runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v3 - - - name: Setup Terraform - uses: hashicorp/setup-terraform@v2.0.3 - with: - terraform_version: 1.6.4 - - - name: Use Node.js 18.x - uses: actions/setup-node@v3 - with: - node-version: 18.x - cache: 'npm' - - # Automatically get an account id via the API Token - # if secrets.CLOUDFLARE_ACCOUNT_ID is not set. - - name: Fetch Account ID - id: fetch_account_id - run: | - if [[ -n "${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" ]]; then - ACCOUNT_ID="${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" - echo "Using provided CLOUDFLARE_ACCOUNT_ID from secrets." - else - ACCOUNT_ID=$(curl -X GET "https://api.cloudflare.com/client/v4/accounts" -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" -H "Content-Type:application/json" | jq ".result[0].id" -r) - if [[ "$ACCOUNT_ID" == "null" ]]; then - echo "Failed to get an account id, please make sure you have set up CLOUDFLARE_API_TOKEN correctly!" - exit 1 - fi - fi - echo 'account_id='$ACCOUNT_ID >> $GITHUB_OUTPUT - - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Install Dependencies + run: npm install --legacy-peer-deps + + - name: Build Next.js App + run: npm run build - # This is a temporary workaround to fix issue #13 - # On a new Cloudflare account, the terraform apply will fail with `workers.api.error.subdomain_required` - # This may be due to the account not having a worker subdomain yet, so we create a dummy worker and then delete it. - # Cloudflare should allocate a worker subdomain after this. - # https://github.com/cloudflare/terraform-provider-cloudflare/issues/3304 - - name: Create worker subdomain - id: create_dummy_worker - run: | - curl --request PUT --fail-with-body \ - --url https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/workers/scripts/dummy-ib4db6ntj5csdef3 \ - --header 'Authorization: Bearer '$CLOUDFLARE_API_TOKEN \ - --header 'Content-Type: application/javascript' \ - --data 'addEventListener('\''fetch'\'', (event) => event.respondWith(new Response('\''OK'\'')))'\ - - curl --request DELETE --fail-with-body \ - --url https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/workers/scripts/dummy-ib4db6ntj5csdef3 \ - --header 'Authorization: Bearer '$CLOUDFLARE_API_TOKEN \ - --header 'Content-Type: application/json' - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ steps.fetch_account_id.outputs.account_id }} - - - name: Install packages - run: | - npm install - cd worker - npm install - - - name: Build worker - run: | - cd worker - npx wrangler deploy src/index.ts --outdir dist --dry-run - - - name: Build page - run: | - npx @cloudflare/next-on-pages - - - name: Deploy using Terraform - # We're using terraform for first-time setup here, - # since we didn't setup a remote backend to store state, - # following runs will fail with name conflict, which is normal. - continue-on-error: true - - run: | - terraform init - terraform apply -auto-approve -input=false - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - TF_VAR_CLOUDFLARE_ACCOUNT_ID: ${{ steps.fetch_account_id.outputs.account_id }} - - # Still need to upload worker to keep it up-to-date (Terraform will fail after first-time setup) - - name: Upload worker - run: | - curl --fail-with-body -X PUT https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/workers/scripts/uptimeflare_worker/content --header 'Authorization: Bearer '$CLOUDFLARE_API_TOKEN -F 'index.js=@worker/dist/index.js;type=application/javascript+module' -F 'metadata={"main_module": "index.js"}' - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ steps.fetch_account_id.outputs.account_id }} - - # Currently Terraform Cloudflare provider doesn't support direct upload, use wrangler to upload instead. - - name: Upload pages - run: | - npx wrangler pages deploy .vercel/output/static --project-name uptimeflare - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ steps.fetch_account_id.outputs.account_id }} + - name: Deploy Worker and Pages + run: | + # Step 1: Build worker + cd worker + npx wrangler deploy src/index.ts --outdir dist + + # Step 2: Build page + npx @cloudflare/next-on-pages + + # Step 3: Upload worker + curl --fail-with-body -X PUT https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/workers/scripts/uptimeflare_worker/content --header 'Authorization: Bearer '$CLOUDFLARE_API_TOKEN -F 'index.js=@worker/dist/index.js;type=application/javascript+module' -F 'metadata={"main_module": "index.js"}' + + # Step 4: Upload pages + npx wrangler pages deploy .vercel/output/static --project-name uptimeflare + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}