具有持续部署和Docker的完美版本

本文介绍如何使用Docker和Semaphore实现Python Flask应用程序的持续集成和持续部署。通过自动化测试和构建过程,确保应用程序的一致性和可移植性,并最终部署到Heroku。

Docker是一种容器技术,使开发人员可以将整个应用程序作为一个单元运行。 它提供了虚拟机的所有优点,而没有高昂的开销:

  • 一致性:生产和开发环境是平等的。
  • 可移植性:对底层操作系统的依赖性降低; 相同的映像可以部署在任何云提供商上。
  • 低开销:比虚拟机更好的性能。
  • 分而治之:在不同的容器之间分配服务。

但是,Docker在方程式中引入了一个新变量:必须将应用程序烘焙到容器映像中,然后正确部署。 此外,设置测试环境可能会更具挑战性。

CI / CD平台在这里可以为我们带来巨大价值:通过自动化所有任务并为我们提供快速可靠的工作环境。

在这个动手教程中,我们将学习Semaphore如何在几分钟内帮助我们实现所有这些目标。 本教程分为两部分:

  • 持续集成:构建和测试应用程序映像。
  • 持续部署:将映像发送到Heroku以在线运行

输入申请

首先,我们将使用Semaphore的即用型Python Flask演示 。 该应用程序由一个简单的任务管理器组成,该任务管理器是为Flask Web微型框架编写的,并且一个MongoDB充当数据库后端。 为了使事情变得井井有条,它分为两个容器:一个用于数据库,另一个用于Web服务器。

CI / CD管道将:

  1. 使用我们的应用程序构建Docker映像。
  2. 将映像推送到Docker Hub。
  3. 在容器内测试应用程序。
  4. 部署到Heroku。

首先,请分叉semaphore-demo-python-flask存储库并对其进行克隆。

持续集成

精心设计的持续集成设置将帮助我们:

  • 花费更少的时间进行测试和部署。
  • 获得100%的自动化测试。
  • 避免在我的机器上工作综合征。

本部分的目的是将应用程序烘焙到容器中。 准备开始了吗?

Docker Hub提供免费的图像存储,因此继续获取Docker Hub帐户。 您还需要一个Semaphore帐户; 您可以使用您的GitHub帐户注册。 免费计划足以满足我们的目的。

要将项目添加到Semaphore,请单击“项目”下的+(加号)并选择您的存储库。

最后一件事:信号量需要能够访问您的Docker Hub
资料库。 最好的存储敏感数据的方法是使用Secrets ,它会自动加密并在调用时可用于作业:

  1. 在“ 配置”下 ,转到“ 秘密”
  2. 单击创建新机密按钮。
  3. 命名您的秘密pyflask-semaphore并键入您的Docker Hub凭证:
  1. 整合

    现在,一切就绪,可以开始集成。 试运行怎么样? 编辑存储库中的任何文件并推送更新:

    $ touch some_file
    $ git add some_file
    $ git commit -m "first run of the integration pipeline"
    $ git push

    回到信号量。 几秒钟后,您将在仪表板中看到新的工作流程:

    在工作流内部,您将能够看到管道:

    不要介意“ 升级”按钮; 我们会稍等一下。 的
    好消息是集成管道全部是绿色的。 如果一切
    按照计划进行,您应该在Docker Repository中有一个新映像。

    我们到了一半。 但是...发生了什么事? 信号量是如何做到的?

    建立影像

    使用正确的Dockerfile可以轻松实现创建自定义Docker映像。 该项目已经附带了一个可运行的flask.Dockerfile 。 看一下内容:

    FROM python:3.7
    ADD . ./opt/
    WORKDIR /opt/
    EXPOSE 5000
    RUN pip install --upgrade pip
    RUN pip install -r requirements.txt
    CMD [ "python" , "run.py" ]

    第一行定义了用作起点的基础映像,在这种情况下,是使用Python 3.7的基本Debian映像。 接下来,我们ADD应用程序文件到/ opt目录。 RUN调用Python的软件包管理器pip来安装所有应用程序依赖项。 最终CMD定义了应用程序的启动方式。

    容器设置已通过docker-compose.yml完成:

    version: '3.5'
    services:
      mongodb:
        image: mongo:3.4.20
        container_name: "mongodb"
        ports:
          - 27017 :27017
        command: mongod --smallfiles --logpath=/dev/null
      flasksemaphore:
        image: pyflasksemaphore
        container_name: semaphore-pyflask-docker_flasksemaphore_1
        build:
          context: .
          dockerfile: ./flask.Dockerfile
        ports:
          - "5000:5000"
        volumes:
          - .:/opt/
        environment:
          - DB=mongodb://mongodb:27017/tasks
          - PORT=5000
        depends_on:
          - mongodb

    使用Compose,我们定义了两个服务:

  • mongodb:引用公共MongoDB映像。
  • flasksemaphore:定制的应用程序容器。

只需一个命令即可构建映像并启动所有操作: docker-compose up

CI管道

接下来,让我们检查Semaphore如何实现集成管道。 如果您迷路了,请查看信号量导览

version: v1.0
name: Semaphore Python / Flask / Docker Example Pipeline
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Build
    task:
      secrets:
        - name: pyflask-semaphore
      jobs:
      - name: Docker build
        commands:
          - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
          - checkout
          - docker-compose build
          - docker tag pyflasksemaphore:latest "$DOCKER_USERNAME"/pyflasksemaphore:latest
          - docker tag pyflasksemaphore:latest "$DOCKER_USERNAME"/pyflasksemaphore:$SEMAPHORE_WORKFLOW_ID
          - docker push "$DOCKER_USERNAME"/pyflasksemaphore:latest
          - docker push "$DOCKER_USERNAME"/pyflasksemaphore:$SEMAPHORE_WORKFLOW_ID
          - docker images

   - name: Run & Test Docker image
    task:
      secrets:
        - name: pyflask-semaphore
      prologue:
        commands:
          - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
          - checkout
          - docker pull "$DOCKER_USERNAME"/pyflasksemaphore
          - docker-compose up -d
       jobs:
      - name: Check Running Images
        commands:
          - docker ps
      - name: Run Unit test
        commands:
          - docker exec -it semaphore-pyflask-docker_flasksemaphore_1 python -m unittest

promotions:
  - name: Deploy to Heroku
    pipeline_file: deploy-heroku.yml
    auto_promote_on:
      - result: passed

让我们将其分解为更多易于消化的部分。

代理代理设置计算机类型和驱动管道的操作系统。 Semaphore提供了多种尺寸的机器。 根据我们的需求,具有4个CPU和8GB RAM的e1-standard-4足以在几秒钟内构建Docker映像。

超级方便的Ubuntu 18.04映像包含您立即开始使用所需的一切,包括Docker,Docker Compose,Python和Heroku。 无需其他组件。

构建块 :块定义管道的动作。 每个块有一个任务,每个任务可以有一个或多个作业。 一个块中的作业可以同时运行,每个作业都在其自己的完全隔离的虚拟机中。 块中的所有作业完成后,下一个块开始。

构建块正是这样做的。 它构建了Docker镜像:

  1. secrets导入Docker Hub变量。
  2. checkout克隆GitHub存储库。
  3. 将映像推送到Docker Hub时需要docker登录
  4. docker-compose 建立映像…
  5. …被标记了 ,最后被推送到注册表。

测试块 :在此块中,两个容器都旋转起来进行集成测试。 序言在块中的每个作业之前执行。 在这种情况下,序幕会拉出图像并使用docker-compose up启动应用程序。

我们有两个测试工作:

  • 运行单元测试:在容器内启动测试脚本。
  • 检查正在运行的映像:列出正在运行的Docker容器。

提升 :.semaphore / semaphore.yml的最后一部分定义了工作流程的继续方式。 此时,我们可以将多个管道与促销活动链接起来以创建复杂的工作流程。 促销可以是手动的也可以是自动的。 在这种情况下,我们可以手动连接到部署管道:

promotions:
  - name: Deploy to Heroku
    pipeline_file: deploy-heroku.yml

持续交付

一旦有了有效的形象,我们就可以进入连续交付阶段。 在这里,我们将讨论如何部署应用程序,以便我们的用户可以使用它。

我们将为我们的方案添加两个新服务:

注册一个Heroku帐户并获得授权令牌:

Heroku

注册一个Heroku帐户并获得授权令牌:

  1. 点击右上角的帐户资料。
  2. 选择帐户设置。
  3. 转到“应用程序”选项卡。
  4. 按创建授权按钮。
  5. 将描述设置为: semaphore-demo-python-flask
  1. 最后,创建一个空的应用程序。 在您的Heroku仪表板上,单击“ 新建”按钮,然后选择“ 创建新应用”

  • 设置您的应用程序名称,或将其保留为空白。
  • 选择您的首选区域: 美国欧洲

在Semaphore中,创建一个名为heroku的新密钥以存储授权令牌:

MongoDB地图集

尽管Heroku具有MongoDB插件,但它不包含在免费计划中。
同时, MongoDB Atlas免费提供500MB集群。 不错,真不错。 但是,设置过程相当漫长,因此请多多包涵:

  1. 注册一个MongoDB Atlas帐户
  2. 选择AWS作为提供者。
  3. 选择与您的Heroku应用程序匹配的区域。 对于美国us-east-1和欧洲eu-west-1
  4. 在“群集层”上,选择“ M0沙箱”
  5. 您可以设置一个名称来描述您的集群。 您可以保留其余设置。
  6. 单击创建集群 。 请花几分钟进行配置。
  7. 现在,对于数据库用户:

    1. 在左侧导航栏中,打开“ 安全性”
    2. 点击+添加新用户按钮。
    3. 添加用户semaphore-demo-python-flask 。 选择一个安全密码,并将特权设置为“读写任何数据库”
    4. 返回“安全性”,选择“ IP白名单”选项卡。
    5. 点击+添加IP地址按钮。
    6. 选择“ 允许从任何地方访问”确认。

    要获取连接URI,请返回“ 群集”并单击“ 连接”按钮。 在“连接您的应用程序”部分下,选择“ Python 3.6或更高版本”。 复制整个连接字符串。

    连接字符串不完整; 将<password>替换为您的实际密码。 如果它有任何特殊字符,则应首先通过URL Encode运行它。

    回到Semaphore,创建一个mongodb-atlas秘密:

    CD管道

    在本节中,我们将研究部署管道所经历的所有步骤。 看看.semaphore/deploy-heroku.yml

    version: v1.0
    name: Deploy to Heroku
    agent:
      machine:
        type: e1-standard-2
        os_image: ubuntu1804
    blocks:
      - name: Deploy to Heroku
        task:
          secrets:
            - name: mongodb-atlas
            - name: pyflask-semaphore
            - name: heroku
          env_vars:
            - name: HEROKU_APP
              value: <YOUR_APP_NAME>
          jobs:
            - name: Deploy
              commands:
                - checkout
                - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
                - docker pull "$DOCKER_USERNAME"/pyflasksemaphore:$SEMAPHORE_WORKFLOW_ID
                - heroku container:login
                - docker tag "$DOCKER_USERNAME"/pyflasksemaphore:$SEMAPHORE_WORKFLOW_ID registry.heroku.com/$HEROKU_APP/web
                - docker push registry.heroku.com/$HEROKU_APP/web
                - heroku config:set DB="$MONGODB_URI"
                - heroku stack:set container --app $HEROKU_APP
                - heroku container:release web --app $HEROKU_APP
    

    环境和秘密 :我们只需要显式设置一个变量$HEROKU_APP ,该变量应指向您的Heroku应用程序名称。 完成此操作后,继续并用它替换值。

    部署块需要访问所有服务,并且变量是从秘密中导入的:mongodb-atlas,pyflask-semaphore,heroku。

    Deploy块 :此块中引入的唯一新命令与Heroku Docker有关

    1. Heroku注册表 URL标记图像。
    2. 发送用于MongoDB连接的URI变量。
    3. 堆栈模式设置为容器。
    4. 发布 :启动应用。

    部署

    再走一步! 提交更改以启动CI / CD:

    $ git add .semaphore
    $ git commit -m "ready to deploy!"
    $ git push

    几分钟后,我们应该完成CI管道。 点击提升按钮启动CD管道:

    最后,单击“ 打开应用程序”按钮以访问实时应用程序。 任务管理愉快!

    总结一下

    我们探索了如何使用Docker运行Python应用程序。 之后,我们学习了如何使用Semaphore创建一个管道,该管道可以自动运行测试和必要的构建命令,以及将应用程序部署到Heroku。

    先前发布于: https : //semaphoreci.com/community/tutorials/continuous-deployment-of-a-python-flask-application-with-docker-and-semaphore

From: https://hackernoon.com/continuous-deployment-of-a-python-flask-application-with-docker-and-semaphore-b21aq12v1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值