Skip to content

Commit 7f8401c

Browse files
committed
feat: initial ReleaseBoard implementation
Signed-off-by: Damian Skrzyński <polprog.tech@gmail.com>
1 parent 769388f commit 7f8401c

143 files changed

Lines changed: 38976 additions & 2 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
matrix:
14+
python-version: ["3.12", "3.13"]
15+
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- name: Set up Python ${{ matrix.python-version }}
20+
uses: actions/setup-python@v5
21+
with:
22+
python-version: ${{ matrix.python-version }}
23+
24+
- name: Install dependencies
25+
run: pip install -e ".[dev]"
26+
27+
- name: Lint
28+
run: ruff check src/ tests/
29+
30+
- name: Test
31+
run: pytest --cov=releaseboard --cov-report=term-missing -v
32+
33+
- name: Validate example config
34+
run: releaseboard validate --config examples/config.json
35+
36+
test-with-releasepilot:
37+
runs-on: ubuntu-latest
38+
steps:
39+
- uses: actions/checkout@v4
40+
41+
- name: Set up Python 3.13
42+
uses: actions/setup-python@v5
43+
with:
44+
python-version: "3.13"
45+
46+
- name: Install dependencies with ReleasePilot
47+
run: pip install -e ".[dev,releasepilot]"
48+
49+
- name: Test with ReleasePilot integration
50+
run: pytest tests/test_release_pilot.py -v

.gitignore

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
*.so
6+
*.egg-info/
7+
*.egg
8+
dist/
9+
build/
10+
.eggs/
11+
12+
# Virtual environments
13+
.venv/
14+
venv/
15+
env/
16+
17+
# IDE
18+
.idea/
19+
.vscode/
20+
*.swp
21+
*.swo
22+
*~
23+
24+
# Testing
25+
.coverage
26+
htmlcov/
27+
.pytest_cache/
28+
29+
# Generated output
30+
output/
31+
*.html
32+
!src/releaseboard/presentation/templates/*.html.j2
33+
34+
# OS
35+
.DS_Store
36+
Thumbs.db
37+
38+
# Environment
39+
.env
40+
.env.local
41+
42+
# User config (use examples/ for templates)
43+
releaseboard.json
44+
releaseboard.json.bak

.gitlab-ci.yml

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# =============================================================================
2+
# ReleaseBoard — GitLab CI/CD Pipeline
3+
# =============================================================================
4+
# Stages: lint → test → build → pages
5+
# Python 3.12+ | hatchling build system | pytest + ruff
6+
# =============================================================================
7+
8+
stages:
9+
- lint
10+
- test
11+
- build
12+
- pages
13+
14+
variables:
15+
PYTHONDONTWRITEBYTECODE: "1"
16+
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip-cache"
17+
PYTHONPATH: "src"
18+
19+
# ---------------------------------------------------------------------------
20+
# Global cache — shared pip cache across all jobs
21+
# ---------------------------------------------------------------------------
22+
default:
23+
cache:
24+
key: pip-${CI_COMMIT_REF_SLUG}
25+
paths:
26+
- .pip-cache/
27+
policy: pull-push
28+
29+
# ---------------------------------------------------------------------------
30+
# Workflow rules — run on merge requests and pushes to main
31+
# ---------------------------------------------------------------------------
32+
workflow:
33+
rules:
34+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
35+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
36+
37+
# ===========================================================================
38+
# Stage 1: Lint
39+
# ===========================================================================
40+
ruff-lint:
41+
stage: lint
42+
image: python:3.12-slim
43+
before_script:
44+
- pip install --quiet ruff
45+
script:
46+
- ruff check src/ tests/
47+
rules:
48+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
49+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
50+
51+
# ===========================================================================
52+
# Stage 2: Test (matrix — Python 3.12 + 3.13)
53+
# ===========================================================================
54+
test:
55+
stage: test
56+
image: python:${PYTHON_VERSION}-slim
57+
parallel:
58+
matrix:
59+
- PYTHON_VERSION: ["3.12", "3.13"]
60+
before_script:
61+
- pip install --quiet -e ".[dev]"
62+
script:
63+
- pytest
64+
--cov=releaseboard
65+
--cov-report=term-missing
66+
--cov-report=xml:coverage.xml
67+
--junitxml=report.xml
68+
-q
69+
artifacts:
70+
when: always
71+
paths:
72+
- coverage.xml
73+
- report.xml
74+
reports:
75+
junit: report.xml
76+
coverage_report:
77+
coverage_format: cobertura
78+
path: coverage.xml
79+
expire_in: 30 days
80+
coverage: '/TOTAL.*\s(\d+%)$/'
81+
rules:
82+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
83+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
84+
85+
# ===========================================================================
86+
# Stage 3: Build
87+
# ===========================================================================
88+
build-wheel:
89+
stage: build
90+
image: python:3.12-slim
91+
before_script:
92+
- pip install --quiet build
93+
- pip install --quiet -e .
94+
script:
95+
- python -m build
96+
- releaseboard validate --config examples/config.json
97+
artifacts:
98+
paths:
99+
- dist/
100+
expire_in: 90 days
101+
rules:
102+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
103+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
104+
105+
# ===========================================================================
106+
# Stage 2b: Test with ReleasePilot (optional, allowed to fail)
107+
# ===========================================================================
108+
test-releasepilot:
109+
stage: test
110+
image: python:3.13-slim
111+
before_script:
112+
- pip install --quiet -e ".[dev,releasepilot]"
113+
script:
114+
- pytest tests/test_release_pilot.py -v
115+
allow_failure: true
116+
rules:
117+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
118+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
119+
120+
# ===========================================================================
121+
# Stage 4: Pages — deploy docs/ to GitLab Pages (main only)
122+
# ===========================================================================
123+
pages:
124+
stage: pages
125+
image: python:3.12-slim
126+
script:
127+
- mkdir -p public
128+
- cp -r docs/* public/
129+
- cp -f docs/assets/* public/assets/ 2>/dev/null || true
130+
artifacts:
131+
paths:
132+
- public
133+
rules:
134+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
135+
environment:
136+
name: documentation
137+
url: $CI_PAGES_URL

CODE_OF_CONDUCT.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Contributor Covenant Code of Conduct
2+
3+
## Our Pledge
4+
5+
We as members, contributors, and leaders pledge to make participation in our
6+
community a harassment-free experience for everyone, regardless of age, body
7+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8+
identity and expression, level of experience, education, socio-economic status,
9+
nationality, personal appearance, race, religion, or sexual identity
10+
and orientation.
11+
12+
We pledge to act and interact in ways that contribute to an open, welcoming,
13+
diverse, inclusive, and healthy community.
14+
15+
## Our Standards
16+
17+
Examples of behavior that contributes to a positive environment for our
18+
community include:
19+
20+
* Demonstrating empathy and kindness toward other people
21+
* Being respectful of differing opinions, viewpoints, and experiences
22+
* Giving and gracefully accepting constructive feedback
23+
* Accepting responsibility and apologizing to those affected by our mistakes,
24+
and learning from the experience
25+
* Focusing on what is best not just for us as individuals, but for the
26+
overall community
27+
28+
Examples of unacceptable behavior include:
29+
30+
* The use of sexualized language or imagery, and sexual attention or
31+
advances of any kind
32+
* Trolling, insulting or derogatory comments, and personal or political attacks
33+
* Public or private harassment
34+
* Publishing others' private information, such as a physical or email
35+
address, without their explicit permission
36+
* Other conduct which could reasonably be considered inappropriate in a
37+
professional setting
38+
39+
## Enforcement Responsibilities
40+
41+
Community leaders are responsible for clarifying and enforcing our standards of
42+
acceptable behavior and will take appropriate and fair corrective action in
43+
response to any behavior that they deem inappropriate, threatening, offensive,
44+
or harmful.
45+
46+
## Scope
47+
48+
This Code of Conduct applies within all community spaces, and also applies when
49+
an individual is officially representing the community in public spaces.
50+
51+
## Enforcement
52+
53+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
54+
reported to the project maintainers at **polprog.tech@gmail.com**.
55+
56+
All complaints will be reviewed and investigated promptly and fairly.
57+
58+
## Attribution
59+
60+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
61+
version 2.1, available at
62+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).

0 commit comments

Comments
 (0)