GitHub Actions ile haftalık geri bağlantık anlık görüntüleri: bir çalışma kitabı
Amaç: Her Pazartesi bir iş akışı, bugünün yönlendiren alan adlarını ve anchor metinlerini repo'ya yazar. Başka hiçbir şey. Fark analizi daha sonra gelir.
Linkzoid editoryal ekibi ·
Başlamadan önce
Bir repo, LZ_KEY olarak saklanan bir Linkzoid anahtarı ve sahip olduğunuz bir alan adına ihtiyacınız var. Bütçe: çalıştırma başına hedef başına yaklaşık 6 kredi, bu da $0.0006 eder. Bir anlık görüntü bir ay hakkındaki bir gerçektir, bu yüzden haftalık çalıştırmalar çoğunlukla aynı dizini yeniden çeker. Bu şekilde web sitenizdeki geri bağlantıları kontrol etme kurulumu bir akşam sürer.
Çalışma kitabı, sırayla
01
1. Gizli anahtarı ekleyin
Repo ayarları, ardından Gizlilikler ve değişkenler, ardından Actions. Adını LZ_KEY olarak verin. Bunu iş akışı dosyasına yapıştırırsanız, anahtarı bugün yenileyin.
02
2. Betiği commit edin
Aşağıdaki Python betiğini snap.py olarak kaydedin. data/YYYY-MM-DD/refdomains.json yazar ve ok false olduğu herhangi bir yanıtta başarısız olur.
03
3. İş akışını commit edin
Aşağıdaki YAML'ı kullanın. workflow_dispatch tetikleyicisiyle bir kez manuel olarak çalıştırın ve zamanlamaya güvenmeden önce logu okuyun.
04
4. İlk dosyayı kontrol edin
JSON'u açın. Satır sayısını total ile doğrulayın ve alan adınız için ücretsiz overview çağrısının bildirdiği sayıyla karşılaştırın.
05
5. Uyarıyı ekleyin
Başarısız bir iş varsayılan olarak repo sahibine e-posta gönderir. Bunu açık bırakın. Sessizce duran bir iş, bu tür kurulumların ölme biçimidir.
snap.py
Standart kütüphane. Döngü, tahmine değil, sayıya dayanarak sona erer.
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
GitHub'daki Cron, UTC'de çalışır ve koşucular meşgul olduğunda geç başlayabilir. Dakikaya bağlı bir şey inşa etmeyin.
Anahtar repo gizliliklerinde oturur ve YAML yalnızca adıyla referans verir.
İş akışı dosyası varsayılan dalda bulunur, çünkü zamanlamanın okuduğu kopya budur.
workflow_dispatch ile manuel bir çalıştırma tamamlandı ve bir tarihli klasör yazdı.
Dosyadaki satır sayısı, API'nin o çağrı için döndürdüğü toplam sayıyla eşleşir.
İş, kötü bir yanıtta non-zero (sıfırdan farklı) bir çıkış koduyla sonlanır, böylece bir hata çalıştırma kırmızıya döner.
Yanlışlıklar ve düzeltmeler
Planlı bir geri bağlantık işinde ilk önce ne bozulur
Yanlışlık
Ne görürsünüz
Düzeltme
Anahtar YAML'a yapıştırıldı
Anahtar repo geçmişinde görünür
Yenileyin, secrets.LZ_KEY'e taşıyın
Tuhaf dakika gibi 0 0
Çalıştırma 20 dakika geç başlar
17 6 seçin; saat başı kalabalıktır
Repo 60 gün boyunca boş
GitHub zamanlamayı duraklatır
Bir şey commit edin veya Actions sekmesinden yeniden etkinleştirin
Döngü yalnızca boş bir sayfada durur
Sayfa sınırında sonsuz çalıştırma
len(rows) >= total olduğunda da dur
Çıkış kodu yok sayıldı
Yeşil tik, boş klasör
ok: false durumunda sys.exit kullanın
Değişiklik yoksa commit başarısız olur
Boş yere kırmızı çalıştırma
Commit'ten sonra || exit 0 ekleyin
Anahtarı ve repo'yu güvende tutmak
Anahtar, bu kurulumda korumaya değer tek şeydir. Onu bir şifre gibi ele alın, çünkü elinde olan herkes bakiyenizi harcayabilir.
Planlı işler sessizce sızdırır. Log'a yapıştırılan bir anahtar, genel bir repo'ya kopyalanan bir iş akışı veya yazma erişimi olan eski bir ekip üyesi yaygın yollardır. Her çeyrek bir kez bunları kontrol edin.
Birisi ayrıldığında anahtarı yenileyin
Erişimi olan bir ekip üyesi ayrıldığında, yeni bir anahtar oluşturun, gizli anahtarı güncelleyin ve eskisini iptal edin. Ardından bir sonraki çalıştırmanın geçtiğini onaylayın. Değişiklikten sonra bir yeşil çalıştırma, yıl boyunca yapacağınız en ucuz testtir. Dönüşüm tarihini repo notlarına da yazın, böylece bir sonraki dönüşüm sürpriz olmasın.
İş akışını düzenleyebilecek kişileri sınırlayın
YAML'ı düzenleyebilen herkes gizli anahtarı bir çalıştırmada yazdırabilir. Yazma erişimini kısa tutun ve iş akışı dosyasındaki değişiklikleri kodu incelediğiniz gibi gözden geçirin. Küçük bir repo için iki yazma erişimi genellikle yeterlidir.
İstek URL'sini asla yazdırmayın
Bakiyeyi ve satır sayısını yazdırın, asla istek URL'sini değil. Anahtar sorgu dizgisinde seyahat eder, bu yüzden URL'yi yazdıran bir hata ayıklama satırı anahtarı loga yazar. Bir issue'da bir isteği paylaşmak zorundaysanız, önce anahtarı bir yer tutucu ile değiştirin.
Anlık görüntünün ne olduğu ve olmadığı
Elde ettiğiniz aylık bir resimdir. Kendi tarayıcımız dizini ayda yaklaşık bir kez yeniler, bu yüzden aynı aydaki iki Pazartesi çalıştırması genellikle aynı satırları döndürür. Bu beklenendir.
Haftalık bir ritim çalışır. Alışkanlığı canlı tutar ve başarısız bir işi otuz gün yerine yedi gün içinde yakalarsınız. Salı günü kurduğunuz bir bağlantı Pazartesi günü eksikse, panik yapmadan bir sonraki yenilemeye kadar bekleyin.
Üç veya dört tarihli klasörünüz olduğunda, SQLite farkına geçin. İnatçı bir yanım koduyla takılıyorsanız, hız sınırı tablosu bir döngü için her durumun ne anlama geldiğini listeler.
İlk klasörü temel olarak tutun. Her sonraki karşılaştırma ona işaret eder ve tarihle adlandırılan bir klasör, geçen bahar sayıların nasıl göründüğüne dair bir hafızadan çok daha kolay güvenilir. Tutarlı kalın.
Anchor metinleri ve üst sayfalar ekleme
Dosya başına bir eylem, farkları okunabilir tutar. snap.py'deki döngüyü kopyalayın, refdomains'i anchors veya toppages ile değiştirin ve ikinci bir dosya adına yazın. Her biri 2 krediye mal olur.
Birleşik bir dosya hangi kısmın değiştiğini gizler ve bir gözden geçiren, bir pull request'i kaydırırken fark başına bir kavram görmek ister. Onları ayrı tutun. Üç alan izliyorsanız, iş akışında bir matrisle kısa bir liste üzerinde döngü kurun, böylece her hedef kendi işini ve kendi başarısızlığını alsın.
Anchor metinleri, farkta kendi sınırına sahip ikinci bir dosyadır, bu yüzden yönlendiren alan adlarından ayrı olarak gözden geçirin. Her çalıştırma ucuz ve tekrarlanabilir kalır, ki bu da tüm fikirdir.
Çalıştırma logunu okuma
İlk çalıştırmanın logunu açın. Zamanlamaya güvenmeden önce bunu yapın. Satır sayısına, bakiyeye ve commit satırına bakın. Bunlardan biri eksikse, iş iddia ettiğinden daha az yaptı. Aylık harcamayı dashboard'u açmadan görünür kılmak için her çalıştırmada bakiyenin kısa bir notunu da tutun.
Yeşil tik az şey söyler. Yalnızca işin temiz bir şekilde sonlandığını gösterir. Dosyanın doğru satırları içerdiğini söylemez, bu yüzden betik kendi özetini yazdırır. Betik sürümleri arasında bu özet satırlarını değişmez tutun, böylece iki log'un farkı yalnızca gerçek değişiklikleri gösterir.
Sağlıklı bir log nasıl görünür
Sağlıklı bir çalıştırma, satır sayısını ve kredi bakiyesini içeren bir satır yazdırır, ardından bugünün tarihiyle bir commit yapar. Bu satırları ekstra gürültünün altına gömen her şey ikinci bir bakışa değerdir.
Sessiz bir hatayı tespit etme
Boş bir klasör, hiç görünmeyen bir commit veya toplamdan farklı bir satır sayısına dikkat edin. Bunların her biri API'ye değil, döngüye veya ayrıştırıcıya işaret eder. Sonraki karşılaştırmalar için referans olarak ilk sağlıklı log'u kaydedin.
Bazı hatalar, genellikle olduğundan daha az satır içeren bir klasör bırakır. Yeşil bir çalıştırmayı kutlamadan önce önceki haftayla karşılaştırın, çünkü sessiz bir kısaltma, sessiz bir ay gibi görünür.
İki hedefi güvenli bir şekilde ekleme
İkinci bir alan, iş akışının bir kopyası değil, bir matris girişidir. Her hedefe kendi işini verin, böylece bir hata diğerini gizlemesin. Her işi ayrı tutun. Yolların alan adını içerdiğinden emin olun, böylece iki çalıştırma aynı dosyaya yazmaz.
Yalnızca ikinci hedefle başlayın. Klasörü doğru göründüğünde geri kalanı ekleyin. Yarım yamalak başarısız olan bir matris, iki basit çalıştırmadan daha zordur.
Klasörleri hedefe göre adlandırın
Yolu alan adını içerecek şekilde ayarlayın, örneğin data/<domain>/YYYY-MM-DD, böylece iki iş aynı dakikada çalışsa bile klasörler ayrı kalır. Eski klasörler oldukları yerde kalabilir, çünkü yoldaki bir tarih onları bulmayı kolaylaştırır.
Her hedef için aynı adlandırma kuralını kullanın. Bu sayede bir betik özel durumlar olmadan klasörleri listeleyebilir.
Kredi bütçesini önce planlayın
Hedef başına çağrı sayısını hedef sayısıyla çarpın, ardından ilk çalıştırmadan önce toplamı bakiyenizle karşılaştırın. Bir matris, işleri çarptığı kadar harcamayı da çarpar. Beklenen aylık toplamı iş akışının yanına repo'ya yazın. Bakiye bundan daha hızlı düşerse, bir döngü muhtemelen sayfaları yeniden alıyor demektir ve bir sonraki çalıştırmadan önce durdurabilirsiniz.
İlk hafta sorular
Bunu ücretsiz özel bir repo'da çalıştırabilir miyim?
Genellikle evet, GitHub'ın ücretsiz hesaplar için verdiği aylık dakikalar içinde. Bir anlık görüntü işi bir dakikadan az sürer, bu yüzden haftalık bir zamanlama çok küçük bir pay kullanır. GitHub zaman zaman bunu değiştirdiği için kendi planınızın mevcut iznini kontrol edin.
Birkaç kişi push yapıyorsa anahtar nerede olmalı?
Bir organizasyon veya depo gizli anahtarında, dosyalarda değil. İş akışını düzenleyebilen herkes gizli anahtarı bir logda yazdırabilir, bu yüzden yazma erişimine sahip olanları sınırlayın ve birisi projeden ayrıldığında anahtarı yenileyin.
Neden planlı çalıştırmam ateş etmedi?
Üç yaygın neden. İş akışı dosyası varsayılan dalda değil, repo 60 gün boyunca boştu ve GitHub zamanlamayı duraklattı, veya cron dizgesinde bir yazım hatası var. Betiği kendisi hariç tutmak için bir kez workflow_dispatch ile çalıştırın.
Veri klasörleri ne kadar büyük olur?
Küçük. Bin yönlendiren alan adı, birkaç yüz kilobyte JSON'dur. Bir alan için bir yıllık haftalık dosyalar yüz megabaytın çok altında kalır, bu git için iyidir, ancak sizi rahatsız ediyorsa eski klasörleri sıkıştırabilirsiniz.