代码质量测试,代码质量怎么评价

全文共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 }}\’ | docker login 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 网站获取)。

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

图片来源:Unsplash

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

留言、点赞并关注我们

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

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

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

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

相关推荐

  • 和平精英雪地怎么写字?

    和平精英雪地怎么写字? .首先进入设置、通用设置选项,然后在通用设置界面中,依次点击进入键盘、键盘设置页面,接下来进入的键盘页面设置中,依次再次点击添加新键盘。 2.选择简体中文选项,再接下来在键盘中文输入法中,勾选上手写选项,然后点击右上角的完成即可,设置完成后,打开可输入文字的界面,然后长按输入左下角的球形图标,之后会弹出输入法选择选项,选择简体手写,即…

    游戏快讯 1小时前
  • 和平精英船怎么飞? 和平精英外骨骼怎么飞?

    和平精英船怎么飞? 和平精英船你要收集足够的油桶,然后把一颗手雷丢到船底下,然后你上船就会飞的很高所以就可以完成和平精英里面传飞的场景 和平精英外骨骼怎么飞? 打那个追猎模式,然后得到足够多的晶体,然后再去基站了,造腿 ,点两下跳就可以了飞了 和平精英900米怎么飞? 首先最好在跳伞前提前标好落地位置,当标记连线与飞机路径垂直时则是飞机与目标地点最近位置,这…

    游戏快讯 4小时前
  • 和平精英屏幕大小怎么调?

    和平精英屏幕大小怎么调? 一、和平精英怎么缩小屏幕: 1.先打开手机,然后打开手机上的和平精英,之后点击选择一个方式进行登录进入和平精英; 2.然后点击右下角的设置; 3.之后点击画面设置; 4.然后将屏幕亮度下方的滑动按钮向左或向右滑动来调整; 5.调整完成后,我们点击确认修改即可。 二、《和平精英》是由腾讯光子工作室群自研打造的军事竞赛体验手游,该作于2…

    游戏快讯 5小时前
  • 和平精英怎么刚枪? vr眼镜怎么玩和平精英枪瞄准?

    和平精英怎么刚枪? 和平精英刚枪的方法: 1.移动射击 2.掩体利用、左右探头 在掩体后重分利用左右探头的操作和第三人称的视野优势,可以借助于自己藏身的掩体或墙壁观察对手的走位。 3.提前枪。 vr眼镜怎么玩和平精英枪瞄准? 要在VR眼镜中玩和平精英并进行枪瞄准,您可以按照以下步骤进行操作: 1. 确保您已将VR眼镜正确连接到计算机或游戏主机,并已完成VR设…

    游戏快讯 6小时前
  • 和平精英低端机怎么锁60帧?

    和平精英低端机怎么锁60帧? 首先我们在和平精英首页或者游戏中点击右上角的“设置”按钮,将设置界面打开。之后我们在里面点击右侧的“画面设置”功能选项,里面可以对帧数进行设置。 在里面可以看到帧数设置里面低、中、高三个设置选项,因为手机配置的不同,会限制我们设置的帧数,如果是好手机,后面还会有超高清和极高清两个设置,我们在里面选择最高的一个点击,才有可能达到6…

    游戏快讯 8小时前