本教程包括:
- 设置PythonAnywhere
- 在CircleCI上建立一个Flask项目
- 使用CircleCI自动将Flask部署到PythonAnywhere上
既然开发团队知道CI/CD,就没有理由让部署成为一个耗时而繁琐的过程。CI/CD可能从持续测试开始,但增加自动部署会使你的CI/CD实践更上一层楼。
持续部署缩短了发布的时间,因此你可以花更多时间来提高你的应用程序的质量。在本教程中,我将指导你使用自动化持续部署,将Flask应用程序部署到PythonAnywhere。我希望在我们结束本教程时,你会觉得自己是一个 "摇滚明星 "级别的CI/CD实践者。
前提条件
在你开始之前,确保这些项目已经到位。
- 一个PythonAnywhere黑客计划
- 一个CircleCI账户
- 一个GitHub账户
- CI/CD的基本知识
- 具有Swagger UI的API文档知识
我们的教程是与平台无关的,但使用CircleCI作为一个例子。如果你没有CircleCI账户,请**在这里注册一个免费账户。**
我在本教程中使用的示例应用程序是一个Flask API。Flask应用程序暴露了一个Swagger API,我们可以用它来创建和检索书籍。通过克隆这个GitHub资源库来获取该应用的源代码。 git clone git@github.com:mwaz/automating-flask-deployments-with-pythonanywhere.git
你将只在PythonAnywhere的配置中使用克隆的仓库,这将在本教程的后面讲述。
什么是 PythonAnywhere?
PythonAnywhere是一个托管平台,是 AWS、Azure、Google Cloud 或 Heroku 等平台的替代品。PythonAnywhere平台为开发和在线部署提供了一个基于云的、易于使用的工具。
自动部署到PythonAnywhere
将持续部署自动化到PythonAnywhere为开发者提供了许多好处。
- 易于和快速设置
- 为性能而建
- 对开源项目免费
我创建了一个流程图(以CircleCI为例),展示了自动持续部署到PythonAnywhere的工作方式。该流程可以适用于任何CI/CD工具和其他托管平台。

该图显示了如何使用CircleCI API与CircleCI Web界面和配置文件来配置部署工作。该图还显示了所有CircleCI的步骤和服务从一个高层次的观点被执行的过程。请注意从应用程序克隆到准备部署,然后部署应用程序的上下文分离。
设置PythonAnywhere
PythonAnywhere使启动和设置变得简单。PythonAnywhere平台。
- 带有预装的Python库
- 允许你为一个应用程序设置不同的环境
- 支持调度任务,如定期清理数据库或使用cron作业来完成重复性任务
一旦你登录到你注册的PythonAnywhere黑客账户,打开web 标签并创建一个新的webapp 。对于这个项目,使用手动配置选项。这可以让你设置一个虚拟环境并安装项目特有的额外库。

当设置完成后,你将被重定向到你的网络应用程序的仪表板。你可以使用仪表板,通过控制台界面进一步配置你的应用程序。

从控制台,你可以使用特定的python版本声明版本为你的应用程序创建一个虚拟环境:3.9 。运行这个命令。
mkvirtualenv flask-venv --python=’/usr/bin/python3.9
将应用程序克隆到PythonAnywhere控制台中
接下来,从GitHub克隆应用程序到PythonAnywhere控制台。这是一个重要的步骤,因为它还设置了远程push 和pull GitHub 链接,我们以后将使用这些链接从 GitHub 拉取更改。在控制台中运行这个命令。
git clone https://github.com/mwaz/automating-flask-deployments-with-pythonanywhere.git
安装依赖项
更改目录:cd automating-flask-deployments-with-pythonanywhere使用 pipenv 软件包管理器安装。 pip install pipenv
用安装所有的依赖项。 pipenv install
克隆Flask应用程序后,你需要告诉PythonAnywhere你的项目的位置。要做到这一点,使用Web标签配置位置。在不关闭 bash 控制台的情况下 (在最右边的汉堡包菜单上),打开Web标签并设置项目的源代码路径、虚拟环境路径和静态文件,包括 Swagger UI YAML 文件。

将源代码路径设置为。 /home/<username>/<project-name>
创建虚拟环境后,你可以用它打开控制台。现在你可以忽略这个选项。
注意。 要获得工作目录路径,可以使用bash$pwd 命令来查找父目录。
恭喜你!你的Flask项目已经建立起来了。你的 Flask 项目已经设置好了,并成功地托管在 PythonAnywhere 上。打开你的 web 应用程序的链接,查看 PythonAnywhere 的默认屏幕。

到目前为止做得很好,但还有几个步骤要做。
你的应用程序的页面显示 PythonAnywhere 默认的欢迎信息。为了打开你的 Flask 应用程序,你需要对 PythonAnywhere 的配置文件做一些修改。
从仪表板上打开 WSGI 配置文件并修改配置。

WSGI (Web Server Gateway Interface) 是一个通往Web服务器的Python接口。它允许你编写可以在服务器上运行的Python代码,用于配置Web服务器。通过WSGI,你可以将请求从Web服务器转发到Flask后端,再从Web服务器转发到请求者。
为了使你的Flask应用程序能够执行,请删除配置文件中的hello world 代码。
同时,配置你的项目目录的路径和你的应用程序的入口点。
import sys
# add your project directory to the sys.path
project_home = '/home/waweru/automating-flask-deployments-with-pythonanywhere'
if project_home not in sys.path:
sys.path = [project_home] + sys.path
# import flask app but need to call it "application" for WSGI to work
from run import app as application
保存更改并关闭文件。接下来,你需要重新加载应用程序,并在URL上附加后缀api-docs 。这样就会加载你的Flask Swagger文档页面。

你已经成功地将你的 Flask 应用程序部署到 PythonAnywhere。
接下来,你需要配置你的应用程序,使其在每次部署到主分支时由CircleCI自动部署。
设置CircleCI集成
为了在这个项目中设置CI/CD,使用ssh 来连接到PythonAnywhere服务器。这可以确保一旦CircleCI执行,如果管道运行成功,你可以从GitHub主分支拉取最新的修改。
注意。 SSH也被称为Secure Shell或Secure Socket Shell,是一种网络协议,用于操作网络服务,在不安全的网络上安全连接。ssh的应用包括;远程命令行登录和远程命令执行。
下图显示了CI/CD是如何通过CircleCI和PythonAnywhere使用ssh应用的。

图中显示,当你把代码推送到GitHub时,它启动了一个过程,将代码部署到PythonAnywhere。一旦部署完成,你就可以连接到PythonAnywhere服务器并从主分支拉取最新的代码。现在你知道了它是如何工作的,你的下一步是写一个CircleCI配置文件来实现它。
在仪表板上初始化CircleCI
要在CircleCI中设置任何项目,请在CircleCI仪表板上开始。转到项目部分。所有与你的GitHub用户名或组织相关的GitHub仓库都会被列出。在本教程中,你要设置的仓库是automating-flask-deployments-with-pythonanywhere 。
在 "项目 "仪表板上,选择选项来设置所选项目。选择使用现有配置的选项。第一个配置步骤就完成了。
注意: 如果你已经克隆了这个资源库,这不是一个必须的步骤,但对你来说是一个重要的步骤,你可以学习如何在自己的项目中设置它。
首先,在你的根目录下创建一个.circleci 目录,并添加一个config.yml 文件。该配置文件将包含每个项目的CircleCI配置。当这个设置完成后,你可以在配置中使用CircleCI orbs来执行你的Python API测试。
设置CircleCI
你的CircleCI配置文件将执行你的测试并将你的应用程序部署到PythonAnywhere。在.circleci/config.yaml 文件中,输入:
version: 2.1
orbs:
python: circleci/python@1.2
workflows:
build-app-with-test:
jobs:
- build-and-test
- deploy:
requires:
- build-and-test
jobs:
build-and-test:
docker:
- image: cimg/python:3.9
steps:
- checkout
- run:
name: Install dependencies
command: |
pipenv --three
pipenv install
- run:
name: Run tests
command: pipenv run pytest
deploy:
docker:
- image: cimg/python:3.9
steps:
- checkout
- run:
name: Deploy Over SSH
command: |
ssh-keyscan -H ssh.pythonanywhere.com >> ~/.ssh/known_hosts
ssh $SSH_USER@$SSH_HOST "cd automating-flask-deployments-with-pythonanywhere; git pull";
在这个CircleCI配置中,你正在创建两个作业。第一个作业是一个构建作业,负责安装依赖项和运行测试。部署作业只负责将应用程序部署到PythonAnywhere。运行构建和测试工作,然后是部署工作,确保只有在测试成功后才进行部署。
jobs:
- build-and-test
- deploy:
requires:
- build-and-test
测试通过后,你可以使用deploy作业将你的应用程序部署到PythonAnywhere。为了允许部署应用程序,你需要在你的PythonAnywhere账户中生成SSH密钥,然后将该私钥添加到你的GitHub账户。
生成 SSH 密钥
你不希望总是使用密码来连接到 PythonAnywhere。为了允许连接到 PythonAnywhere 而无需每次都输入密码,你可以在 PythonAnywhere 控制台上生成 SSH 密钥。从 PythonAnywhere 控制台,运行这个命令。
ssh-keygen -t rsa -b 2048
将会提示你输入一个口令以获得额外的安全。你可以添加它或者留空。

很好!你已经生成了你的密钥。现在你可以在 CircleCI 中使用它们来自动连接到 PythonAnywhere。我将在下一节介绍这个问题。
但首先,你需要 PythonAnywhere 知道你的公钥是一个授权的密钥。使用这个命令在 PythonAnywhere 的控制台中把公钥添加到~/.ssh/authorized_keys 。
ssh-copy-id waweru@ssh.pythonanywhere.com
你会被提示输入密码。一旦授权,你就可以连接到 PythonAnywhere,而不需要再使用密码。很酷吧?在 PythonAnywhere 控制台中运行这个命令来测试。
ssh -i ~/.ssh/id_rsa_pub waweru@ssh.pythonanywhere.com
这个命令可以让你从控制台登录到 PythonAnywhere 服务器,而无需输入密码。你的下一步是向CircleCI添加SSH密钥。
添加SSH密钥到CircleCI
按照上一节的步骤,你能够为PythonAnywhere账户生成私钥和公钥。现在你可以把你的私钥复制到CircleCI。
为了避免给服务器增加开销,你可以直接显示私钥,然后将其复制到剪贴板上。在PythonAnywhere控制台,输入这个命令。
cat ~/.ssh/id_rsa

一旦你把你的私钥复制到剪贴板上,导航到你项目的CircleCI项目设置,并在那里添加私钥。

使用CircleCI进行部署
部署到CircleCI的基本设置已经完成。回到您的CircleCIconfig.yml 文件中的Deploy Over SSH 配置步骤。使用keyscan步骤ssh-keyscan -H ssh.pythonanywhere.com >> ~/.ssh/known_hosts 。这将为你的PythonAnywhere账户获取SSH密钥,并将其添加到部署任务的运行者~/.ssh/known_hosts 文件中。
然后使用 SSH 进行认证,并使用此命令从 GitHub 拉取代码。
ssh $SSH_USER@$SSH_HOST "cd automating-flask-deployments-with-pythonanywhere; git pull";
注意,我们使用$SSH_USER 和$SSH_HOST 变量来进行认证,同时掩盖 SSH 用户和主机名。我们通过在环境变量下的CircleCI设置页面添加SSH_USER 和SSH_HOST 来做到这一点。

通过 SSH 访问 PythonAnywhere 的SSH_HOST 是ssh.pythonanywhere.com 。SSH_USER 是你的 PythonAnywhere 帐户的用户名。
现在你应该能够使用 CircleCI 将你的应用程序部署到 PythonAnywhere。

如前所述,部署工作是在构建和测试工作之后运行的。这是因为部署工作需要构建和测试工作的通过,如果构建和测试工作失败,部署工作将失败。

在 PythonAnywhere 上重新加载应用程序
为了验证你的应用程序是否成功部署到 PythonAnywhere,你需要使用 PythonAnywhere 仪表板手动重新加载。你可以通过在PythonAnywhere账户中创建一个bash脚本来避免这一步骤。该脚本会在部署后自动重新加载应用程序。将此脚本称为reload.sh ,并添加命令以重新创建或更新<username>_pythonanywhere_com_wsgi.py 文件。这个命令控制重新加载应用程序。
#!/bin/bash
touch var/www/<username>_pythonanywhere_com_wsgi.py
将脚本添加到根文件夹中的reload.sh 后,使用 PythonAnywhere 控制台使其可执行。在控制台中,运行这个命令。
chmod +x reload.sh
这个命令使脚本在PythonAnywhere中每次检测到变化时都可在bash中执行。现在,每次启动部署时,该脚本将被执行,应用程序将被重新加载。恭喜你实现了我们用PythonAnywhere进行自动化部署的目标!
总结
通过本教程,你已经能够学习如何准备一个用于部署的应用程序,配置PythonAnywhere环境,并使用SSH进行自动部署。本教程还解释了 SSH 密钥在部署到 PythonAnywhere 中的重要性。通过设置应用程序在所有参数(包括通过测试和CircleCI作业)得到满足时进行部署,你增加了对CI/CD实践的了解。你还学会了如何在每次部署后对PythonAnywhere进行自动重载。