fixed import_machine_prdoucts, prepared for gitea actions

This commit is contained in:
gitea 2025-04-09 18:56:57 +00:00
parent a5e14a07d7
commit ba4bc5dc8d
4 changed files with 226 additions and 2 deletions

View File

@ -0,0 +1,111 @@
name: odoo-backup-restore
on:
schedule:
- cron: "21 5 * * *" # Dieser Job wird täglich um 05:21 Uhr UTC ausgeführt.
push:
branches:
- main
# workflow_dispatch:
env:
URL_BACKUP: https://odoo.lan.hobbyhimmel.de
URL_RESTORE: http://hobbybackend2.fritz.box:9013
jobs:
run-odoo-backup-in-docker:
runs-on: ["hobbybackend2","ubuntu-latest"] # Gibt an, dass der Job entweder auf 'hobbybackend1' und 'ubuntu-latest' läuft.
steps:
- name: Checkout the repository
# Dieser Schritt holt den Code des Repositories in die Action-Umgebung.
# Dies ist notwendig, um auf Dateien im Repository wie Skripte oder Konfigurationen zugreifen zu können.
uses: actions/checkout@v3
- name: Set up Docker container
# Dieser Schritt startet einen Docker-Container basierend auf dem "ubuntu:latest" Image.
# Er läuft im Hintergrund (`-d`), und wir verwenden `tail -f /dev/null`, um den Container laufend zu halten.
# Danach werden benötigte Pakete wie `gnupg`, `openssh-client`, `curl` und `sshpass` installiert.
run: |
docker run -d --name ${{ github.workflow }} ubuntu:latest tail -f /dev/null
docker exec ${{ github.workflow }} apt-get update
docker exec ${{ github.workflow }} apt-get install -y gnupg openssh-client curl sshpass
- name: Copy SSH keys to the container
# In diesem Schritt werden SSH-Schlüssel aus den GitHub Secrets in temporäre Dateien geschrieben.
# Diese Dateien werden dann in den Docker-Container kopiert, um SSH-Zugriff innerhalb des Containers zu ermöglichen.
# Schließlich werden die Berechtigungen des privaten Schlüssels (id_rsa) auf 600 gesetzt.
run: |
docker exec ${{ github.workflow }} mkdir -p /root/.ssh
echo "${{ secrets.OPENSSH_PRIVATE_KEY }}" > ssh_private_key
echo "${{ secrets.OPENSSH_PUBLIC_KEY }}" > ssh_public_key
docker cp ssh_private_key ${{ github.workflow }}:/root/.ssh/id_rsa
docker cp ssh_public_key ${{ github.workflow }}:/root/.ssh/id_rsa.pub
docker exec ${{ github.workflow }} chmod 600 /root/.ssh/id_rsa
- name: Copy PGP keys to the container
# Hier werden die GPG-Schlüssel (PGP-Schlüssel) in den Container kopiert, um Backups verschlüsseln zu können.
# Die GPG-Schlüssel werden ebenfalls aus den GitHub Secrets entnommen und temporär in Dateien gespeichert,
# die anschließend importiert werden.
run: |
echo "${{ secrets.PGP_PRIVATE_KEY }}" > pgp_private_key.asc
echo "${{ secrets.PGP_PUBLIC_KEY }}" > pgp_public_key.asc
docker cp pgp_private_key.asc ${{ github.workflow }}:/root/pgp_private_key.asc
docker cp pgp_public_key.asc ${{ github.workflow }}:/root/pgp_public_key.asc
docker exec ${{ github.workflow }} gpg --batch --import /root/pgp_private_key.asc
docker exec ${{ github.workflow }} gpg --import /root/pgp_public_key.asc
rm pgp_private_key.asc pgp_public_key.asc
- name: Add Host to Known Hosts
# In diesem Schritt wird der SSH-Host-Schlüssel des Remote-Servers (ALL_INKL_HOST) zum "known_hosts"-File
# des Containers hinzugefügt, um SSH-Verbindungen zum Remote-Server zu ermöglichen, ohne dass Warnungen angezeigt werden.
# Der Host-Schlüssel wird mit `ssh-keyscan` gesammelt und in `known_hosts` eingetragen.
run: |
echo "This is the host: ${{ secrets.ALL_INKL_HOST }}"
docker exec ${{ github.workflow }} bash -c "mkdir -p /root/.ssh && touch /root/.ssh/known_hosts && chmod 600 /root/.ssh/known_hosts"
docker exec ${{ github.workflow }} bash -c "ssh-keyscan -H '${{ secrets.ALL_INKL_HOST }}' >> /root/.ssh/known_hosts"
docker exec ${{ github.workflow }} bash -c "cat /root/.ssh/known_hosts" # Optional: Ausgabe zur Überprüfung
- name: Run the restore script in Docker container
# In diesem Schritt wird das Skript `odoo-restore.sh` in den Container kopiert und dort ausgeführt.
# Die für das Skript notwendigen Umgebungsvariablen (wie z.B. ... ) werden mitgegeben.
# Das Skript entpackt das Backup-Archiv.
# Das Skript löscht die bisherige Datenbank und fügt die neue Datenbank wieder ein.
# Anschließend wird das Odoo filestore wiederhergestellt.
run: |
docker cp ./scripts/odoo-restore.sh ${{ github.workflow }}:/root/odoo-restore.sh
docker exec -e ADMIN_PASSWORD=${{ secrets.ODOO_ADMIN_PASSWORD }} \
-e sftp_host=${{ secrets.SFTP_HOST }} \
-e sftp_user=${{ secrets.SFTP_USER }} \
-e sftp_password=${{ secrets.SFTP_PASSWD }} \
${{ github.workflow }} /bin/bash -c "bash /root/odoo-restore.sh '${{ env.URL_RESTORE }}'"
#-name: Uninstall vvow_pos
# In diesem Schritt wird das Modul `vvow_pos` deinstalliert, um sicherzustellen, dass es keine Konflikte mit der neuen Datenbank gibt.
- name: Clone or update custom_addons open_workshop repository
working-directory: .
run: |
docker exec ${{ github.repository_owner }}_${{ env.CONTAINER_NAME }}_${{ env.CONTAINER_NAME_EXTENSION }} /bin/bash -c "
git config --global pull.ff only && \
if [ ! -d /home/odoo/custom_addons/open_workshop ]; then
git clone https://gitea:${{ secrets.BUILD_ACTION }}@gitea.lan.hobbyhimmel.de/hobbyhimmel/open_workshop.git /home/odoo/custom_addons/open_workshop;
cd /home/odoo/custom_addons/open_workshop && git fetch && git checkout ${{ env.ODOO_VERSION }}_dev && git pull;
else
cd /home/odoo/custom_addons/open_workshop && git fetch && git checkout ${{ env.ODOO_VERSION }}_dev && git pull;
fi"
-name: Fix Database hobbyhimmel with fix_missing_pos_partner.py
# In diesem Schritt wird das Skript `fix_missing_pos_partner.py` ausgeführt, um sicherzustellen, dass alle Partner in der Datenbank korrekt sind.
-name: Install open_workshop
# Install open_workshop and run necessary migrations
-name: Restart Docker Container
-name: Uninstall vvow_einweisungen
- name: Stop and remove Docker container
# Nachdem das Backup abgeschlossen ist, wird der Docker-Container gestoppt und entfernt,
# um keine Ressourcen auf dem Host unnötig zu verbrauchen.
run: |
docker stop ${{ github.workflow }}
docker rm ${{ github.workflow }}

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from odoo import SUPERUSER_ID
from odoo.api import Environment
from . import import_machine_products
#from . import import_machine_products
import logging
_logger = logging.getLogger(__name__)
@ -31,7 +31,7 @@ def run_migration(cr, registry):
import_machine_products.run_import(cr, registry)
#import_machine_products.run_import(cr, registry)
''' Funktioniert nicht:

View File

@ -0,0 +1,79 @@
# import_machine_products.py
# odoo-bin shell -d deine_datenbank < import_machine_products.py
import logging
from odoo import api, SUPERUSER_ID
_logger = logging.getLogger(__name__)
# Mapping von product_id > machine_id
TRAINING_MAPPING = {
'16':'1',
'11':'2',
'10':'4',
'117':'5',
'14':'6',
'12':'7',
'15':'8',
'118':'10',
'118':'11',
'118':'12',
'18':'15',
'18':'16',
'13':'18',
'17':'19',
}
# Mapping von product_id > machine_id
USAGE_MAPPING = {
'50':'1',
'49':'2',
'49':'3',
'49':'4',
'53':'5',
'52':'7',
'55':'8',
'59':'15',
'60':'15',
'59':'16',
'60':'16',
'57':'18',
'58':'19',
}
def run_import(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
machine_model = env['ows.machine']
product_model = env['product.product']
training_model = env['ows.machine.training']
usage_model = env['ows.machine.product']
created_training = 0
created_usage = 0
for product_id, machine_id in TRAINING_MAPPING.items():
machine = machine_model.search([('id', '=', machine_id)], limit=1)
product = product_model.search([('id', '=', product_id)], limit=1)
if machine and product:
training_model.create({
'machine_id': machine.id,
'training_id': product.id,
})
created_training += 1
for product_id, machine_id in USAGE_MAPPING.items():
machine = machine_model.search([('id', '=', machine_id)], limit=1)
product = product_model.search([('id', '=', product_id)], limit=1)
if machine and product:
usage_model.create({
'machine_id': machine.id,
'product_id': product.id,
})
created_usage += 1
_logger.info(f"[OWS Import] ✅ Trainings-Zuordnungen erstellt: {created_training}, Nutzungs-Zuordnungen erstellt: {created_usage}")
env.cr.commit()
# Automatischer Start in odoo-bin shell
if 'env' in globals():
run_import(env.cr, env.registry)

34
scripts/odoo-restore.sh Normal file
View File

@ -0,0 +1,34 @@
#!/bin/bash
BACKUP_DIR=~ # Verzeichnis, in dem das Backup temporär gespeichert wird.
#MONITOR_URL='https://cronitor.link/p/c6debfe4e00f46fe9eb430ab9d2b2588/7PPIpd' # Cronitor-URL zur Überwachung des Skriptstatus.
ODOO_DATABASE=hobbyhimmel # Der Name der Odoo-Datenbank, die wiederhergestellt werden soll.
DEFAULT_URL="http://hobbybackend2.fritz.box:9013" # Standard-URL für die Odoo-Datenbank-Backup-API.
URL="${1:-$DEFAULT_URL}" # Falls ein Argument übergeben wird, wird es als URL genutzt, sonst bleibt die Standard-URL.
BACKUP_NAME=${ODOO_DATABASE}.$(date +%F).zip # Der Name der Backup-Datei, wobei das aktuelle Datum an den Namen angehängt wird.
# Function to report failure to Cronitor with step
# Diese Funktion meldet einen Fehler an Cronitor und beendet das Skript.
# Parameter: $1 - Der Schrittname, der beim Fehlschlag gemeldet wird.
report_failure() {
local step=$1 # Schrittname wird als erster Parameter übergeben.
#curl "$MONITOR_URL?state=fail&message=$step" # Meldet den Fehlerstatus an Cronitor.
exit 1 # Beendet das Skript mit Exit-Code 1 (Fehler).
}
curl -X POST -s \
-F "master_pwd=${ADMIN_PASSWORD}" \
-F "name=${ODOO_DATABASE}" \
${URL}/web/database/drop || report_failure "Database deletion"
curl \
-F "master_pwd=${ADMIN_PASSWORD}" \
-F "name=${ODOO_DATABASE}" \
-F "backup_file=@${BACKUP_DIR}/${BACKUP_NAME}" \
-F "backup_format=zip" \
-F "copy=true" \
${URL}/web/database/restore || report_failure "Database restoration"
# If everything was successful, report completion
# Meldet den erfolgreichen Abschluss des Skripts an Cronitor.
#curl "$MONITOR_URL?state=complete"