Lompat ke konten
dokumentasi.id
Commit 3ce63fd
v3
Star5,3 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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-27 .github/workflows/build-merge.yml:13-26

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.
Fig. 1: Peta pemicu tiga workflowpull request membuka nsfw-check, merge memicu build-merge, dan cron bulanan memicu update-status yang berbagi langkah commit dengan build-merge.
WorkflowPemicuPerintah utamaMenulis commit
nsfw-checkpull_request tipe opened, reopened (.github/workflows/nsfw-check.yml:3-7)bun check (.github/workflows/nsfw-check.yml:25-27)tidak
build-mergepull_request_target tipe closed, dengan if: github.event.pull_request.merged == true (.github/workflows/build-merge.yml:3-10)bun start (.github/workflows/build-merge.yml:25-26)ya, git push origin HEAD (.github/workflows/build-merge.yml:28-36)
update-statusschedule cron 0 0 1 * * dan workflow_dispatch (.github/workflows/update-status.yml:3-7)bun start --rewrite (.github/workflows/update-status.yml:25-26)ya, langkah yang sama dengan build-merge (.github/workflows/update-status.yml:28-36)

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-42

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.
Fig. 2: Siklus pull request sampai commit hasil buildnsfw-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-27

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-22 Kedua, entri tanpa documentationUrl sama sekali, dengan pesan documentationUrl is required.. src/check.ts:27-31 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-55

⚠️ Blok catch di src/check.ts dibiarkan kosong, jadi documentationUrl yang tidak bisa diakses atau kena timeout hanya dilewati. Job tetap hijau, dan URL mati baru terlihat pada job update-status berikutnya. src/check.ts:59

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-15 .github/workflows/update-status.yml:14-15

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-10 .github/workflows/build-merge.yml:13-26

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-20 src/build.ts:87-106 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-36

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-36

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-7

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:20 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:77 src/build.ts:108 package.json:36-42

⚠️ git add --all mengangkut setiap perubahan di working tree, termasuk reformat Prettier pada berkas yang tidak terkait halaman dokumentasi. Bila bun start dijalankan di lokal tanpa --rewrite, commit yang dihasilkan tetap bisa memuat perubahan data/**/*.json; periksa git status sebelum membuat commit. .github/workflows/build-merge.yml:28-36

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.