Docker是一种容器技术,使开发人员可以将整个应用程序作为一个单元运行。 它提供了虚拟机的所有优点,而没有高昂的开销:
- 一致性:生产和开发环境是平等的。
- 可移植性:对底层操作系统的依赖性降低; 相同的映像可以部署在任何云提供商上。
- 低开销:比虚拟机更好的性能。
- 分而治之:在不同的容器之间分配服务。
但是,Docker在方程式中引入了一个新变量:必须将应用程序烘焙到容器映像中,然后正确部署。 此外,设置测试环境可能会更具挑战性。
CI / CD平台在这里可以为我们带来巨大价值:通过自动化所有任务并为我们提供快速可靠的工作环境。
在这个动手教程中,我们将学习Semaphore如何在几分钟内帮助我们实现所有这些目标。 本教程分为两部分:
- 持续集成:构建和测试应用程序映像。
- 持续部署:将映像发送到Heroku以在线运行
输入申请
首先,我们将使用Semaphore的即用型Python Flask演示 。 该应用程序由一个简单的任务管理器组成,该任务管理器是为Flask Web微型框架编写的,并且一个MongoDB充当数据库后端。 为了使事情变得井井有条,它分为两个容器:一个用于数据库,另一个用于Web服务器。
- 使用我们的应用程序构建Docker映像。
- 将映像推送到Docker Hub。
- 在容器内测试应用程序。
- 部署到Heroku。
首先,请分叉semaphore-demo-python-flask存储库并对其进行克隆。
持续集成
- 花费更少的时间进行测试和部署。
- 获得100%的自动化测试。
- 避免在我的机器上工作综合征。
本部分的目的是将应用程序烘焙到容器中。 准备开始了吗?
Docker Hub提供免费的图像存储,因此继续获取Docker Hub帐户。 您还需要一个Semaphore帐户; 您可以使用您的GitHub帐户注册。 免费计划足以满足我们的目的。
要将项目添加到Semaphore,请单击“项目”下的+(加号)并选择您的存储库。
最后一件事:信号量需要能够访问您的Docker Hub
资料库。 最好的存储敏感数据的方法是使用Secrets ,它会自动加密并在调用时可用于作业:
- 在“ 配置”下 ,转到“ 秘密” 。
- 单击创建新机密按钮。
- 命名您的秘密
pyflask-semaphore并键入您的Docker Hub凭证:
整合
现在,一切就绪,可以开始集成。 试运行怎么样? 编辑存储库中的任何文件并推送更新:
$ 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镜像:
- secrets导入Docker Hub变量。
- checkout克隆GitHub存储库。
- 将映像推送到Docker Hub时需要docker登录 。
- docker-compose 建立映像…
- …被标记了 ,最后被推送到注册表。
测试块 :在此块中,两个容器都旋转起来进行集成测试。 序言在块中的每个作业之前执行。 在这种情况下,序幕会拉出图像并使用docker-compose up启动应用程序。
我们有两个测试工作:
- 运行单元测试:在容器内启动测试脚本。
- 检查正在运行的映像:列出正在运行的Docker容器。
提升 :.semaphore / semaphore.yml的最后一部分定义了工作流程的继续方式。 此时,我们可以将多个管道与促销活动链接起来以创建复杂的工作流程。 促销可以是手动的也可以是自动的。 在这种情况下,我们可以手动连接到部署管道:
promotions:
- name: Deploy to Heroku
pipeline_file: deploy-heroku.yml
持续交付
一旦有了有效的形象,我们就可以进入连续交付阶段。 在这里,我们将讨论如何部署应用程序,以便我们的用户可以使用它。
我们将为我们的方案添加两个新服务:
- Heroku :运行应用程序。
- MongoDB Atlas :获取托管的MongoDB数据库。
注册一个Heroku帐户并获得授权令牌:
Heroku
注册一个Heroku帐户并获得授权令牌:
- 点击右上角的帐户资料。
- 选择帐户设置。
- 转到“应用程序”选项卡。
- 按创建授权按钮。
- 将描述设置为:
semaphore-demo-python-flask
最后,创建一个空的应用程序。 在您的Heroku仪表板上,单击“ 新建”按钮,然后选择“ 创建新应用” :
- 设置您的应用程序名称,或将其保留为空白。
- 选择您的首选区域: 美国或欧洲 。
在Semaphore中,创建一个名为heroku的新密钥以存储授权令牌:
MongoDB地图集
尽管Heroku具有MongoDB插件,但它不包含在免费计划中。
同时, MongoDB Atlas免费提供500MB集群。 不错,真不错。 但是,设置过程相当漫长,因此请多多包涵:
- 注册一个MongoDB Atlas帐户
- 选择AWS作为提供者。
- 选择与您的Heroku应用程序匹配的区域。 对于美国
us-east-1和欧洲eu-west-1 - 在“群集层”上,选择“ M0沙箱”
- 您可以设置一个名称来描述您的集群。 您可以保留其余设置。
- 单击创建集群 。 请花几分钟进行配置。
现在,对于数据库用户:
- 在左侧导航栏中,打开“ 安全性” 。
- 点击+添加新用户按钮。
- 添加用户
semaphore-demo-python-flask。 选择一个安全密码,并将特权设置为“读写任何数据库” - 返回“安全性”,选择“ IP白名单”选项卡。
- 点击+添加IP地址按钮。
- 选择“ 允许从任何地方访问”并确认。
要获取连接URI,请返回“ 群集”并单击“ 连接”按钮。 在“连接您的应用程序”部分下,选择“ Python 3.6或更高版本”。 复制整个连接字符串。
连接字符串不完整; 将<password>替换为您的实际密码。 如果它有任何特殊字符,则应首先通过URL Encode运行它。
回到Semaphore,创建一个
mongodb-atlas秘密:
CD管道
在本节中,我们将研究部署管道所经历的所有步骤。 看看
.semaphore/deploy-heroku.ymlversion: 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有关 :
部署
再走一步! 提交更改以启动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 。
本文介绍如何使用Docker和Semaphore实现Python Flask应用程序的持续集成和持续部署。通过自动化测试和构建过程,确保应用程序的一致性和可移植性,并最终部署到Heroku。
10万+

被折叠的 条评论
为什么被折叠?



