如何用PythonAnywhere实现Flask部署的自动化

1,183 阅读5分钟

本教程包括:

  1. 设置PythonAnywhere
  2. 在CircleCI上建立一个Flask项目
  3. 使用CircleCI自动将Flask部署到PythonAnywhere上

既然开发团队知道CI/CD,就没有理由让部署成为一个耗时而繁琐的过程。CI/CD可能从持续测试开始,但增加自动部署会使你的CI/CD实践更上一层楼。

持续部署缩短了发布的时间,因此你可以花更多时间来提高你的应用程序的质量。在本教程中,我将指导你使用自动化持续部署,将Flask应用程序部署到PythonAnywhere。我希望在我们结束本教程时,你会觉得自己是一个 "摇滚明星 "级别的CI/CD实践者。

前提条件

在你开始之前,确保这些项目已经到位。

我们的教程是与平台无关的,但使用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 and PythonAnywhere deployment steps

该图显示了如何使用CircleCI API与CircleCI Web界面和配置文件来配置部署工作。该图还显示了所有CircleCI的步骤和服务从一个高层次的观点被执行的过程。请注意从应用程序克隆到准备部署,然后部署应用程序的上下文分离。

设置PythonAnywhere

PythonAnywhere使启动和设置变得简单。PythonAnywhere平台。

  • 带有预装的Python库
  • 允许你为一个应用程序设置不同的环境
  • 支持调度任务,如定期清理数据库或使用cron作业来完成重复性任务

一旦你登录到你注册的PythonAnywhere黑客账户,打开web 标签并创建一个新的webapp 。对于这个项目,使用手动配置选项。这可以让你设置一个虚拟环境并安装项目特有的额外库。

PythonAnywhere creating a new web app

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

Application dashboard PythonAnywhere

从控制台,你可以使用特定的python版本声明版本为你的应用程序创建一个虚拟环境:3.9 。运行这个命令。

mkvirtualenv flask-venv --python=’/usr/bin/python3.9

将应用程序克隆到PythonAnywhere控制台中

接下来,从GitHub克隆应用程序到PythonAnywhere控制台。这是一个重要的步骤,因为它还设置了远程pushpull 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 文件。

Configuring Code repository

将源代码路径设置为。 /home/<username>/<project-name>

创建虚拟环境后,你可以用它打开控制台。现在你可以忽略这个选项。

注意。 要获得工作目录路径,可以使用bash$pwd 命令来查找父目录。

恭喜你!你的Flask项目已经建立起来了。你的 Flask 项目已经设置好了,并成功地托管在 PythonAnywhere 上。打开你的 web 应用程序的链接,查看 PythonAnywhere 的默认屏幕。

Default PythonAnywhere apps page

到目前为止做得很好,但还有几个步骤要做。

你的应用程序的页面显示 PythonAnywhere 默认的欢迎信息。为了打开你的 Flask 应用程序,你需要对 PythonAnywhere 的配置文件做一些修改。

从仪表板上打开 WSGI 配置文件并修改配置。

WSGI location

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文档页面。

 Swagger page PythonAnywhere

你已经成功地将你的 Flask 应用程序部署到 PythonAnywhere。

接下来,你需要配置你的应用程序,使其在每次部署到主分支时由CircleCI自动部署。

设置CircleCI集成

为了在这个项目中设置CI/CD,使用ssh 来连接到PythonAnywhere服务器。这可以确保一旦CircleCI执行,如果管道运行成功,你可以从GitHub主分支拉取最新的修改。

注意。 SSH也被称为Secure Shell或Secure Socket Shell,是一种网络协议,用于操作网络服务,在不安全的网络上安全连接。ssh的应用包括;远程命令行登录和远程命令执行。

下图显示了CI/CD是如何通过CircleCI和PythonAnywhere使用ssh应用的。

 SSH with CircleCI

图中显示,当你把代码推送到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

将会提示你输入一个口令以获得额外的安全。你可以添加它或者留空。

 Generating public/private keys

很好!你已经生成了你的密钥。现在你可以在 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

 Generating public/private keys

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

 Adding a private key

使用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_USERSSH_HOST 来做到这一点。

 Declaring host and user

通过 SSH 访问 PythonAnywhere 的SSH_HOSTssh.pythonanywhere.comSSH_USER 是你的 PythonAnywhere 帐户的用户名。

现在你应该能够使用 CircleCI 将你的应用程序部署到 PythonAnywhere。

 Sequential runs

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

 Successful deployment to 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进行自动重载。