рд╣рд░ рдХреЛрдИ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рдЬреАрдереБрдм
(рдкреНрд░рджрддреНрдд) ssh рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рдЕрдЬрдЧрд░
рд▓реЗрдЦ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдореБрдлреНрдд рдореЗрдВ):
рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рдЬреАрдереБрдм -> рдкрд╛рдпрдердирдСрдирд╡реЗ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕реВрдЪреА рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рддреЛ рд▓реЗрдЦ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
рдХреНрдпреЛрдВ?
PythonAnywhere рдПрдХ рдмреЗрд╣рддрд░реАрди рд╕реЗрд╡рд╛ рд╣реИ! рдпрд╣ рдореБрдлрд╝реНрдд рд╣реИ, рдЕрдЪреНрдЫреА рд╢рдХреНрддрд┐ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдПрдХ рджреЛ рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рд╛рдЗрдЯ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдХреБрдЫ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдПрдкреАрдЖрдИ рдпрд╛ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╕рдорд░реНрдерди рдФрд░ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВрдЧреЗ? рдПрдХ рдмрд╛рд░ PythonAnywhere рдЙрддреНрдкрд╛рджрди рдкрд░ рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП GitHub рдкрд░ред рдпрджрд┐ рдЖрдк рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╕реАрдЖрдИ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд▓рдЧрд╛рддрд╛рд░ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
GitHub рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╕реЛрд░реНрд╕ рдХреЛрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╕реЗрд╡рд╛ рд╣реИ, рдЙрдирдХрд╛ UI PythonAnywhere рдкрд░ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░, рдореИрдВ рдЬреЛ рднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ PythonAnywhere рдкрд░ рд╕реАрдзреЗ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрдЦрдж рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рджреЛ рджреБрдирд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЛ рдорд┐рд▓рд╛ рд╕рдХреЗрдВ?
рдЖрдк GitHub рдкрд░ рд╕рднреА рдЕрдкрдбреЗрдЯ рдкреБрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ PythonAnywhere рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдФрд░ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдкреАрдЖрд░рдЖрдИрдВрдХ рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЯрд┐рдХрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд┐рдП рдмрд┐рдирд╛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдПрдбрд┐рдЯрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗ рдмрд┐рдирд╛ - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдХрд░ рдХреЗ GitHub рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрдбрд╝рдмрдбрд╝рд╛рд╣рдЯ рд╕реБрдирддрд╛ рд╣реВрдВ: "рдЕрдЪреНрдЫрд╛, рдЕрдЪреНрдЫрд╛, рдЖрд╢реНрд╡рд╕реНрдд, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?" рдПрдХ рд╢рдмреНрдж рдФрд░ рдирд╣реАрдВ!
рдХреИрд╕реЗ?
рд╣рдо рдЖрдкрдХреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ, рдЦреАрдВрдЪрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрдердм рд╡реЗрдмрд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡реИрдЧреНрд▓рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдмреИрдХрдПрдВрдб рдореИрдВ рдкрд╛рдпрдердирдСрдирдПрд╡ рдкрд░ рд░рдЦрддрд╛ рд╣реВрдВред рдореИрдВ рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреВрд╕рд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛрдЧреАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд┐рдВрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ GitHub рдореВрд▓ рд╣реЛред рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ PythonAnywhere repository рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рд╕реАрдзреЗ GitHub рд╕реЗ рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
git init git remote add origin https://github.com/yourusername/yourreponame.git
рдЕрдм GitHub -> Settings -> Webhooks -> Add webhook рдкрд░ рдЬрд╛рдПрдВ
рд╡рд╣рд╛рдБ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:
"рдкреЗрд▓реЛрдб URL" рдлрд╝реАрд▓реНрдб рдореЗрдВ, рдЕрдкрдирд╛_рдбреЛрдореЗрди / рд░реВрдЯ_to_update рдЬреЛрдбрд╝реЗрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╡реЗрдм рдкреЙрдЗрдВрдЯ nbsp рд╕реЗ; https://aadibajpai.pythonanywhere.com/update_server
"рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░" рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / x-www-form-urlencoded рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / json рдореЗрдВ рдмрджрд▓реЗрдВ (рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред
рд╣рдо рдЕрднреА рддрдХ рдЧреБрдкреНрдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ "рдкреБрд╢ рдИрд╡реЗрдВрдЯ" рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ "рд╡реЗрдмрдмреБрдХ рдЬреЛрдбрд╝реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ, рд╣рдо рдПрдХ рдкреБрд╢ рдЗрд╡реЗрдВрдЯ рд╣реЛрдиреЗ рдкрд░ GitHub рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдкрде рд╡рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк "рдкреЗрд▓реЛрдб URL" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рднрдВрдбрд╛рд░ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╣реИред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗрдЯрдЕрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
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
рдпрд╣ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдПрдХ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХрдо рд╣реЛрдЧрд╛ред
рдЕрдм, рдЬрдм рднреА рдХреЛрдИ рдкреБрд╢ рдИрд╡реЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреБрд▓ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛, рддреЛ рдпрд╣рд╛рдВ рдЖрдк рдЕрдЧрд▓реЗ рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ:
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдЬрдирдмрд┐рдпреЛрдВ рд╕реЗ рд╡реЗрдмрд╣реВрдХ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкреБрд▓ рдХреЗ рдмрд╛рдж рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдЯреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ
рд╣рдо рдЧрд┐рдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпреЗ рдХреЗрд╡рд▓ рд╢реЗрд▓ рдХрдорд╛рдВрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрд▓ рдХреЗ рдмрд╛рдж рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣реБрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ...
рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧрд┐рдЯ рдкреБрд▓ , git fetch тЖТ git рдорд░реНрдЬ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдорд░реНрдЬ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реБрдХ рд╣реИред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдкреБрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЕрдкрдиреЗ PythonAnywhere рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ, .it / рд╣реБрдХ рдкрд░ рдЬрд╛рдПрдВ /
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдореМрдЬреВрджрд╛ рд╣реБрдХ рд╣реЛрдВрдЧреЗ, рдкреЛрд╕реНрдЯ-рдорд░реНрдЬ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рдЬреЛрдбрд╝реЗрдВ
рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗрдВ:
#!/bin/sh touch /path/to/username_pythonanywhere_com_wsgi.py
рдЕрдкрдиреЗ wsgi рдХреЗ рд▓рд┐рдП рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ, рдЬрдм (рд╕реНрдкрд░реНрд╢) рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ
chmod +x post-merge
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдирдпрд╛ рдХрдорд┐рдЯ рдХрд░рдХреЗ рд░рд┐рдмреВрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдПрдХ рд╡реЗрдмрд╣реЙрдХ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
Webhook рд╕рдВрд░рдХреНрд╖рдг
рдПрдХ webhook рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЖрд╡реЗрджрди рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рди рднреЗрдЬ рд╕рдХреЗред рд╣рдо рдЗрд╕ рдЧрд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, PythonAnywhere рдкрд░ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЯреЛрдХрди рдХреЗ рд╕рд╛рде-рд╕рд╛рде GitHub webhook рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ "рдЧреБрдкреНрдд" рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдЧреБрдкреНрдд рдЯреЛрдХрди рдЬреЛрдбрд╝реЗрдВред рдпрд╣рд╛рдБ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
GitHub рд░реВрдмреА рдореЗрдВ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
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)
рдЕрдм рдХреЛрдб рдЕрдкрдбреЗрдЯ рднрд╛рдЧ рд╕реЗ рдкрд╣рд▓реЗ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡реИрдз рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреНрд░реЛрд▓рд░ update_server рдХреЛ рдмрджрд▓реЗрдВ:
x_hub_signature = request.headers.get('X-Hub-Signature') if not is_valid_signature(x_hub_signature, request.data, w_secret):
w_secret рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЧрд┐рдЯрд╣рдм рд╡реЗрдмрд╣реВрдХ рдпрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рдбреЗрдЯрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореЗрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧреА рдереАред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдк рд╕рдордЭреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ред
рдореИрдВ рдЦреБрдж рд╕рдм рдХреБрдЫ рд▓реЗрдХрд░ рдирд╣реАрдВ рдЖрдпрд╛, рдмрд▓реНрдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдпрд╛ред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!