当前位置: 首页 > news >正文

Python爬虫技术 第31节 持续集成和自动化部署

持续集成和自动化部署

Git版本控制

Git 是一个非常流行的分布式版本控制系统,用于跟踪对项目文件的修改。对于爬虫项目来说,使用Git可以帮助你管理代码的不同版本,协同开发,并且可以在出现问题时回滚到之前的版本。

基本操作:

  • 安装Git: 在你的操作系统上安装Git。
  • 初始化仓库: 使用 git init 命令在一个目录下初始化一个新的Git仓库。
  • 添加文件: 使用 git add <file> 添加文件到暂存区。
  • 提交更改: 使用 git commit -m "commit message" 提交更改到仓库。
  • 查看状态: 使用 git status 查看当前仓库的状态。
  • 查看历史记录: 使用 git log 查看提交的历史记录。
  • 撤销更改: 使用 git reset HEAD <file> 撤销最近一次暂存的更改。
  • 分支管理: 使用 git branch <branch-name> 创建新分支,git checkout <branch-name> 切换分支。
  • 合并分支: 使用 git merge <branch-name> 合并分支。
  • 推送代码: 使用 git push origin <branch-name> 将本地分支推送到远程仓库。
CI/CD流程

持续集成(CI)和持续部署(CD)是现代软件开发中不可或缺的部分,它们可以帮助开发者自动检测错误、构建应用、测试以及部署应用到生产环境。

CI/CD工具:

  • Jenkins: 一款开源的CI/CD服务器,支持插件扩展,适合复杂的工作流。
  • GitHub Actions: GitHub提供的自动化工作流服务,非常适合基于GitHub的项目。
  • GitLab CI/CD: GitLab自带的CI/CD工具,易于集成。
  • Travis CI: 一种云服务,提供持续集成和持续交付服务。

基本步骤:

  1. 编写测试用例:

    • 编写单元测试来确保爬虫功能正确无误。
    • 使用工具如 pytestunittest 来编写和运行测试。
  2. 设置CI配置文件:

    • 在项目的根目录创建一个 .gitlab-ci.yml.github/workflows 文件。
    • 配置构建、测试、部署等任务。
  3. 构建和测试:

    • 在每次提交后自动触发构建过程。
    • 运行测试用例确保没有引入新的错误。
  4. 自动化部署:

    • 设置自动部署到测试或生产环境的流程。
    • 可以使用环境变量来安全地存储敏感信息,如数据库连接字符串或API密钥。
  5. 监控和反馈:

    • 监控爬虫的运行情况。
    • 如果发生错误,通过邮件或者消息通知团队成员。

示例配置文件: 假设我们使用GitHub Actions作为CI工具,下面是一个简单的.github/workflows/python-app.yml文件示例:

name: Python CIon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Run testsrun: |pip install pytestpytest

以上就是关于使用Git进行版本控制以及设置CI/CD流程的基本介绍。你可以根据自己的需求选择合适的工具和服务来进行具体的实施。

假设你已经设置好了GitHub Actions,并且想要进一步完善CI/CD流程。以下是一个更详细的GitHub Actions配置文件示例,它包括了Python爬虫项目的构建、测试、以及自动化部署的步骤。

首先,我们需要确保爬虫项目中有一个requirements.txt文件,列出所有需要安装的依赖包。然后,在项目的根目录下创建一个名为.github/workflows/python-app.yml的文件,并填入以下内容:

name: Python CI/CDon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Run testsrun: |pip install pytestpytest- name: Lint code baserun: |pip install flake8flake8 . --count --select=E9,F63,F7,F82 --show-source --statisticsflake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statisticsdeploy:needs: buildruns-on: ubuntu-latestif: github.event_name == 'push' && github.ref == 'refs/heads/main'steps:- name: Checkout repositoryuses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Deploy to serverenv:SSH_HOST: ${{ secrets.SSH_HOST }}SSH_USER: ${{ secrets.SSH_USER }}SSH_KEY: ${{ secrets.SSH_KEY }}run: |ssh-keyscan -t rsa $SSH_HOST >> ~/.ssh/known_hostsecho "$SSH_KEY" > private.keychmod 600 private.keyscp -i private.key -r . $SSH_USER@$SSH_HOST:/path/to/deploy/directoryssh -i private.key $SSH_USER@$SSH_HOST "cd /path/to/deploy/directory; python3 your_crawler.py"

解析上述配置文件

  1. 触发条件 (on):

    • 当有新的提交被推送到main分支时触发构建。
    • 当有新的拉取请求针对main分支时触发构建。
  2. 构建 (build):

    • 检出代码。
    • 安装Python 3.9。
    • 安装依赖。
    • 运行单元测试。
    • 执行代码格式检查 (linting)。
  3. 部署 (deploy):

    • 只有当构建成功并且有新的提交被推送到main分支时才触发部署。
    • 再次检出代码。
    • 安装依赖。
    • 通过SSH将代码部署到服务器,并运行爬虫脚本。

注意事项

  • 环境变量 (secrets):

    • 需要在GitHub仓库的Settings -> Secrets -> Actions中设置SSH_HOSTSSH_USERSSH_KEY
    • SSH_KEY应该是经过加密处理的私钥。
  • 部署路径 (/path/to/deploy/directory):

    • 替换成实际的服务器路径。
  • 爬虫脚本 (your_crawler.py):

    • 替换成你的爬虫脚本名称。

这个配置文件涵盖了从构建到部署的整个流程。你可以根据实际情况调整其中的细节。如果你的部署目标不是通过SSH连接的服务器,而是其他的平台(如Docker容器、Kubernetes集群等),则需要相应地修改部署部分的步骤。

为了进一步优化CI/CD流程,我们可以考虑以下几个方面:

  1. 安全性增强: 确保敏感信息(如API密钥、数据库密码等)不直接出现在代码或配置文件中。
  2. 资源管理和成本控制: 对于云服务的使用,比如AWS、GCP等,要确保资源被适当地管理和成本得到控制。
  3. 错误处理和重试机制: 对于部署过程中可能出现的失败,增加错误处理和重试逻辑。
  4. 通知系统: 当构建或部署失败时,向相关人员发送通知。
  5. 日志记录和监控: 记录重要的事件和日志,以便于调试和监控。

下面是一个更完善的GitHub Actions配置文件示例,包括了上述的一些改进点:

name: Python CI/CDon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Run testsrun: |pip install pytestpytest- name: Lint code baserun: |pip install flake8flake8 . --count --select=E9,F63,F7,F82 --show-source --statisticsflake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statisticsdeploy:needs: buildruns-on: ubuntu-latestif: github.event_name == 'push' && github.ref == 'refs/heads/main'steps:- name: Checkout repositoryuses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Deploy to serverid: deployenv:SSH_HOST: ${{ secrets.SSH_HOST }}SSH_USER: ${{ secrets.SSH_USER }}SSH_KEY: ${{ secrets.SSH_KEY }}run: |ssh-keyscan -t rsa $SSH_HOST >> ~/.ssh/known_hostsecho "$SSH_KEY" > private.keychmod 600 private.keyscp -i private.key -r . $SSH_USER@$SSH_HOST:/path/to/deploy/directoryssh -i private.key $SSH_USER@$SSH_HOST "cd /path/to/deploy/directory; python3 your_crawler.py"- name: Notify on failureif: ${{ always() && steps.deploy.outcome == 'failure' }}run: |# Example of sending an email notificationecho "Deployment failed, notifying team."echo "Send email or other notification here."- name: Cleanupif: ${{ always() }}run: |rm -f private.key

解析更新后的配置文件

  1. 通知系统 (Notify on failure):

    • 当部署步骤失败时,可以发送邮件或使用其他方式通知团队成员。
    • 这里仅做示例展示,你需要根据实际情况替换为实际的通知逻辑。
  2. 清理 (Cleanup):

    • 删除临时生成的私钥文件,以提高安全性。

其他可能的优化

  • 使用缓存 (cache): 对于大型项目而言,安装依赖可能耗时较长。可以考虑使用GitHub Actions的缓存功能来加速安装过程。
  • 并行执行 (concurrency): 如果你的项目中有多个独立的任务,可以考虑让它们并行执行,以缩短整体构建时间。
  • 动态配置 (strategy): 如果有多个环境需要部署,可以使用strategy来定义不同的部署策略。

这些改进措施可以根据你的具体需求进行调整。如果你有特定的需求或想要实现的功能,请告诉我,我可以帮助你进一步定制化这个配置文件。

相关文章:

Python爬虫技术 第31节 持续集成和自动化部署

持续集成和自动化部署 Git版本控制 Git 是一个非常流行的分布式版本控制系统&#xff0c;用于跟踪对项目文件的修改。对于爬虫项目来说&#xff0c;使用Git可以帮助你管理代码的不同版本&#xff0c;协同开发&#xff0c;并且可以在出现问题时回滚到之前的版本。 基本操作&a…...

数据结构(C语言版)(第2版)课后习题答案

数据结构&#xff08;C语言版&#xff09;&#xff08;第2版&#xff09;课后习题答案 李冬梅 2015.3 目 录 第 1 章 绪论 1 第 2 章 线性表 5 第 3 章 栈和队列 13 第 4 章 串、数组和广义表 26 第 5 章 树和二叉树 33 第 6 章 图 43 第 7 章 查找 54 第 8 章 排序 65…...

打开轮盘锁问题(LeetCode)的分析总结及进一步提问

打开轮盘锁问题分析总结&#xff0c;及进一步提问&#xff1a;请给出一组最小步数下的号码序列组合 题目描述 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由…...

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行&#xff0c;通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序&#xff0c;但由于数据包的特性&#xff0c;这一操作很占用性能和时…...

Linux文件管理

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1…...

《Unity3D网络游戏实战》学习与实践--制作一款大乱斗游戏

角色类 基类Base Human是基础的角色类&#xff0c;它处理“操控角色”和“同步角色”的一些共有功能&#xff1b;CtrlHuman类代表“操控角色”​&#xff0c;它在BaseHuman类的基础上处理鼠标操控功能&#xff1b;SyncHuman类是“同步角色”类&#xff0c;它也继承自BaseHuman&…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑源-荷不确定性的省间电力现货市场潮流风险概率评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

Pinterest 选择采用 TiDB

原文来源&#xff1a; https://tidb.net/blog/9f000c95 作者&#xff1a;Pinterest 公司高级软件工程师 Alberto Ordonez Pereira &#xff1b;高级工程经理 Lianghong Xu 声明&#xff1a;本文转载于 https://medium.com/pinterest-engineering/tidb-adoption-…...

【Python】 如何用 Docker 打包一个 Python 脚本

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 &#x1f3b5; 许飞《父亲写的散文诗》 如何用 Docker 打包一个 Python 脚本 Docker 是一个开源的容器化平台&#xff0c;允许开发者将…...

从“幕后”到“台前”:一文读懂API经济如何促进企业的创新与增长

API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;指一组定义软件程序如何与其他组件、服务或系统交互的规范。在传统的IT语境中&#xff0c;API往往更多承担前后端对接或应用系统间内部集成渠道的作用。但在当今大数据与智能化的时代&am…...

解锁PDF新姿势:2024年PDF转图片工具精选

随着数字化办公的普及和文档处理需求的日益增长&#xff0c;PDF转图片工具已成为日常工作中不可或缺的一部分。这些工具不仅帮助用户轻松地将PDF文件转换为图片格式&#xff0c;还提供了丰富的编辑、转换和批量处理功能&#xff0c;极大地提高了工作效率。 1.福昕PDF转换大师&…...

Node.js(8)——Express的基本使用

监听GET请求 通过app.get()方法&#xff0c;可以监听客户端GET请求&#xff0c;具体语法&#xff1a; app.get(请求URL,function(req,res){处理函数}) 监听POST请求 语法&#xff1a; app.post(请求URL,function(req,res){处理函数}) 把内容响应给客户端 通过res.send()方法…...

Linux--应用层协议HTTP

HTTP协议 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;它基于TCP/IP通信协议来传送数据&#xff0c;规定了浏览器与服务器之间数据传输的规则&#xff0c;确保数据能够在网络源头…...

Flux:Midjourney的新图像模型挑战者

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- Black Forest Labs是一家由前Stability.ai开发人员创立的AI初创公司&#xff0c;旨在为图像和视频创建尖端的生成式 AI 模型。这家初创公司声称&#xff0c;其第一个模型系列Flux.1为文本到图像…...

RabbitMQ高级特性 - 消费者消息确认机制

文章目录 RabbitMQ 消息确认机制背景消费者消息确认机制概述手动确认&#xff08;RabbitMQ 原生 SDK&#xff09;手动确认&#xff08;Spring-AMQP 封装 RabbitMQ SDK&#xff09;AcknowledgeMode.NONEAcknowledgeMode.AUTO&#xff08;默认&#xff09;AcknowledgeMode.MANUAL…...

PermX-htb

0x01 立足 信息收集 端口扫描 nmap -sSCV -Pn 10.10.11.23 正常开启22和80端口 访问web页面 并没有看到有攻击点 这个页面可先记录一会儿有需要的话可以尝试xss获取cookie 域名扫描 ffuf -w 1.txt -u http://permx.htb/ -H Host:FUZZ.permx.htb 这里用的ffuf扫描工具 扫出了…...

解密RCE漏洞:原理剖析、复现与代码审计实战

在网络安全领域&#xff0c;远程代码执行&#xff08;RCE&#xff09;漏洞因其严重性和破坏力而备受关注。RCE漏洞允许攻击者在目标系统上执行任意代码&#xff0c;从而掌控整个系统&#xff0c;带来极大的安全风险。理解RCE漏洞的工作原理&#xff0c;并掌握其复现与代码审计技…...

打造智能家居:用React、Node.js和WebSocket构建ESP32设备控制面板(代码说明)

一、项目概述 在物联网&#xff08;IoT&#xff09;时代&#xff0c;智能设备的远程控制变得越来越重要。本文介绍了一个构建智能设备控制面板的项目&#xff0c;允许用户通过 Web 应用来控制多个 ESP32 设备。用户可以通过该面板查看设备列表&#xff0c;实时了解设备状态&am…...

计网:从输入URL到网页显示期间发生了什么

1、URL包含的信息 我们输入的url中包含着一些信息&#xff1a; http&#xff1a;表示的此次我们使用的什么协议/www.baidu.com&#xff1a;表示的是我们想要访问的服务器名称&#xff0c;也就是域名dir3/home.html&#xff1a;表示我们所要访问的资源 2、通过DNS解析URL获得I…...

龚宇引以为傲的“爆款制造营”,爱奇艺怕是要爽约了

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 人们经常用人红戏不红&#xff0c;来形容毯星&#xff0c;综艺上咋咋呼呼&#xff0c;一提都知道&#xff0c;可问及代表作&#xff0c;不好意思&#xff0c;这个真没有。 今年的爱奇艺&#xff0c;貌似也迎来了这一宿命。 …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...

Linux系统:进程间通信-匿名与命名管道

本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道&#xff08;Pipe&#xff09;是一种进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;机制&#xff0c;用于在不…...