自动化Python应用程序的工作流程:使用GitHub操作创建CI/CD管道
#python #devops #githubactions

介绍

部署和测试Python应用程序可能是一项繁琐的任务。在本文中,我们将看到如何使用GitHub Action在GitHub上部署Python应用程序。
我们将创建一个简单的Python应用程序,然后使用GitHub操作在GitHub上部署它。我们还将查看如何使用github操作测试应用程序。

什么是github行动?

GitHub Actions是一个平台,允许开发人员在存储库中自动化工作流程。它提供了一种创建可以由事件触发的自定义工作流程的方法,例如代码推送,拉请请求或发行版。通过GitHub操作,开发人员可以自动化任务,例如构建和测试代码,部署应用程序以及发送通知。

什么是CI/CD?

连续集成和连续部署(CI/CD)是一种软件工程实践,开发人员经常将其代码更改为中央存储库,然后自动构建,测试和部署。这样可以确保始终对代码更改进行测试和验证,并且部署的应用程序始终是最新的。

先决条件

  • Python的基本知识
  • git的基本知识
  • github帐户
  • render帐户

安装库

pip install flask pytest

为Python应用程序设置工作流程

1)创建烧瓶应用程序

创建一个新目录并创建一个名为__init__.py的文件。

目录结构:

DirectoryStructure

将以下代码添加到文件:

  1. app\__init__.py
from flask import Flask


def create_app(config=None):
    app = Flask(__name__)

    @app.route('/')
    def index():
        return 'Hello World'

    @app.route('/add/<int:num1>/<int:num2>')
    def add(num1, num2):
        return f"{num1} + {num2} = {num1 + num2}"

    return app
  1. wsgi.py
from app import create_app

if __name__ == '__main__':
    app = create_app()
    app.run()

现在使用以下命令运行应用程序:

python wsgi.py

创建一个tests目录,并在其中创建一个名为__init__.pytest_app.py的文件。
我们需要为应用程序创建一些测试用例,这些测试用例将在GitHub操作工作流程中执行。

将以下代码添加到文件:

import unittest
from app import create_app


app = create_app()


class TestAddFunction(unittest.TestCase):

    def test_addition(self):
        with app.test_client() as client:
            response = client.get('/add/4/5')
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.data.decode(), '4 + 5 = 9')

    def test_missing_variable(self):
        with app.test_client() as client:
            response = client.get('/add/4/')
            self.assertEqual(response.status_code, 404)

    def test_invalid_variable(self):
        with app.test_client() as client:
            response = client.get('/add/4/foo')
            self.assertEqual(response.status_code, 404)

现在使用以下命令运行测试用例:

python -m unittest discover -s tests

所有这些测试用例都应通过。
最后,我们需要创建一个requirements.txt文件以安装依赖项。
我们唯一需要的库是flask。因此,将以下行添加到文件:

flask

,您还可以添加其他依赖项。例如,如果要使用pytest而不是unittest,则可以将pytest添加到requirements.txt文件中。
您还可以使用以下命令自动生成此文件

pip freeze > requirements.txt

可以找到此应用程序的所有代码here

2)创建一个GitHub存储库

  1. 在GitHub上创建一个新的存储库。
  2. 将代码推向存储库。

最后,我们有一个简单的python应用程序,要在github上部署。
我们不仅要部署应用程序,而且还想测试它。

3)创建一个工作流文件

转到“动作”选项卡,查找“ Python应用程序”。

GithubActions

查找“ Python应用程序”,然后单击“配置”

ConfigureActions

这将在.github/workflows目录中创建一个工作流文件。
编辑此文件以自定义工作流程。

name: Python application

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up Python 3.10
        uses: actions/setup-python@v3
        with:
          python-version: "3.10"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install flake8 pytest
          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
      - name: Lint with flake8
        run: |
          # stop the build if there are Python syntax errors or undefined names
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
          # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
          flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
      - name: Test with pytest
        run: |
          pytest

此工作流将在main分支上的每个推送请求上运行。
它将安装依赖项并运行测试。
如果测试失败,工作流将失败。
这是一个非常简单的工作流程,但是可以自定义以执行更复杂的任务。

4)测试

  1. 创建一个新分支并对代码进行一些更改。

继续对代码进行一些更改。例如,您可以更改index功能以返回“ Hello Blask!”而不是“ Hello World”。

@app.route('/')
def index():
    return 'Hello Flask!'
  1. 创建拉动请求。

创建一个新的分支并将更改推向存储库。

git checkout -b new-branch
git add .
git commit -m "change index function"
git push origin new-branch
  1. 工作流将运行并将执行测试。

转到github并创建拉动请求。
合并拉的请求。
它将触发工作流程,并将执行测试。工作流成功执行。

FirstRun

打破工作流程,更改add函数以返回错误的结果。

@app.route('/add/<int:num1>/<int:num2>')
def add(num1, num2):
    return f"{num1} + {num2} = {num1 + num2 + 1}"

还有另一种破坏工作流程的方法。
导入不在requirements.txt文件中的库。

import requests

这将导致工作流失败。

SecondRun

在渲染上部署应用程序

  1. 在渲染上创建一个新帐户。

  2. 将您的github帐户链接到渲染。

  3. 创建一个新的Web服务。

如果您与GitHub注册,您将看到您的存储库列表。
选择要部署的存储库。

CreateService

  1. 选择GitHub存储库。
  2. 选择分支。

填写字段。

SelectBranch

  1. 选择环境。

从列表中选择一个环境。

ChooseEnvironment

  1. 选择“开始命令”。 启动命令是应用程序启动时将执行的命令。 它是它创建烧瓶应用对象并运行它的烧瓶应用程序入口点。

StartCommand

如果您在root Directory中有Procfile,则渲染将自动检测启动命令。
如果您没有Procfile,则可以创建一个并添加开始命令。

将guincorn添加到requirements.txt文件中。

web: gunicorn wsgi:app

这是CI/CD管道的CD部分。将更改推向存储库时,它将自动部署应用程序。

结论

总而言之,使用GitHub操作为Python应用程序设置CI/CD管道可以使您的开发过程更加顺畅,更有效。通过GitHub操作,您可以自动化测试,构建和部署应用程序的过程,从而节省时间和精力。设置管道后,您可以轻松地将更新推向应用程序,并自动构建和部署它们。另外,通过使用渲染来部署应用程序,您可以轻松地与其他人共享它,并使具有Internet连接的任何人都可以访问它。因此,如果您正在寻找一种简化Python应用程序的开发过程的方法,请尝试使用GitHub操作并尝试一下它们如何帮助您简化工作流程。Service.png)

  1. 选择GitHub存储库。
  2. 选择分支。

填写字段。

SelectBranch

  1. 选择环境。

从列表中选择一个环境。
ChooseEnvironment

  1. 选择“开始命令”。 启动命令是应用程序启动时将执行的命令。 它是它创建烧瓶应用对象并运行它的烧瓶应用程序入口点。

StartCommand

如果您在root Directory中有Procfile,则渲染将自动检测启动命令。
如果您没有Procfile,则可以创建一个并添加开始命令。

将guincorn添加到requirements.txt文件中。

web: gunicorn wsgi:app

这是CI/CD管道的CD部分。将更改推向存储库时,它将自动部署应用程序。

结论

总而言之,使用GitHub操作为Python应用程序设置CI/CD管道可以使您的开发过程更加顺畅,更有效。通过GitHub操作,您可以自动化测试,构建和部署应用程序的过程,从而节省时间和精力。设置管道后,您可以轻松地将更新推向应用程序,并自动构建和部署它们。另外,通过使用渲染来部署应用程序,您可以轻松地与其他人共享它,并使具有Internet连接的任何人都可以访问它。因此,如果您正在寻找一种简化Python应用程序的开发过程的方法,请尝试使用GitHub操作并尝试一下它们如何帮助您简化工作流程。