Çalışma kitabı

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.

Güvenilir planlı iş akışı altyapısını simgeleyen bir nehre uzanan demir köprü
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.

yaml
name: backlink-snapshot
on:
  schedule:
    - cron: '17 6 * * 1'
  workflow_dispatch:
jobs:
  snap:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - run: python snap.py example.com
        env:
          LZ_KEY: ${{ secrets.LZ_KEY }}
      - run: |
          git config user.name snapshot-bot
          git config user.email "snapshot-bot@localhost"
          git add data
          git commit -m "snapshot $(date -u +%F)" || exit 0
          git push
Zamanlamaya başlamadan önce hazırlığı temsil eden genç bir fidan budayan bahçıvan

Zamanlamayı açmadan önce

  • 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ıkNe görürsünüzDüzeltme
Anahtar YAML'a yapıştırıldıAnahtar repo geçmişinde görünürYenileyin, secrets.LZ_KEY'e taşıyın
Tuhaf dakika gibi 0 0Çalıştırma 20 dakika geç başlar17 6 seçin; saat başı kalabalıktır
Repo 60 gün boyunca boşGitHub zamanlamayı duraklatırBir şey commit edin veya Actions sekmesinden yeniden etkinleştirin
Döngü yalnızca boş bir sayfada dururSayfa sınırında sonsuz çalıştırmalen(rows) >= total olduğunda da dur
Çıkış kodu yok sayıldıYeşil tik, boş klasörok: false durumunda sys.exit kullanın
Değişiklik yoksa commit başarısız olurBoş yere kırmızı çalıştırmaCommit'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.

Düzenli ilerlemeyi ve erken sorun tespitini gösteren pusula ve saksı bitki

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.