【问题标题】:Is there a python edge software update tool?有python边缘软件更新工具吗?
【发布时间】:2020-12-31 11:56:55
【问题描述】:

所以我有一个用 python 编写并在一组 (10) Raspberry Pi 上运行的简单应用程序。

  • 这是一个包含一个可运行脚本的文件夹。
  • 我希望在具有公共 IP 的外部服务器上拥有某种 CI/CD 类服务,该服务会将更新部署到所有边缘节点并在其上重新启动我的应用程序。
  • 边缘设备上很少有互联网,因此我想在按下服务器上的某个按钮时推送更新

python 程序有没有这样的东西可以在边缘设备上运行?

【问题讨论】:

  • 只做import os,然后os.system("sudo apt-get update && sudo apt-get upgrade")
  • 这将适用于 ubuntu 和 raspberry pi os 和 debian

标签: python raspberry-pi continuous-integration device cd


【解决方案1】:

据我了解,主要问题是在多个 Raspberry Pi 板上更新和运行一些脚本,对吗?

有很多现成的解决方案,如dokkupiku。两者都允许您将 git push 部署到您自己的服务器(手动)。

或者您可以开发自己的解决方案,使用GitHub webhooks 或一些 HTML 表单(用于手动推送)和 Flask 网络服务器,它们将在内部执行 CI/CD 步骤。

您需要在每个节点/板上运行上述脚本。并使用类似于http://your-domain-or-IP.com:8000/deploy-webhook 的 URL 配置 Webhook,但每个节点使用不同的端口。

或者您可以从浏览器手动打开该页面。或者创建允许您异步执行此操作的单独页面。如你所愿。

from flask import Flask
import subprocess

app = Flask(__name__)
script_proc = None
src_path = '~/project/src/'


def bash(cmd):
    subprocess.Popen(cmd)


def pull_code(path):
    bash('git -C {path} reset --hard'.format(path=path))
    bash('git -C {path} clean -df'.format(path=path))
    bash('git -C {path} pull -f'.format(path=path))
    # or
    # If need just to copy files to remote machine:
    # (example of remote path "pi@192.168.1.1:~/project/src/")
    bash('scp -r {src_path} {dst_path}'.format(src_path=src_path, dst_path=path)) 
    


def installation(python_path):
    bash('{python_path} -m pip install -r requirements.txt'.format(python_path=python_path))


def stop_script():
    global script_proc

    if script_proc:
        script_proc.terminate()


def start_script(python_path, script_path, args=None):
    global script_proc

    script_proc = subprocess.Popen(
        '{} {} {}'.format(str(python_path), script_path, ' '.join(args) or '')
    )


@app.route('/deploy-webhook')
def deploy_webhook():
    project_path = '~/project/some_project_path'
    script_path = 'script1.py'
    python_path = 'venv/bin/python'

    pull_code(project_path)
    installation(python_path)

    stop_script()
    start_script(python_path, script_path)
    return 'Deployed'

【讨论】:

  • @DuckQueen 是你要找的吗?
  • 问题是,如果可能的话,不要使用 git 作为内容源 - 有一个简单的系统文件夹和一个按钮\脚本来执行...
  • 是的,有可能,只需将操作更改为复制源代码即可。使用可编辑版本可能难以维护。但对你来说还是可以的。
  • @DuckQueen,还有其他问题吗?
【解决方案2】:

如果您不需要用户界面并使用 linux,我建议您使用 bash 脚本。 我写了一个简单的 bash 脚本“推送更新并重新启动”到 为树莓派设置的。请在ssh之前配置with key-less login

#!/bin/bash

listOfIps=( 
192.168.1.100
192.168.1.101
192.168.1.102
192.168.1.103
)

username="pi" 
destDir="work/"
pythonScriptName="fooScript.py"

for i in "${listOfIps[@]}" 
do
     echo "will copy folder \"$1\" with content to ip: ${i} and perform"
     echo "scp -r $1 ${username}@${i}:${destDir}"
     scp -r $1 ${username}@${i}:${destDir}
     echo "will kill all python scripts unfriendly"  
     ssh ${username}@${i} "pkill python" 
     echo "will restart my python scripts ${pythonScriptName} in dir ${destDir} "  
     ssh ${username}@${i} "python3 ${destDir}/${pythonScriptName} &"
done
exit 0

将代码保存在文件 copyToAll.sh 中编辑用户名 destDir 和您的脚本名称并使其可执行:

chmod 755 copyToAll.sh

打电话

copyToAll.sh myFileToSend

【讨论】:

  • 但这里的主要问题仍未得到解答:如何重新启动应用程序并将其作为更新推送到设备。
  • 好的,但是“更新”是通过将文件复制到您的 pi 来完成的,我不是吗?一个简单的重启可能是:pkill myPythonScriptsName(杀死名为 myPythonScriptsName 的进程)和 python3 myPythonScriptsName.py
  • 但主要问题是您需要分别在每台机器上手动执行此操作。并且作者希望有自动 CI/CD :)
  • 好的,没有 CI/CD,但我添加了一些不友好的重启命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2010-12-26
相关资源
最近更新 更多