10
Otomasi GitHub Actions
Repositori memakai tiga workflow terpisah: satu menjaga pull request, satu membangun ulang daftar setelah merge, dan satu menyegarkan status API secara berkala. Ketiga berkas berada di direktori .github/workflows, semuanya memakai oven-sh/setup-bun@v1 dengan bun-version: '0.8.0', menjalankan bun install, lalu memanggil satu skrip Bun. Dua workflow menutup pekerjaannya dengan commit ke branch, satu hanya memeriksa. .github/workflows/nsfw-check.yml:17-271 .github/workflows/build-merge.yml:13-262
Peta pemicu
Setiap workflow punya pemicu yang berbeda dan tidak saling menimpa. nsfw-check bereaksi pada event pull_request dengan tipe opened dan reopened; build-merge bereaksi pada pull_request_target dengan tipe closed; update-status berjalan dari schedule dan workflow_dispatch.
graph LR
PR1["pull_request: opened, reopened"] --> N["nsfw-check<br/>bun check"]
PR2["pull_request_target: closed"] --> C{"merged == true ?"}
C -->|ya| M["build-merge<br/>bun start"]
C -->|tidak| SKIP["job dilewati"]
CRON["schedule 0 0 1 * *"] --> U["update-status<br/>bun start --rewrite"]
MAN["workflow_dispatch"] --> U
N --> FAIL["process.exit(1)"]
M --> COMMIT["commit chore(readme): update"]
U --> COMMIT
style N fill:#f59e0b,color:#000
style C fill:#f59e0b,color:#000
style M fill:#2d7d46,color:#fff
style U fill:#8b5cf6,color:#fff
style FAIL fill:#dc2626,color:#fff
style SKIP fill:#dc2626,color:#fff
style COMMIT fill:#336791,color:#fff
%% fig: Peta pemicu tiga workflow
%% desc: pull request membuka nsfw-check, merge memicu build-merge, dan cron bulanan memicu update-status yang berbagi langkah commit dengan build-merge.| Workflow | Pemicu | Perintah utama | Menulis commit |
|---|---|---|---|
nsfw-check | pull_request tipe opened, reopened (.github/workflows/nsfw-check.yml:3-73) | bun check (.github/workflows/nsfw-check.yml:25-274) | tidak |
build-merge | pull_request_target tipe closed, dengan if: github.event.pull_request.merged == true (.github/workflows/build-merge.yml:3-105) | bun start (.github/workflows/build-merge.yml:25-266) | ya, git push origin HEAD (.github/workflows/build-merge.yml:28-367) |
update-status | schedule cron 0 0 1 * * dan workflow_dispatch (.github/workflows/update-status.yml:3-78) | bun start --rewrite (.github/workflows/update-status.yml:25-269) | ya, langkah yang sama dengan build-merge (.github/workflows/update-status.yml:28-3610) |
Skrip yang dipanggil kedua perintah itu juga berasal dari package.json: start memetakan ke bun run src/build.ts dan check ke bun run src/check.ts. package.json:36-4211
Dari pull request sampai commit hasil build
Alur berurutan ini menunjukkan bahwa commit hasil build hanya lahir setelah pull request di-merge, sedangkan pemeriksaan NSFW berjalan lebih awal dan tidak menulis apa pun.
sequenceDiagram
autonumber
actor Dev as Kontributor
participant GH as GitHub
participant Run as Runner ubuntu-latest
participant Bun as src/check.ts dan src/build.ts
participant Repo as Branch hasil commit
Dev->>GH: buka pull request
GH->>Run: nsfw-check saat opened atau reopened
Run->>Bun: bun install lalu bun check
Bun->>Bun: crawl documentationUrl, panggil isBlacklisted
alt duplikat, documentationUrl kosong, atau NSFW
Bun-->>Run: process.exit(1)
Run-->>GH: pemeriksaan gagal
else lolos
Bun-->>Run: selesai tanpa exit 1
Dev->>GH: merge pull request
GH->>Run: build-merge saat closed dan merged == true
Run->>Bun: bun install lalu bun start
Bun->>Bun: tulis data JSON dan README, jalankan bun format
Run->>Repo: git add --all, git commit, git push origin HEAD
end
%% fig: Siklus pull request sampai commit hasil build
%% desc: nsfw-check memeriksa pull request saat dibuka, lalu build-merge membangun ulang dan mendorong commit setelah pull request di-merge.Pemeriksaan pull request: nsfw-check
Workflow ini hanya menjalankan satu langkah perintah, bun check, dan langkah itu diberi id: run_nsfw_check. Tidak ada langkah commit di dalamnya, sehingga hasilnya murni lulus atau gagal. .github/workflows/nsfw-check.yml:25-274
Kegagalan berasal dari src/check.ts yang memanggil process.exit(1) pada tiga kondisi. Pertama, documentationUrl yang sama muncul dua kali dalam satu berkas kategori, dengan pesan Duplikat documentationUrl di ${file}: ${url}. src/check.ts:19-2212 Kedua, entri tanpa documentationUrl sama sekali, dengan pesan documentationUrl is required.. src/check.ts:27-3113 Ketiga, halaman dokumentasi memuat salah satu pola blacklist sehingga isBlacklisted(body) bernilai benar, dengan pesan Sorry, the NSFW API is not allowed here :). src/check.ts:52-5514
⚠️ Blok
catchdisrc/check.tsdibiarkan kosong, jadidocumentationUrlyang tidak bisa diakses atau kenatimeouthanya dilewati. Job tetap hijau, dan URL mati baru terlihat pada jobupdate-statusberikutnya. src/check.ts:5915
Rincian aturan validasi itu ada di Validator Data lewat check.ts. Versi actions/checkout di workflow ini juga berbeda: @v3, sedangkan dua workflow lain masih @v2. .github/workflows/nsfw-check.yml:14-1516 .github/workflows/update-status.yml:14-1517
Build setelah merge: build-merge
Job build-merge dijaga kondisi github.event.pull_request.merged == true, jadi menutup pull request tanpa merge tidak membangun apa pun. Langkahnya berurutan: checkout, setup Bun 0.8.0, bun install, lalu bun start. .github/workflows/build-merge.yml:3-105 .github/workflows/build-merge.yml:13-262
bun start membaca seluruh berkas JSON kategori, mengurutkan daftar apis berdasarkan apiName, lalu menulis ulang JSON tersebut dan seluruh berkas README per bahasa. src/build.ts:13-2018 src/build.ts:87-10619 Hasil tulisan itulah yang dikomit: identitas git disetel ke farizdotid, lalu git add --all, git commit -m "chore(readme): update", dan git push origin HEAD dengan GITHUB_TOKEN. .github/workflows/build-merge.yml:28-367
Pesan commit itu identik dengan yang dipakai update-status, sehingga riwayat branch tidak membedakan build hasil merge dari build hasil cron. .github/workflows/update-status.yml:28-3610
Cron bulanan: update-status
Pemicu schedule memakai cron 0 0 1 * * — tanggal 1 setiap bulan — dan dilengkapi workflow_dispatch untuk menjalankan workflow secara manual dari antarmuka GitHub. .github/workflows/update-status.yml:3-78
Langkah build-nya hanya berbeda pada satu flag: bun start --rewrite. Flag itu dibaca di src/build.ts lewat pemeriksaan Bun.argv[2] === '--rewrite', yang mengaktifkan penyegaran status API dan pemangkasan entri bermasalah sebelum JSON dan README ditulis. src/build.ts:2020 Perilaku mode rewrite, cache per URL, dan aturan hapus entri dibahas di Mode Rewrite dan Status API.
Yang ikut ter-commit
Langkah commit memakai git add --all, bukan menambahkan berkas tertentu. Karena itu, dua jenis perubahan lain ikut masuk: JSON kategori yang ditulis ulang oleh build, dan seluruh hasil Bun.spawn(['bun', 'format']) di akhir skrip build yang menjalankan prettier --write .. src/build.ts:7721 src/build.ts:10822 package.json:36-4211
⚠️
git add --allmengangkut setiap perubahan di working tree, termasuk reformat Prettier pada berkas yang tidak terkait halaman dokumentasi. Bilabun startdijalankan di lokal tanpa--rewrite, commit yang dihasilkan tetap bisa memuat perubahandata/**/*.json; periksagit statussebelum membuat commit. .github/workflows/build-merge.yml:28-367
Untuk melihat bagaimana satu entri API masuk ke JSON kategori sebelum ketiga workflow ini menyentuhnya, lihat Alur Kontribusi API Baru. Bagian penulisan README yang dipicu bun start dijelaskan di Pipeline Build Markdown.