python - 如何使用 Gitlab CI 提高基于 python 的无服务器框架项目的部署速度
问题描述
我正在尝试将我的无服务器项目与具有 CI 设置的现有 Git 存储库集成。现有的 gitlab-ci.yml 需要一个 docker 镜像。
我是 Gitlab CI 的新手,所以我在不同的 git 存储库中玩耍,只是想让它工作。
我已经能够让它与两种不同的 gitlab-ci.yml 设置一起工作。但是,速度存在显着差异。
使用 ubuntu 镜像,部署需要 6 分钟:
deploy-stage:
stage: deploy
image: ubuntu:18.04
environment:
name: stage
script:
- apt-get update
- apt-get install -y curl software-properties-common
- curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh
- bash nodesource_setup.sh
- apt install -y nodejs
- add-apt-repository ppa:deadsnakes/ppa
- apt install -y python3.8 python3-pip
- cd db_update_campaigns
- npm install
- npm install -g serverless
- sls deploy -v
然后我可以让它与一个 docker 镜像一起工作(这是我需要做的以将它与现有的 git 存储库集成),但是部署需要 24 分钟:
deploy-stage:
stage: deploy
image: docker:stable
environment:
name: stage
script:
- apk add --update python3 py3-pip python3-dev nodejs nodejs-npm build-base postgresql-dev
- cd db_update_campaigns
- npm install
- npm install -g serverless
- sls deploy -v
有谁知道为什么会有这样的速度差异?另外,在使用 docker 镜像时有什么方法可以提高部署速度吗?
对此的任何帮助将不胜感激。在这方面,我是一个完全的初学者,所以你的任何建议都会非常感激。非常感谢。
解决方案
您似乎正在安装每个构建所需的依赖项。(之前的所有命令cd db_update_campaigns
)。这些并不特定于当前包的部署,因此可以预先准备好,因此只需要在部署时运行npm install
and命令。sls deploy
为此,首先创建一个基于 docker:stable 的自定义 docker 镜像。此图像应添加所有必需的依赖项:
FROM docker:stable
RUN apk add --update python3 py3-pip python3-dev nodejs nodejs-npm build-base postgresql-dev
构建映像并将其推送到注册表(例如 dockerhub)
docker build -t <dockerhubusername>/myBuildImage:latest
docker push <dockerhubusername>/myBuildImage:latest
在您的 gitlab-ci.yaml 中引用您的自定义图像,而不是 vanilla docker 之一。
deploy-stage:
stage: deploy
image: <dockerhubusername>/myBuildImage:latest
environment:
name: stage
script:
- cd db_update_campaigns
- npm install
- npm install -g serverless
- sls deploy -v
这应该会在部署期间为您节省一些时间,因为映像不需要每次都安装依赖项。
如果您更喜欢使用私有 dockerhub 注册表或 gitlab 注册表,请参阅gitlab 文档中的从私有容器注册表中定义映像以了解如何设置它
推荐阅读
- amazon-web-services - AWS - 无法查看通过 CloudFormation 创建的 Cloud 9 环境
- java - 如何在java中将数值打印为DateTime格式
- ios - 我无法从 Firebase 数据库中检索数据
- java - 在 Java 中调用 Rest API 导致无法处理的实体 (422)
- boost - 如何在 boost MSM 中传递其他参数 int 状态进入或退出函数
- cakephp - 如何在 CakePHP 3.x 的 shell 中实现国际化?
- c# - C#:使用对象数组而不是字符串的正则表达式
- javascript - javascript chrome localStorage async 使用 Promise
- mysql - MySQL ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册
- node.js - Mongoose 根据条件检查将其他属性附加到结果中