Semua orang dapat melakukan ini:
proyek lokal -> github
Dengan akses ssh (berbayar), Anda dapat melakukan ini:
proyek lokal -> PythonAnywhere
Artikel menunjukkan bagaimana (gratis) melakukan ini:
proyek lokal -> github -> PythonAnywhere
Pertama, saya akan membuat daftar mengapa Anda mungkin membutuhkan ini, dan kemudian beralih ke cara mengimplementasikannya. Jangan lewatkan artikel ini jika bagian pertama tidak menarik bagi Anda.
Mengapa
PythonAnywhere adalah layanan hebat! Ini gratis, memberikan daya yang baik dan bahkan database, sehingga Anda dapat meningkatkan situs dinamis dalam beberapa menit. Ini adalah pilihan bagus untuk pemula yang ingin mencoba sesuatu secara langsung, dan bagi mereka yang perlu meng-host API atau proyek pribadi.
Namun layanan ini juga memiliki kekurangan. Bagaimana jika Anda ingin membuka kode yang sedang Anda kerjakan? Apakah Anda akan mendukung dan membuat perubahan di dua tempat sekaligus? Sekali pada produksi PythonAnywhere dan kedua kalinya pada GitHub untuk pengembang lain. Bagaimana jika Anda menerima Tarik Permintaan atau ingin mengintegrasikan CI? Menduplikasi semua tindakan secara terus-menerus sangat merepotkan.
GitHub adalah layanan hebat untuk bekerja bersama dan melihat kode sumber, UI mereka lebih baik daripada di PythonAnywhere dan, yang saya tuju, mengedit kode langsung di PythonAnywhere tidak terlalu menyenangkan. Bagaimana jika kita bisa menggabungkan yang terbaik dari dua dunia?
Anda mendorong semua pembaruan di GitHub, dan aplikasi PythonAnywhere menyinkronkan dan memulai ulang secara otomatis. Anda dapat mengedipkan PR, menggunakan tiket, melihat kode Anda dari perangkat apa pun bahkan tanpa masuk dan tanpa membuka file di editor kode - secara umum, melakukan segala hal yang GitHub bisa Anda lakukan.
Saya sudah mendengar gumaman: "Bagus, bagus, yakin, tetapi bagaimana ini bisa dicapai?" Tidak sepatah kata pun!
Bagaimana?
Kami menggunakan webhook Github untuk memberi tahu Anda tentang pembaruan aplikasi, tarik dan muat ulang.
Sebagai contoh, saya akan mempertimbangkan aplikasi SwagLyrics saya, yang backend saya pegang di PythonAnywhere. Saya menggunakan Flask, jadi prosesnya akan berbeda untuk kerangka kerja lain.
Pertama, sinkronkan proyek sehingga GitHub adalah asalnya. Jika Anda belum membuat repositori PythonAnywhere, Anda dapat menginisialisasi atau mengkodenya langsung dari GitHub.
Sesuatu seperti:
git init git remote add origin https://github.com/yourusername/yourreponame.git
Sekarang pergi ke GitHub -> Pengaturan -> Webhooks -> Tambahkan webhook
Di sana Anda akan melihat:
Di bidang "URL Muatan", tambahkan domain_anda / route_untuk memperbarui
Sebagai contoh, webhook dari repositori saya menunjuk ke nbsp; https://aadibajpai.pythonanywhere.com/update_server
Ubah "Jenis konten" dari application / x-www-form-urlencoded ke application / json (saya akan memberi tahu Anda mengapa ini diperlukan sedikit kemudian).
Kami belum akan menyentuh bidang Rahasia.
Pastikan opsi "push event" dipilih dan klik "Tambahkan webhook".
Buka aplikasi Anda di Flask, kami akan mengonfigurasi rute untuk menerima informasi dari GitHub ketika acara dorong terjadi. Path harus yang Anda tentukan di bidang "URL Muatan". Kami tidak secara eksplisit menentukan cabang master, sebagai untuk kesederhanaan, tersirat bahwa itu adalah satu-satunya di repositori.
Setup paling sederhana akan terlihat seperti ini:
from flask import Flask, request import git
app = Flask(__name__)
@app.route('/update_server', methods=['POST']) def webhook(): if request.method == 'POST': repo = git.Repo('path/to/git_repo') origin = repo.remotes.origin
origin.pull()
return 'Updated PythonAnywhere successfully', 200 else: return 'Wrong event type', 400
Ini adalah contoh paling sepele, versi yang lebih lengkap akan lebih rendah.
Sekarang, setiap kali terjadi peristiwa dorong, aplikasi akan memperbarui dirinya sendiri dengan melakukan tarikan.
Jika semuanya berjalan lancar, inilah yang akan Anda lihat setelah komit berikutnya:
Sebelum kita beralih ke melindungi webhook dari orang asing, saya akan memberi tahu Anda cara me-restart aplikasi setelah menarik sehingga Anda tidak perlu melakukan ini secara manual.
Aplikasi web memuat ulang secara otomatis
Kami akan menggunakan kait git. Ini hanya perintah shell yang dieksekusi setelah peristiwa. Tidak ada pengait untuk acara setelah tarik, tapi ...
Kami menggunakan fakta bahwa git pull tidak lebih dari git fetch → git merge , tetapi sebuah hook untuk acara setelah penggabungan ada. Ini dijalankan jika tarikan selesai dengan sukses.
Di repositori PythonAnywhere Anda, buka .git / hooks /
Sudah ada beberapa kait yang ada, tambahkan milik Anda kepadanya dengan membuat file pasca-penggabungan
Tulis kode berikut ke dalamnya:
#!/bin/sh touch /path/to/username_pythonanywhere_com_wsgi.py
Gunakan jalur ke wsgi Anda, yang, ketika diubah (sentuh), restart aplikasi.
Untuk membuat file dapat dieksekusi, buka konsol dan jalankan
chmod +x post-merge
Pastikan reboot berfungsi dengan membuat komit baru.
Sekarang mari kita beralih ke mengamankan webhook.
Perlindungan Webhook
Diperlukan perlindungan webhook agar orang lain tidak dapat terus-menerus mengirim permintaan untuk memulai kembali aplikasi. Kami akan menggunakan panduan ini .
Pertama, tambahkan token rahasia di PythonAnywhere sebagai variabel lingkungan, serta di bidang "Rahasia" di pengaturan webhook GitHub. Di sini prosesnya dijelaskan secara lebih rinci.
GitHub memberikan metodenya dalam Ruby, tetapi kami menggunakan Python, jadi kami akan menggunakan fungsi perbandingan ini:
import hmac import hashlib def is_valid_signature(x_hub_signature, data, private_key): # x_hub_signature and data are from the webhook payload # private key is your webhook secret hash_algorithm, github_signature = x_hub_signature.split('=', 1) algorithm = hashlib.__dict__.get(hash_algorithm) encoded_key = bytes(private_key, 'latin-1') mac = hmac.new(encoded_key, msg=data, digestmod=algorithm) return hmac.compare_digest(mac.hexdigest(), github_signature)
Sekarang modifikasi controller update_server untuk memeriksa apakah tanda tangan valid dengan menambahkan baris-baris ini sebelum bagian pembaruan kode:
x_hub_signature = request.headers.get('X-Hub-Signature') if not is_valid_signature(x_hub_signature, request.data, w_secret):
w_secret harus cocok dengan nilai yang Anda atur sedikit lebih awal sebagai variabel lingkungan.
Secara umum, masuk akal untuk menambahkan pencatatan dan beberapa pemeriksaan lagi untuk memastikan bahwa webhook GitHub atau bahwa acara tersebut berisi data, jadi jika Anda mau, Anda dapat menyalin kode yang relevan dari repositori saya , mengubahnya jika perlu, karena Anda sudah tahu segalanya yang penting
Semoga informasinya bermanfaat. Saya tahu ada banyak hal, tetapi saya ingin Anda mengerti apa yang terjadi.
Saya tidak menemukan semuanya sendiri, tetapi saya mengumpulkan yang paling penting dari berbagai sumber dan menciptakan solusi lengkap.
Berikut tautan yang membantu saya dan dapat membantu Anda: Terima kasih sudah membaca!