#python #raspberry-pi #continuous-integration #device #cd
#python #raspberry-pi #непрерывная интеграция #устройство #cd
Вопрос:
Итак, у меня есть простое приложение, написанное на Python и работающее на наборе (10) Raspberry Pi.
- Это папка с одним запускаемым скриптом.
- Я хочу иметь на своем внешнем сервере с общедоступным IP-адресом какой-нибудь сервис, подобный CI / CD, который развертывал бы обновления на всех пограничных узлах и перезапускал мое приложение на них.
- Интернет редко используется на периферийных устройствах, поэтому я хочу запускать обновления, когда нажимаю какую-либо кнопку на сервере
Есть ли такая вещь для программ Python, которые предназначены для запуска на периферийных устройствах?
Комментарии:
1. просто сделайте
import os
, а затемos.system("sudo apt-get update amp;amp; sudo apt-get upgrade")
2. это будет работать на Ubuntu, raspberry pi os и debian
3. Может быть, что-то вроде github.com/kubeedge/examples ?
Ответ №1:
Насколько я понимаю, основная проблема заключается в обновлении и запуске некоторого скрипта на нескольких платах Raspberry Pi, правильно?
Существует множество готовых решений, таких как dokku или piku. Оба позволяют выполнять принудительное развертывание git на ваших собственных серверах (вручную).
Или вы можете разработать свое собственное решение, используя GitHub webhooks или какую-либо HTML-форму (для ручного нажатия) и веб-сервер Flask, который будет выполнять шаги CI / CD внутри.
Вам нужно будет запустить скрипт, подобный приведенному выше, на каждом узле / плате. И настройте Webhook с URL, аналогичным: http://your-domain-or-IP.com:8000/deploy-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'
Комментарии:
1. @DuckQueen это то, что вы ищете?
2. Дело в том, чтобы, если возможно, не использовать git в качестве источника контента — иметь простую системную папку и кнопку скрипт для выполнения…
3. Да, это возможно, просто измените операции для копирования исходного кода вместо этого. Использование редактируемой версии может быть затруднено в обслуживании. Но для вас все еще может быть в порядке.
4. @DuckQueen, остались вопросы?
Ответ №2:
Если вам не нужен пользовательский интерфейс и вы используете Linux, я хочу предложить использовать скрипт bash. Я написал простой скрипт bash «для запуска обновления и перезапуска», как установлено для raspberry pi. Пожалуйста, настройте перед ssh вход без ключа.
#!/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} amp;"
done
exit 0
сохраните код в файле copyToAll.sh отредактируйте имя пользователя destDir и имя вашего скрипта и сделайте его исполняемым:
chmod 755 copyToAll.sh
вызов
copyToAll.sh myFileToSend
Комментарии:
1. Но главный вопрос здесь остается без ответа: как перезапустить приложения и отправить их в качестве обновления на устройства.
2. хорошо, но «обновление» выполняется путем копирования файла на ваш pi, не так ли? и простым перезапуском может быть: pkill myPythonScriptsName (завершите процесс, который называется myPythonScriptsName) и python3 myPythonScriptsName.py
3. но основная проблема заключается в том, что вам нужно сделать это вручную на каждой машине отдельно. И автор хочет иметь автоматический CI / CD 🙂
4. хорошо, нет CI / CD, но я добавил несколько недружественных команд перезапуска