name: Refresh prices and deploy Pages on: push: branches: [main] workflow_dispatch: schedule: - cron: "17 3 * * *" timezone: "Asia/Shanghai" permissions: contents: read pages: write id-token: write concurrency: group: github-pages cancel-in-progress: true jobs: schedule-gate: runs-on: ubuntu-latest outputs: run: ${{ steps.gate.outputs.run }} steps: - id: gate name: Run pushes and manual dispatches immediately; schedules every two days shell: bash run: | if [[ "${{ github.event_name }}" != "schedule" ]]; then echo "run=true" >> "$GITHUB_OUTPUT" exit 0 fi epoch_day=$(( $(date -u +%s) / 86400 )) if (( epoch_day % 2 == 0 )); then echo "run=true" >> "$GITHUB_OUTPUT" else echo "run=false" >> "$GITHUB_OUTPUT" fi build: needs: schedule-gate if: needs.schedule-gate.outputs.run == 'true' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Set up Node.js uses: actions/setup-node@v6 with: node-version: 24 cache: npm - name: Install dependencies run: npm ci - name: Run tests run: npm test - name: Locate the previous deployed snapshot shell: bash run: | owner="${GITHUB_REPOSITORY%%/*}" repo="${GITHUB_REPOSITORY##*/}" if [[ "${repo,,}" == "${owner,,}.github.io" ]]; then url="https://${owner}.github.io/data/prices.json" else url="https://${owner}.github.io/${repo}/data/prices.json" fi echo "PREVIOUS_SNAPSHOT_URL=$url" >> "$GITHUB_ENV" - name: Probe the OpenAI pricing endpoint run: npm run probe - name: Collect and validate official monthly prices env: MIN_FIRST_RUN_ROWS: 20 PRICING_CONCURRENCY: 4 run: npm run collect - name: Type-check and build run: npm run build - name: Configure Pages uses: actions/configure-pages@v5 - name: Upload Pages artifact uses: actions/upload-pages-artifact@v4 with: path: dist deploy: needs: build runs-on: ubuntu-latest environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4