千鋒扣丁學堂Python培訓之如何使用GitHub實現(xiàn)持續(xù)部署方法
2019-05-09 14:22:50
3543瀏覽
今天千鋒扣丁學堂Python培訓老師給大家介紹一下關于如何使用GitHub和Python實現(xiàn)持續(xù)部署方法的詳細介紹,首先借助GitHub的網絡鉤子webhook,開發(fā)者可以創(chuàng)建很多有用的服務。從觸發(fā)一個Jenkins實例上的CI(持續(xù)集成)任務到配置云中的機器,幾乎有著無限的可能性。這篇教程將展示如何使用Python和Flask框架來搭建一個簡單的持續(xù)部署(CD)服務。
在這個例子中的持續(xù)部署服務是一個簡單的Flask應用,其帶有接受GitHub的網絡鉤子webhook請求的REST端點endpoint。在驗證每個請求都來自正確的GitHub倉庫后,服務器將拉取pull更改到倉庫的本地副本。這樣每次一個新的提交commit推送到遠程GitHub倉庫,本地倉庫就會自動更新。
Flaskweb服務
用Flask搭建一個小的web服務非常簡單。這里可以先看看項目的結構。
├── app
│ ├── __init__.py
│ └── webhooks.py
├── requirements.txt
└── wsgi.py
首先,創(chuàng)建應用。應用代碼在app目錄下。
兩個文件(__init__.py和webhooks.py)構成了Flask應用。前者包含有創(chuàng)建Flask應用并為其添加配置的代碼。后者有端點endpoint邏輯。這是該應用接收GitHub請求數據的地方。
這里是app/__init__.py的內容:
import os
from flask import Flask
from .webhooks import webhook
def create_app():
""" Create, configure and return the Flask application """
app = Flask(__name__)
app.config['GITHUB_SECRET'] = os.environ.get('GITHUB_SECRET')
app.config['REPO_PATH'] = os.environ.get('REPO_PATH')
app.register_blueprint(webhook)
return(app)
該函數創(chuàng)建了兩個配置變量:
GITHUB_SECRET保存一個密碼,用來認證GitHub請求。
REPO_PATH保存了自動更新的倉庫路徑。
這份代碼使用Flask藍圖FlaskBlueprints來組織應用的端點endpoint。使用藍圖可以對API進行邏輯分組,使應用程序更易于維護。通常認為這是一種好的做法。
這里是app/webhooks.py的內容:
import hmac
from flask import request, Blueprint, jsonify, current_app
from git import Repo
webhook = Blueprint('webhook', __name__, url_prefix='')
@webhook.route('/github', methods=['POST'])
def handle_github_hook():
""" Entry point for github webhook """
signature = request.headers.get('X-Hub-Signature')
sha, signature = signature.split('=')
secret = str.encode(current_app.config.get('GITHUB_SECRET'))
hashhex = hmac.new(secret, request.data, digestmod='sha1').hexdigest()
if hmac.compare_digest(hashhex, signature):
repo = Repo(current_app.config.get('REPO_PATH'))
origin = repo.remotes.origin
origin.pull('--rebase')
commit = request.json['after'][0:6]
print('Repository updated with commit {}'.format(commit))
return jsonify({}), 200
首先代碼創(chuàng)建了一個新的藍圖webhook。然后它使用Flaskroute為藍圖添加了一個端點。任何請求/GitHubURL端點的POST請求都將調用這個路由。
驗證請求
當服務在該端點上接到請求時,首先它必須驗證該請求是否來自GitHub以及來自正確的倉庫。GitHub在請求頭的X-Hub-Signature中提供了一個簽名。該簽名由一個密碼(GITHUB_SECRET),請求體的HMAC十六進制摘要,并使用sha1哈希生成。
為了驗證請求,服務需要在本地計算簽名并與請求頭中收到的簽名做比較。這可以由hmac.compare_digest函數完成。
自定義鉤子邏輯
在驗證請求后,現(xiàn)在就可以處理了。這篇教程使用GitPython模塊來與git倉庫進行交互。GitPython模塊中的Repo對象用于訪問遠程倉庫origin。該服務在本地拉取origin倉庫的最新更改,還用--rebase選項來避免合并的問題。
調試打印語句顯示了從請求體收到的短提交哈希。這個例子展示了如何使用請求體。更多關于請求體的可用數據的信息,請查詢GitHub文檔。
最后該服務返回了一個空的JSON字符串和200的狀態(tài)碼。這用于告訴GitHub的網絡鉤子服務已經收到了請求。
部署服務
為了運行該服務,這個例子使用gunicornweb服務器。首先安裝服務依賴。在支持的Fedora服務器上,以sudo運行這條命令:
sudo dnf install python3-gunicorn python3-flask python3-GitPython
現(xiàn)在編輯gunicorn使用的wsgi.py文件來運行該服務:
from app import create_app
application = create_app()
為了部署服務,使用以下命令克隆這個git倉庫或者使用你自己的git倉庫:
git clone https://github.com/cverna/github_hook_deployment.git /opt/
下一步是配置服務所需的環(huán)境變量。運行這些命令:
export GITHUB_SECRET=asecretpassphraseusebygithubwebhook
export REPO_PATH=/opt/github_hook_deployment/
這篇教程使用網絡鉤子服務的GitHub倉庫,但你可以使用你想要的不同倉庫。最后,使用這些命令開啟該web服務:
cd /opt/github_hook_deployment/
gunicorn --bind 0.0.0.0 wsgi:application --reload
這些選項中綁定了web服務的IP地址為0.0.0.0,意味著它將接收來自任何的主機的請求。選項--reload確保了當代碼更改時重啟web服務。這就是持續(xù)部署的魔力所在。每次接收到GitHub請求時將拉取倉庫的最近更新,同時gunicore檢測這些更改并且自動重啟服務。
*注意:*為了能接收到GitHub請求,web服務必須部署到具有公有IP地址的服務器上。做到這點的簡單方法就是使用你最喜歡的云提供商比如DigitalOcean,AWS,Linode等。
配置GitHub
這篇教程的最后一部分是配置GitHub來發(fā)送網絡鉤子請求到web服務上。這是持續(xù)部署的關鍵。
從你的GitHub倉庫的設置中,選擇Webhook菜單,并且點擊“AddWebhook”。輸入以下信息:
“PayloadURL”:服務的URL,比如<http://public_ip_address:8000/github>
“Contenttype”:選擇“application/json”
“Secret”:前面定義的GITHUB_SECRET環(huán)境變量
然后點擊“AddWebhook”按鈕。
以上就是關于千鋒扣丁學堂Python培訓之如何使用GitHub實現(xiàn)持續(xù)部署方法的全部內容,希望對大家的學習有所幫助,
最后想要了解更多關于Python和人工智能方面內容的小伙伴,請關注扣丁學堂Python培訓官網、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權威的Python開發(fā)環(huán)境搭建視頻,Python培訓后的前景無限,行業(yè)薪資和未來的發(fā)展會越來越好的,扣丁學堂老師精心推出的Python視頻教程定能讓你快速掌握Python從入門到精通開發(fā)實戰(zhàn)技能??鄱W堂Python技術交流群:279521237。
【關注微信公眾號獲取更多學習資料】 【掃碼進入Python全棧開發(fā)免費公開課】
查看更多關于"Python開發(fā)資訊"的相關文章>
標簽:
Python培訓
Python視頻教程
Python在線視頻
Python學習視頻
Python培訓班