Snapshot backlink mingguan di GitHub Actions: sebuah buku panduan
Tujuan: setiap hari Senin, sebuah alur kerja menulis domain perujuk dan teks jangkar hari itu ke repositori. Tidak ada yang lain. Diffing akan datang nanti.
Tim editorial Linkzoid ·
Sebelum Anda memulai
Anda memerlukan repositori, kunci Linkzoid yang disimpan sebagai rahasia LZ_KEY, dan satu domain yang Anda miliki. Anggaran: sekitar 6 kredit per target per jalankan, yang setara dengan $0.0006. Snapshot adalah fakta tentang satu bulan, sehingga jalankan mingguan sebagian besar akan mengambil ulang indeks yang sama. Mengatur cara memeriksa backlink ke situs web saya dengan cara ini membutuhkan satu malam.
Buku panduan, secara berurutan
01
1. Tambahkan rahasia
Pengaturan repositori, lalu Secrets and variables, lalu Actions. Beri nama LZ_KEY. Jika Anda menempelkannya ke file alur kerja, putar kuncinya hari ini.
02
2. Komit skrip
Simpan Python di bawah ini sebagai snap.py. Ini menulis data/YYYY-MM-DD/refdomains.json dan gagal pada setiap respons di mana ok bernilai false.
03
3. Komit alur kerja
Gunakan YAML di bawah ini. Jalankan sekali secara manual dengan pemicu workflow_dispatch dan baca log sebelum Anda mempercayai jadwal.
04
4. Periksa file pertama
Buka JSON. Konfirmasikan jumlah baris terhadap total, dan bandingkan angka tersebut dengan apa yang dilaporkan panggilan overview gratis untuk domain Anda.
05
5. Tambahkan peringatan
Job yang gagal akan mengirim email ke pemilik repositori secara default. Biarkan itu tetap aktif. Job yang berhenti diam-diam adalah cara umum setup ini mati.
snap.py
Perpustakaan standar. Loop berakhir pada hitungan, bukan pada tebakan.
python
import json, os, sys, datetime, pathlib, urllib.request as u
KEY = os.environ['LZ_KEY']
TARGET = sys.argv[1]
def get(**p):
q = '&'.join(f'{k}={v}' for k, v in p.items())
url = f'https://linkzoid.pro/api.php?{q}&key={KEY}'
with u.urlopen(url, timeout=30) as r:
return json.load(r)
rows, page = [], 1
while True:
d = get(action='refdomains', q=TARGET, page=page, per=1000)
if not d['ok']:
sys.exit(f'bad response: {d}')
rows += d['rows']
if not d['rows'] or len(rows) >= d['total']:
break
page += 1
day = datetime.date.today().isoformat()
out = pathlib.Path('data') / day
out.mkdir(parents=True, exist_ok=True)
(out / 'refdomains.json').write_text(json.dumps(rows))
print(len(rows), 'rows, balance', d['_credits'])
.github/workflows/snapshot.yml
Cron di GitHub berjalan dalam UTC dan bisa terlambat saat runner sibuk. Jangan membangun apa pun yang bergantung pada menit.
Kunci berada di rahasia repositori, dan YAML hanya merujukkannya dengan nama.
File alur kerja berada di cabang default, karena itulah salinan yang dibaca oleh jadwal.
Jalankan manual dengan workflow_dispatch selesai dan menulis satu folder bertanggal.
Jumlah baris dalam file cocok dengan total yang dikembalikan API untuk panggilan tersebut.
Job keluar dengan kode non-nol pada respons yang buruk, sehingga kegagalan mengubah jalankan menjadi merah.
Kesalahan dan perbaikan
Apa yang pertama kali rusak dalam job backlink terjadwal
Kesalahan
Yang Anda lihat
Perbaikan
Kunci ditempelkan di YAML
Kunci terlihat di riwayat repositori
Putar, pindahkan ke secrets.LZ_KEY
Menit aneh seperti 0 0
Jalankan dimulai terlambat 20 menit
Pilih 17 6; puncak jam sangat padat
Repositori menganggur selama 60 hari
GitHub menjadwalkan ulang
Komit sesuatu, atau aktifkan kembali di tab Actions
Loop berhenti hanya pada halaman kosong
Jalankan tanpa akhir di batas halaman
Berhenti juga ketika len(rows) >= total
Kode keluar diabaikan
Centang hijau, folder kosong
Gunakan sys.exit pada ok: false
Komit gagal tanpa perubahan
Jalankan merah untuk apa-apa
Tambahkan || exit 0 setelah komit
Menjaga kunci dan repositori tetap aman
Kunci adalah satu-satunya hal dalam setup ini yang layak dilindungi. Perlakukan seperti kata sandi, karena siapa pun yang memegangnya dapat menghabiskan saldo Anda.
Job terjadwal bocor secara diam-diam. Kunci yang ditempelkan ke log, workflow yang disalin ke repositori publik, atau mantan rekan tim dengan akses tulis adalah rute umum. Periksa masing-masing sekali setiap kuartal.
Putar kunci saat seseorang keluar
Saat rekan tim dengan akses keluar, buat kunci baru, perbarui rahasia, dan pensiunkan yang lama. Kemudian konfirmasi bahwa jalankan berikutnya berhasil. Satu jalankan hijau setelah perubahan adalah tes termurah yang akan Anda lakukan sepanjang tahun. Tulis tanggal rotasi di catatan repositori juga, agar rotasi berikutnya tidak menjadi kejutan.
Batasi siapa yang dapat mengedit workflow
Siapa pun yang dapat mengedit YAML dapat mencetak rahasia dalam jalankan. Batasi akses tulis, dan tinjau perubahan pada file workflow seperti cara Anda mereview kode. Dua orang dengan akses tulis biasanya sudah cukup untuk repositori kecil.
Jangan pernah mencetak URL permintaan
Cetak saldo dan jumlah baris, jangan pernah URL permintaan. Kunci berjalan di string kueri, sehingga baris debug yang mencetak URL menulis kunci ke log. Jika Anda harus membagikan permintaan dalam isu, ganti kunci dengan placeholder terlebih dahulu.
Apa itu snapshot, dan apa yang bukan
Yang Anda dapatkan adalah gambaran bulanan. Crawler kami sendiri menyegarkan indeks sekitar sebulan sekali, sehingga dua jalankan Senin dalam bulan yang sama sering mengembalikan baris yang sama. Itu diharapkan.
Irama mingguan berfungsi. Ini menjaga kebiasaan tetap hidup, dan Anda menangkap job yang gagal dalam tujuh hari bukan tiga puluh. Jika tautan yang Anda bangun pada hari Selasa hilang pada hari Senin, tunggu penyegaran berikutnya sebelum panik.
Ketika Anda memiliki tiga atau empat folder bertanggal, lanjutkan ke diff profil backlink SQLite. Jika Anda terjebak pada kode respons yang membandel, tabel batas laju mencantumkan apa yang berarti setiap status untuk loop.
Simpan folder pertama sebagai baseline. Setiap perbandingan selanjutnya menunjuk kembali ke sana, dan folder yang dinamai berdasarkan tanggal jauh lebih mudah dipercaya daripada memori tentang bagaimana angka-angka terlihat di musim semi lalu. Tetap konsisten.
Menambahkan teks jangkar dan halaman teratas
Satu tindakan per file menjaga diff tetap dapat dibaca. Salin loop di snap.py, ubah refdomains menjadi anchors atau toppages, dan tulis ke nama file kedua. Masing-masing membutuhkan 2 kredit.
File gabungan menyembunyikan bagian mana yang berubah, dan reviewer yang menggulir permintaan tarik ingin melihat satu konsep per diff. Jaga agar terpisah. Jika Anda melacak tiga domain, loop melalui daftar pendek di workflow dengan matriks, sehingga setiap target mendapatkan job sendiri dan kegagalan sendiri.
Teks jangkar adalah file kedua dengan batas sendiri di diff, jadi tinjau secara terpisah dari domain perujuk. Setiap jalankan tetap murah dan dapat diulang, yang merupakan ide utamanya.
Membaca log jalankan
Buka log jalankan pertama. Lakukan sebelum Anda mempercayai jadwal. Cari jumlah baris, saldo, dan baris komit. Jika salah satu dari ketiganya hilang, job melakukan lebih sedikit dari yang diklaim. Simpan juga catatan singkat tentang saldo di setiap jalankan, sehingga pengeluaran bulanan terlihat tanpa membuka dasbor.
Centang hijau mengatakan sedikit. Itu hanya berarti proses keluar dengan bersih. Itu tidak mengatakan file tersebut berisi baris yang benar, itulah mengapa skrip mencetak ringkasannya sendiri. Pertahankan baris ringkasan tersebut tidak berubah di antara versi skrip, sehingga diff dari dua log hanya menunjukkan perubahan nyata.
Seperti apa tampilan log yang sehat
Jalankan yang sehat mencetak satu baris dengan jumlah baris dan saldo kredit, lalu komit dengan tanggal hari ini. Apa pun yang mengubur baris-baris itu di bawah kebisingan ekstra layak untuk dilihat lagi.
Mendeteksi kegagalan diam-diam
Perhatikan folder kosong, komit yang tidak pernah muncul, atau jumlah baris yang berbeda dari total. Masing-masing ini menunjuk ke loop atau parsing, bukan ke API itu sendiri. Simpan log sehat pertama sebagai referensi untuk perbandingan di masa mendatang.
Beberapa kegagalan meninggalkan folder di belakang dengan baris lebih sedikit dari biasanya. Bandingkan hitungan dengan minggu sebelumnya sebelum Anda merayakan jalankan hijau, karena pemotongan diam-diam terlihat persis seperti bulan yang sunyi.
Menambahkan target kedua dengan aman
Domain kedua adalah entri matriks, bukan salinan seluruh workflow. Berikan setiap target job sendiri agar satu kegagalan tidak menyembunyikan yang lain. Jaga setiap job terpisah. Periksa apakah jalur termasuk nama domain, sehingga dua jalankan tidak pernah menulis ke file yang sama.
Mulailah dengan target kedua saja. Setelah foldernya terlihat benar, tambahkan sisanya. Matriks yang gagal di tengah lebih sulit dibaca daripada dua jalankan sederhana.
Namai folder berdasarkan target
Masukkan domain ke jalur, misalnya data/<domain>/YYYY-MM-DD, dan folder tetap terpisah bahkan ketika dua job berjalan dalam menit yang sama. Folder lama dapat tetap di tempatnya, karena tanggal di jalur membuatnya mudah ditemukan.
Gunakan aturan penamaan yang sama untuk setiap target. Skrip kemudian dapat mendaftar folder tanpa kasus khusus.
Rencanakan anggaran kredit terlebih dahulu
Kalikan panggilan per target dengan jumlah target, lalu periksa total terhadap saldo Anda sebelum jalankan pertama. Matriks melipatgandakan pengeluaran secepat ia melipatgandakan job. Tulis total bulanan yang diharapkan di repositori di sebelah workflow. Ketika saldo turun lebih cepat dari itu, loop kemungkinan mengambil ulang halaman, dan Anda dapat menghentikannya sebelum jalankan berikutnya.
Pertanyaan yang muncul di minggu pertama
Bisakah saya menjalankannya di repositori pribadi secara gratis?
Biasanya ya, dalam batas menit bulanan yang diberikan akun gratis GitHub. Job snapshot berjalan dalam waktu kurang dari satu menit, sehingga jadwal mingguan menggunakan porsi kecil. Periksa batas saat ini paket Anda sendiri, karena GitHub mengubahnya dari waktu ke waktu.
Di mana kunci harus berada jika beberapa orang melakukan push?
Di rahasia organisasi atau repositori, jangan pernah di file. Siapa pun yang dapat mengedit workflow dapat mencetak rahasia di log, jadi batasi siapa yang memiliki akses tulis, dan putar kunci jika seseorang meninggalkan proyek.
Mengapa jalankan terjadwal saya tidak menyala?
Tiga alasan umum. File workflow tidak berada di cabang default, repositori menganggur selama 60 hari dan GitHub menjadwalkan ulang, atau string cron memiliki salah ketik. Jalankan sekali dengan workflow_dispatch untuk menyingkirkan skrip itu sendiri.
Seberapa besar folder data menjadi?
Kecil. Seribu domain perujuk adalah beberapa ratus kilobyte JSON. Setahun file mingguan untuk satu domain tetap jauh di bawah seratus megabyte, yang bagus untuk git, meskipun Anda dapat mengompresi folder lama jika itu mengganggu Anda.