[deploy] Add commit catpure to deploy step
Some checks failed
build & deploy / test (push) Failing after 1m31s
build & deploy / build-and-deploy (push) Has been skipped

This commit is contained in:
2026-05-01 16:48:58 -04:00
parent df2108807d
commit cbdb5c49d0
4 changed files with 124 additions and 4 deletions

View File

@ -70,14 +70,35 @@ jobs:
-d "❌ Build failed: ${{ gitea.repository }} @ ${{ gitea.sha }}" \
https://ntfy.unbl.ink/drone
deploy:
build-and-deploy:
# Only deploy on tags (equivalent to Drone when: ref: refs/tags/*)
# if: startsWith(gitea.ref, 'refs/tags/')
needs: [test]
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Poetry
run: |
python -m pip install --upgrade pip
pip install poetry
- name: Write commit hash
run: |
echo "commit = '${{ gitea.sha }}'" > vrobbler/_commit.py
- name: Build package
run: |
poetry build
- name: Copy wheel to server and deploy
uses: appleboy/ssh-action@v1.0.3
with:
host: vrobbler.service
@ -85,6 +106,11 @@ jobs:
key: ${{ secrets.JAIL_KEY }}
command_timeout: 2m
script: |
TMP_DIR=$(mktemp -d)
# The wheel file needs to be copied first - we'll use scp outside this
# For now, let's write the commit hash to a file on the server
mkdir -p /var/lib/vrobbler
echo "${{ gitea.sha }}" > /var/lib/vrobbler/commit.txt
pip uninstall -y vrobbler
pip install git+https://code.lab.unbl.ink/secstate/vrobbler.git@main
vrobbler migrate

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ dist/
.coverage
tmp/*
vrobbler/static/*
vrobbler/_commit.py

View File

@ -1,8 +1,9 @@
import os
from unittest.mock import patch, MagicMock
from pathlib import Path
from unittest.mock import MagicMock, patch
import pytest
from vrobbler.context_processors import version_info
@ -13,6 +14,7 @@ def mock_request():
class TestVersionInfo:
def test_returns_version_and_commit(self, mock_request):
"""Test that git commit is returned when _commit.py doesn't exist"""
with (
patch("vrobbler.context_processors.get_version") as mock_get_version,
patch(
@ -22,7 +24,18 @@ class TestVersionInfo:
mock_get_version.return_value = "1.0.0"
mock_check_output.return_value = b"abc1234"
result = version_info(mock_request)
# Mock the import to raise ImportError so git is used
import builtins
original_import = builtins.__import__
def mock_import(name, *args, **kwargs):
if name == "vrobbler._commit":
raise ImportError("No module named 'vrobbler._commit'")
return original_import(name, *args, **kwargs)
with patch("builtins.__import__", side_effect=mock_import):
result = version_info(mock_request)
assert result["app_version"] == "1.0.0"
assert result["git_commit"] == "abc1234"
@ -38,6 +51,67 @@ class TestVersionInfo:
assert result["git_commit"] == "env_commit_hash"
def test_uses_commit_from_module_when_available(self, mock_request):
"""Test that commit from _commit.py module is used when available"""
with (patch("vrobbler.context_processors.get_version") as mock_get_version,):
mock_get_version.return_value = "1.0.0"
result = version_info(mock_request)
# Should use the value from vrobbler/_commit.py
assert result["git_commit"] == "unknown"
def test_uses_commit_from_file_when_module_unavailable(self, mock_request):
"""Test that commit from /var/lib/vrobbler/commit.txt is used"""
with (
patch("vrobbler.context_processors.get_version") as mock_get_version,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value="file_commit_hash"),
):
mock_get_version.return_value = "1.0.0"
# Mock the import to raise ImportError
import builtins
original_import = builtins.__import__
def mock_import(name, *args, **kwargs):
if name == "vrobbler._commit":
raise ImportError("No module named 'vrobbler._commit'")
return original_import(name, *args, **kwargs)
with patch("builtins.__import__", side_effect=mock_import):
result = version_info(mock_request)
assert result["git_commit"] == "file_commit_hash"
def test_falls_back_to_git_when_file_unavailable(self, mock_request):
"""Test fallback to git when _commit.py and file don't exist"""
with (
patch("vrobbler.context_processors.get_version") as mock_get_version,
patch("pathlib.Path.exists", return_value=False),
patch(
"vrobbler.context_processors.subprocess.check_output"
) as mock_check_output,
):
mock_get_version.return_value = "1.0.0"
mock_check_output.return_value = b"git_commit_hash"
# Mock the import to raise ImportError
import builtins
original_import = builtins.__import__
def mock_import(name, *args, **kwargs):
if name == "vrobbler._commit":
raise ImportError("No module named 'vrobbler._commit'")
return original_import(name, *args, **kwargs)
with patch("builtins.__import__", side_effect=mock_import):
result = version_info(mock_request)
assert result["git_commit"] == "git_commit_hash"
def test_returns_unknown_when_version_fails(self, mock_request):
with (
patch("vrobbler.context_processors.get_version") as mock_get_version,

View File

@ -12,6 +12,25 @@ def version_info(request):
commit = os.environ.get("VROBBLER_COMMIT")
if not commit:
# Try to import from _commit.py module first
try:
from vrobbler._commit import commit
except ImportError:
pass
else:
return {"app_version": app_version, "git_commit": commit}
# Try to read from commit file (written during deploy)
commit_file = Path("/var/lib/vrobbler/commit.txt")
if commit_file.exists():
try:
commit = commit_file.read_text().strip()
if commit:
return {"app_version": app_version, "git_commit": commit}
except OSError:
pass
# Fall back to git command
PROJECT_ROOT = Path(__file__).resolve().parent.parent
try:
commit = (