Merge pull request 'Adds testcase for PR policy checks' (#4) from feature/pr-policy-checks into main
sandbox/pipeline/head This commit looks good

Reviewed-on: http://127.0.0.1:3001/lifemaps/sandbox/pulls/4
Reviewed-by: torsten <torsten.wierschin@life-maps.com>
This commit was merged in pull request #4.
This commit is contained in:
torsten committed 2026-08-04 18:03:22 +00:00
commit 0a5abbb1ee
7 files changed
+256 -3

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
BasedOnStyle: LLVM
IndentWidth: 4
TabWidth: 4
UseTab: Never
ColumnLimit: 120
Language: Cpp
Standard: c++20
PointerAlignment: Left
ReferenceAlignment: Left
SortIncludes: true
IncludeBlocks: Regroup
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true
AfterControlStatement: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
BeforeCatch: true
BeforeElse: true
AllowShortIfStatementsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
NamespaceIndentation: None
IndentCaseLabels: true
AlignTrailingComments: true
SeparateDefinitionBlocks: Always
SpaceBeforeParens: ControlStatements
Cpp11BracedListStyle: true
+24
View File
@@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.20)
project(sandbox LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(sandbox main.cpp)
enable_testing()
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
add_executable(test_main tests/test_main.cpp)
target_link_libraries(test_main GTest::gtest_main)
include(GoogleTest)
gtest_discover_tests(test_main)
+17
View File
@@ -0,0 +1,17 @@
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3 \
clang-format \
cmake \
ninja-build \
git \
g++ \
make \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
Vendored
+43 -3
View File
@@ -1,22 +1,62 @@
pipeline {
agent any
agent {
docker {
image 'lifemaps/ci-cpp:latest'
reuseNode true
args '-u root:root'
}
}
options {
timestamps()
disableConcurrentBuilds()
}
environment {
BUILD_DIR = "build"
CHANGE_TARGET = "${env.CHANGE_TARGET ?: 'origin/main'}"
}
stages {
stage('Checkout') {
steps {
checkout scm
sh 'git fetch --all --prune'
sh 'git submodule update --init --recursive || true'
}
}
stage('Policy Checks') {
steps {
sh 'python3 ci/check_pr_policies.py'
}
}
stage('Configure') {
steps {
sh 'cmake -S . -B ${BUILD_DIR} -G Ninja -DCMAKE_BUILD_TYPE=Debug'
}
}
stage('Build') {
steps {
sh 'echo Build works'
sh 'cmake --build ${BUILD_DIR} --parallel'
}
}
stage('Test') {
steps {
sh 'echo Tests work'
sh 'ctest --test-dir ${BUILD_DIR} --output-on-failure'
}
}
}
post {
always {
script {
if (getContext(hudson.FilePath)) {
cleanWs deleteDirs: true, disableDeferredWipeout: true
}
}
}
}
+131
View File
@@ -0,0 +1,131 @@
#!/usr/bin/env python3
import os
import subprocess
import sys
from pathlib import Path
ROOT = Path(".").resolve()
TEST_DIRS = [ROOT / "tests", ROOT / "test"]
CPP_EXTENSIONS = {".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx"}
TEST_PATTERNS = [
"test_{name}.cpp",
"test_{name}.h",
"{name}_test.cpp",
"{name}_test.h",
"{name}test.cpp",
"{name}test.h",
"{name}gtest.cpp",
"{name}gtest.h",
]
def run(cmd: str) -> str:
return subprocess.check_output(cmd, shell=True, text=True).strip()
def git_ref_exists(ref: str) -> bool:
try:
subprocess.check_call(
f"git rev-parse --verify --quiet '{ref}'",
shell=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
return True
except subprocess.CalledProcessError:
return False
def resolve_target_ref() -> str:
raw = os.environ.get("CHANGE_TARGET", "").strip()
candidates = []
if raw:
candidates.append(raw)
if not raw.startswith("origin/"):
candidates.append(f"origin/{raw}")
candidates.extend(["origin/main", "main"])
seen = set()
for ref in candidates:
if ref and ref not in seen:
seen.add(ref)
if git_ref_exists(ref):
return ref
print("ERROR: Kein gültiger Ziel-Branch-Ref gefunden. Geprüft:", ", ".join(candidates))
sys.exit(1)
def changed_files():
target = resolve_target_ref()
print(f"Vergleiche gegen Ziel-Ref: {target}")
out = run(f"git diff --name-only {target}...HEAD")
return [line.strip() for line in out.splitlines() if line.strip()]
def is_cpp_file(path: Path) -> bool:
return path.suffix.lower() in CPP_EXTENSIONS
def require_clang_format():
if not (ROOT / ".clang-format").exists():
print("ERROR: .clang-format fehlt im Repository-Root.")
sys.exit(1)
def check_format(path: Path):
subprocess.check_call(f"clang-format --dry-run --Werror '{path}'", shell=True)
def candidate_names(path: Path):
stem = path.stem.lower()
names = {stem}
for suffix in ["_p", "_impl", "_private", "_priv", "_ui"]:
if stem.endswith(suffix):
names.add(stem[:-len(suffix)])
return sorted(n for n in names if n)
def iter_test_files():
for test_dir in TEST_DIRS:
if test_dir.exists():
yield from (p for p in test_dir.rglob("*") if p.is_file())
def has_related_test(path: Path) -> bool:
test_files = list(iter_test_files())
if not test_files:
return False
test_names = [p.name.lower() for p in test_files]
for name in candidate_names(path):
for pattern in TEST_PATTERNS:
if pattern.format(name=name).lower() in test_names:
return True
for test_name in test_names:
if name in test_name and ("test" in test_name or "gtest" in test_name):
return True
return False
def main():
require_clang_format()
files = changed_files()
if not files:
print("Keine geänderten Dateien erkannt.")
return
for rel in files:
path = ROOT / rel
if not path.exists():
continue
if is_cpp_file(path):
print(f"Prüfe: {rel}")
try:
check_format(path)
except subprocess.CalledProcessError:
print(f"ERROR: Formatfehler in {rel}")
sys.exit(1)
if not has_related_test(path):
print(f"ERROR: Kein passender Test unter tests/ oder test/ für {rel} gefunden.")
sys.exit(1)
print("Policy-Checks erfolgreich.")
if __name__ == "__main__":
main()
+7
View File
@@ -0,0 +1,7 @@
#include <iostream>
int main()
{
std::cout << "Hello from sandbox\n";
return 0;
}
+6
View File
@@ -0,0 +1,6 @@
#include <gtest/gtest.h>
TEST(MainTest, Smoke)
{
EXPECT_TRUE(true);
}