python自动化运行,python让工作自动化

全文共4955字,预计学习时间25分钟。

图片来源:Unsplash

无论您的项目是开发Web 应用程序、数据科学问题还是AI 开发,您都需要一个配置良好的CI/CD、一个可以在开发过程中调试并针对生产进行优化的Docker 映像,或者任何其他使用代码质量工具。可以让你受益。

本文向您展示如何将它们添加到您的Python 项目中。

我的存储库包含完整的源代码和文档:https://github.com/MartinHeinz/python-project-blueprint

用于开发的可调试Docker 容器

有些人不喜欢Docker,因为调试容器可能很困难,或者构建镜像需要时间。因此,让我们首先构建理想的映像,以实现快速构建、易于调试的开发。

为了使图像调试更容易,需要基础图像。它包含调试时所需的所有工具,包括bash、vim、netcat、wget、cat、find 和grep。

python:3.8.1-buster 似乎最适合这项任务。它默认包含许多工具,您缺少的任何工具都可以轻松安装。这个基础镜像相当重,但是没关系,因为它目前仅用于开发。

您可能已经注意到,我们选择了一个非常特殊的镜像:锁定Python 和Debian 版本。这是故意这样做的,因为我们希望最大限度地减少因不兼容的新Python 或Debian 版本而导致“损坏”的可能性。

资料来源:TechCrunch

基于高山的图像可以作为替代方案。但是,这可能会导致一些问题,因为它使用musllibc 而不是Python 所依赖的glibc。因此,在选择此配置时请记住这一点。

在构建速度方面,我们利用多阶段构建来缓存尽可能多的层。这可以避免下载应用程序所需的任何依赖项、gcc 等工具以及所有库(在requirements.txt 中)。

下载和安装这些工具所需的步骤无法缓存在最终的运行程序映像中,因此请如上所述使用python:3.8.1-buster 创建包含所有必要工具的自定义基础映像。这进一步加快了处理速度。

话虽如此,让我们看一下Dockerfile。

# dev.Dockerfile 来自python:3.8.1-buster AS 构建器运行apt-get update apt-get install -y –no-install-recommends –yes python3-venv gcclibpython3-dev \\ python3 -m venv /venv \\ /venv/bin /pip install –upgradepip FROM builder ASbuilder-venv COPYrequirements.txt /requirements.txt RUN /venv/bin/pipinstall -r /requirements.txt FROM builder-venv AStester COPY 。 tools:最新的AS运行器COPY –from=tester/venv /venv COPY –from=tester/app /app WORKDIR /app ENTRYPOINT [\’/venv/bin/python3\’, \’- m \’, \’blueprint\’] USER 1001 LABEL名称={名称} 标签版本={版本}

从上面的文档中,我们可以看到,在创建最终的运行映像之前,我们创建了三个中间映像。第一个映像称为构建器,它下载构建最终应用程序所需的所有库,包括gcc 和Python 虚拟环境。安装完成后,它还将创建实际的虚拟环境以供下一个映像使用。

接下来是builder-venv 镜像,将依赖项列表(requirements.txt)复制到该镜像并安装。缓存需要此中间映像,因为仅当修改requirements.txt 时才会安装该库,否则仅使用缓存。

在创建最终映像之前,首先在应用程序上运行测试。这就是测试图像的工作原理。将源代码复制到映像并运行测试。如果通过了,程序就会跑到跑步者那里。

对于运行程序映像,我们使用自定义映像,其中包含常规Debian 映像中不存在的一些附加功能,例如vim 和netcat。该图像位于Docker Hub 上,您可以在此处看到一个非常简单的Dockerfile for base.Dockerfile。

最终图像包括:首先,从测试器映像中复制包含所有已安装依赖项的虚拟环境,然后复制测试的应用程序。

现在映像已拥有所有源,请转到应用程序所在的目录并设置ENTRYPOINT 以在映像启动时运行应用程序。最佳实践规定不要以root 用户身份运行容器,因此出于安全原因将USER 设置为1001。

最后两行设置图像标签。当指定构建并使用make 命令运行时,这些将被替换或设置,如下所述。

图片来源:Unsplash

针对生产优化的Docker 容器

当涉及生产级映像时,您希望确保它们小、安全且快速。我个人最喜欢的是Distroless 项目中的Python 映像。那么,什么是Distro?

这可以解释如下。在理想的世界中,每个人都会使用FROM Scratch 作为基础镜像(即空白镜像)来构建镜像。

然而,这不是大多数人想要做的事情,因为它需要静态链接二进制文件等。这就是Distroless 发挥作用的地方。 Distroless 专为任何人从一开始就可以使用而设计。

Distroless 是Google 创建的一组映像,其中包含应用程序所需的最低要求。这意味着没有shell、包管理器或其他工具可以通过标记CVE 等安全扫描器来使图像膨胀并产生噪音。制定规则变得困难。

现在我们知道了要解决的问题,让我们看看我们的生产Dockerfile.实际上,我们这里不需要做太多改变,只需以下两行:

# prod.Dockerfile# 1. 行- 将构建器映像从debian:buster-slim AS builder# .# 17. 行- 将Distroless 映像切换到gcr.io/distroless/python3-debian10 AS runner# . 其余部分.Dockefile

您需要更改的只是用于构建和运行应用程序的基础映像。

但区别是显着的:开发映像为1.03 GB,而此映像只有103 MB,这是完全不同的。

我知道你在说,“但是阿尔卑斯山可能更小”,你是对的,但尺寸差异并不那么重要。我只在下载/上传图像时关心图像大小,但这并不常见。当图像运行时,大小根本不重要。比大小更重要的是安全性,Distroless 在这方面肯定具有优势,因为Alpine(一个很好的替代方案)有许多额外的软件包,可以增加攻击面。

图片来源:Unsplash

关于Distroless 最后值得一提的是调整镜像。考虑到Distroless 不包含shell(甚至不包含sh),因此调试和检查变得非常困难。为此,每个Distroless 映像都包含一个调试版本。

因此,如果遇到问题,您可以构建带有调试标记的生产映像,将其部署到常规映像旁边,然后在内部运行它以执行线程转储等操作。 Python3镜像的调试版本可以使用如下:

docker run –entrypoint=sh -tigcr.io/distroless/python3-debian10:debug

用一个命令完成所有事情

准备好所有Dockerfile 后,您还可以使用Makefile 自动化它们。首先要做的是使用Docker 构建应用程序。因此,要构建开发映像,请运行make build-dev 命令来运行以下目标文件:

# 要构建的二进制文件(仅基本名称) MODULE :=blueprint # 推送docker 镜像的位置REGISTRY=docker.pkg.github.com/martinheinz/python-project-blueprint IMAGE :=$(REGISTRY)/$( MODULE) # This版本策略使用git标签设置版本字符串TAG :=$(shell git description –tags–always –dirty) build-dev: @echo \’\\n${BLUE}BuildingDevelopment image withlabels: \\n \’ @echo \’name: $(MODULE)\’ @echo \’version: $(TAG)${NC}\\n\’ @sed \\ -e\’s|{NAME}|$(MODULE)|g\’ \\ -e \’s| {版本}|$(TAG )|g\’ \\ dev.Dockerfile | docker build -t $(IMAGE):$(TAG) -f- 。

该目标文件首先将镜像名称和标签替换为运行git description 创建的dev.Dockerfile 底部的标签,然后运行docker build 来构建镜像。

后续步骤—— 使用make build-prod VERSION=1.0.0 构建生产版本。

build-prod: @echo \’\\n使用${BLUE}labels:\\n\’ @echo \’name: $(MODULE)\’ @echo \’version: $(VERSION)${NC}\\n\’ @sed \\ -e\’s |{ NAME}|$(MODULE)|g\’ \\ -e \’s|{VERSION}|$(VERSION)|g\’\\ prod.Dockerfile docker build -t $(IMAGE):$(VERSION) -f- 。

这与之前的目标文件非常相似,但在版本1.0.0 示例中,您没有使用git 标签作为版本,而是将版本作为参数传递。

如果您在Docker 中运行所有内容,则可能需要使用Docker 进行调试。所以我有以下目标文件:

# Example: make shell CMD=\’-c \’date datefile\’\’ shell: build-dev @echo \’\\n${BLUE}在容器化构建环境中启动shell.${NC}\\n\’ @docker run \\ -ti \\ –rm \\ –entrypoint /bin/bash \\ -u $$(id -u):$$(id -g) \\ $(IMAGE):$(TAG) \\ $(CMD )

正如您在上面看到的,bash 会覆盖入口点,但参数会覆盖容器命令。这允许您直接访问容器进行调试或运行关闭命令,如上例所示。

完成编码并希望将映像推送到Docker 注册表后,可以使用makepush VERSION=0.0.2。我们来看看目标文件的特点。

REGISTRY=docker.pkg.github.com/martinheinz/python-project-blueprint Push:build-prod @echo\’\\n将${BLUE} 镜像推送到GitHub Docker 注册表.${NC}\\n\’ @ dockerpush $(IMAGE) :$(版本)

首先,运行前面提到的build-prod 文件,然后运行docker Push。这假设您已登录到Docker 注册表,因此您必须在运行此注册表之前运行docker login。

最终目标文件用于清理Docker 工件。使用Dockerfile 中替换的名称标签来过滤和搜索需要删除的工件。

docker-clean:@docker system prune -f –filter \’label=name=$(MODULE)\’

使用GitHub 操作的CI/CD

接下来,开始使用所有这些方便的make target 命令设置CI/CD。使用GitHub Actions 和GitHub Package Registry 构建管道(作业)并存储图像。那么这两个到底是什么?

· Github Actions 是帮助自动化开发工作流程的作业/管道。您可以使用它们来创建单独的任务,并将它们组合到自定义工作流程中,以便在每次推送到存储库或创建版本时运行。

· GitHub PackageRegistry 是与GitHub 完全集成的包托管服务。您可以存储不同类型的包,包括Ruby gems 和npm 包。用它来存储Docker 镜像。

· 如果您是GitHub Package Registry 的新手并想了解更多信息,请查看我的博客文章:https://martinheinz.dev/blog/6

图片来源:Unsplash

要使用GitHub Actions,您需要创建一个基于您选择的触发器(例如推送到存储库)运行的工作流程。这些工作流程是位于存储库的.github/workflows 目录中的YAML 文件。

.github 工作流程 build-test.yml Push.yml

第一个作业称为build,运行make build-dev 命令来验证是否可以构建应用程序。但是,在此之前,请首先通过执行名为checkout 的操作来检索存储库,该操作在GitHub 上公开提供。

jobs:test: run-on: ubuntu-最新步骤: – use: action/checkout@v1 – use: action/setup-python@v1with: python-version: \’3.8\’ – name: 安装依赖项run: | python -m pip install –upgrade pip p ip install -r要求。 txt – name: Makefile 运行测试run: make test – name: 安装linter run: pip install pylint pip install flake8 pip install Bandit – name: 运行linter run: make lint |

第二项工作稍微复杂一些。针对您的应用程序和三个linter(代码质量检查器)运行测试。

与上一个任务一样,使用checkout@v1 操作检索源代码。然后运行另一个名为setup-python@v1 的公开操作。这将帮助您设置Python 环境(请参阅此处了解更多信息)。

现在我们已经有了Python环境,我们还需要使用通过pip安装的requirements.txt中的应用程序依赖项。此时,您可以继续运行make test命令。这将触发Pytest 套件。如果测试套件通过,则继续安装上述linter,即pylint、flake8 和bandit。最后,运行make lint 命令。这将触发每个linter。

现在我们已经构建/测试了它,让我们看看如何推送它:

on: 推送: 标签: – \’*\’ 作业: 推送: 运行: ubuntu-最新步骤: – 使用: action/checkout@v1 – 设置名称: envrun: echo :set-envname=RELEASE_VERSION3336 0:$ 回显${GITHUB_REF:10}) – name: 登录Registryrun: echo \’${{secrets .REGISTRY_TOKEN }}\’ | dockerlogin docker.pkg.github.com -u ${{github.actor }} –password-stdin – name: GitHubPackage 推送到Registryrun: make PushVERSION=$ {{ env.RELEASE_VERSION }}

前四行定义何时触发此作业。指定仅当将标签推送到存储库时才启动作业(*在这种情况下,指定的标签名称可以是任何模式)。因此,Docker 镜像并不是每次推送到GitHub 包注册表时都会推送。相反,仅将指定应用程序新版本的标签推送到GitHubPackage 注册表。

现在是工作的主要部分。首先获取源代码并将环境变量RELEASE_VERSION 设置为推送的git 标签。这是通过GitHub Actions 的内置: setenv 功能完成的。

接下来,使用存储在存储库密钥中的REGISTRY_TOKEN 登录Docker 注册表,并登录启动工作流程的用户(github.actor)。最后,最后一行执行push命令。这会构建生产映像,并使用之前推送的git 标签作为映像标签将其推送到注册表。

完整的代码列表位于https://github.com/MartinHeinz/python-project-blueprint/tree/master/.github/workflows。

使用CodeClimate 检查代码质量

最后但并非最不重要的一点是,您还可以使用CodeClimate 和SonarCloud 添加代码质量检查。这些是与上面的测试作业一起触发的。所以在那里添加几行。

# 测试,lint. – name: 将报告发送到CodeClimate run: -amd64 ./cc-test-reporter chmod +x ./cc-test-reporter ./cc-test-reporter 格式覆盖范围-tcoverage.pycoverage.xml ./cc-test-reporter 上传覆盖范围-r \’ ${ {secrets.CC_TEST_REPORTER_ID }}\’ – name: SonarCloudscanner 使用: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ Secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ Secrets.SONAR_TOKEN }}

从CodeClimate 开始,首先导出GIT_BRANCH 变量,然后使用GITHUB_REF 环境变量来检索它。接下来,下载CodeClimate 测试报告程序并使其可执行。这用于格式化测试套件生成的覆盖率报告,最后一行将其与存储在存储库机密中的测试报告者ID 一起发送到CodeClimate。

对于SonarCloud,您需要在存储库中创建一个sonar-project.properties文件,如下所示(文件中的值可以在SonarCloud仪表板的右下角找到)。

.organization=martinheinz-github sonar.projectKey=MartinHeinz_python-project-blueprint sonar.sources=blueprint

此外,您所需要做的就是使用现有的sonarcloud-github-action 。您所需要做的就是提供两个令牌:一个GitHub 令牌(默认位于存储库中)和一个SonarCloud 令牌(可从SonarCloud 网站获取)。

注意:有关获取和设置所有上述令牌和密钥的说明,请参阅自述文件:https://github.com/MartinHeinz/python-project-blueprint/blob/master/README.md

图片来源:Unsplash

使用上面列出的工具、配置和代码,您可以构建并自动化下一个Python 项目的各个方面。去尝试一下吧!

留言、点赞并关注我们

分享有关学习和开发人工智能的有用信息

如需转载,请在后台留言,并遵守转载规定。

本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/669739.html

(0)
上一篇 2024年6月4日
下一篇 2024年6月4日

相关推荐

  • 和平精英键盘怎么打开?

    和平精英键盘怎么打开? 进入游戏大厅之后点击右下角的设置,随后点击操作设置,此时选择其中一个点击自定义布局; 打开自定义布局之后玩家就可以随意调整每个按键的位置、大小以及透明度,根据自己的想法调整完毕之后点击保存即可。 和平精英怎么换键盘? 和平精英换键盘的方法: 进入游戏大厅之后点击右下角的设置,随后点击操作设置,此时选择其中一个点击自定义布局;打开自定义…

    游戏快讯 41分钟前
  • 和平精英怎么响应祭坛?

    和平精英怎么响应祭坛? 可以到地图上四个祭坛会有一个石碑,到士兵面前不动点击响应,进入祭坛的方式 1、青龙祭坛:一根藤蔓拉着跳上去 2、白虎祭坛:龙卷风卷上去 3、朱雀祭坛:一道火光把你吸上去 4、玄武祭坛:一道水柱要你自己游上去 在每个圣兽祭坛上都会有宝箱,宝箱内会有很多丰厚的资源。 和平精英怎么跳祭坛? 跳祭坛的方法如下:1. 首先要在角落、树丛等地探查…

    游戏快讯 2小时前
  • 和平精英瞬狙设置如何调?

    和平精英瞬狙设置如何调? 调的方法是: 1.我们可以进入训练场来练习,这里就用m24演示。 2.接下来找到倍镜,新手最好先拿6倍镜试一试,给枪装上倍镜。 3.然后我们寻找一个靶子,在静止或者跑动状态下不开镜来快速调节准心到靶子上。 4.使准心瞄准靶子后,快速开镜并且按下开火键。 和平精英怎么练狙? 的方法很多,但是要想更快的提升技能,建议可以:1.多实战多比…

    游戏快讯 3小时前
  • 和平精英房间怎么观战?

    和平精英房间怎么观战? 如果你的好友在战斗,然后你的话。他没有屏蔽的话,你就可以去他的右边有一个播放按钮就可以了。 和平精英房间如何开启观战模式? 和平精英房间开启观战模式的操作步骤如下: 1.在游戏界面右小角点击三角形图标进入。 2.在设置界面点击观战。 3.进入好友观战,点击开启按钮。 4.提升是否要观看对局,点击确认。 oppo如何在和平精英房间里观战…

    游戏快讯 4小时前
  • 和平精英邀请后如何退出?

    和平精英邀请后如何退出? 点右上角齿轮按钮,又下角点退出游戏 和平精英更新后如何恢复? 有两种不同的处理方法,第一种就是大退游戏,也就是在退出了游戏之后再在手机的后台程序中将其关闭,然后再进入游戏,这样游戏就会自动进行更新。 如果上面的方法不行的话,也可以在设置中找到检查版本,一般来说当选择检查版本之后就会进行自检,如果当前版本不是最新版本的话,就会提示进行…

    游戏快讯 6小时前