Public Access
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c4157b5c6 | ||
|
|
ea7ddb2036 | ||
|
|
ef63ada2f0 | ||
|
|
cdd5f5a8da | ||
|
|
63ae375b4b | ||
|
|
8862ea4639 | ||
|
|
8ca0a1b208 | ||
|
|
670f5a099a | ||
|
|
a5277a0790 |
+25
-5
@@ -8,11 +8,15 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
quality:
|
quality:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-quality:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-quality
|
run: make setup-image
|
||||||
- name: Lint all
|
- name: Lint all
|
||||||
run: |
|
run: |
|
||||||
. .venv/bin/activate
|
. .venv/bin/activate
|
||||||
@@ -60,7 +64,11 @@ jobs:
|
|||||||
|
|
||||||
detect-changes:
|
detect-changes:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
outputs:
|
outputs:
|
||||||
user-facing-changed: ${{ steps.detect.outputs.user-facing-changed }}
|
user-facing-changed: ${{ steps.detect.outputs.user-facing-changed }}
|
||||||
steps:
|
steps:
|
||||||
@@ -68,7 +76,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Detect changed paths
|
- name: Detect changed paths
|
||||||
id: detect
|
id: detect
|
||||||
env:
|
env:
|
||||||
@@ -84,13 +92,17 @@ jobs:
|
|||||||
needs: [quality, detect-changes]
|
needs: [quality, detect-changes]
|
||||||
if: needs.detect-changes.outputs.user-facing-changed == 'true'
|
if: needs.detect-changes.outputs.user-facing-changed == 'true'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-full:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-release
|
run: make setup-image
|
||||||
- name: Release dry-run validation
|
- name: Release dry-run validation
|
||||||
env:
|
env:
|
||||||
PYTHONPATH: src
|
PYTHONPATH: src
|
||||||
@@ -102,11 +114,15 @@ jobs:
|
|||||||
pr-review:
|
pr-review:
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Run automated PR review
|
- name: Run automated PR review
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
@@ -129,14 +145,18 @@ jobs:
|
|||||||
needs.quality.result == 'success' &&
|
needs.quality.result == 'success' &&
|
||||||
needs.pr-review.result == 'success'
|
needs.pr-review.result == 'success'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
token: ${{ secrets.REPO_TOKEN }}
|
token: ${{ secrets.REPO_TOKEN }}
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Squash merge with task ID
|
- name: Squash merge with task ID
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
|
|||||||
@@ -33,7 +33,11 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
detect-type:
|
detect-type:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
outputs:
|
outputs:
|
||||||
is-release: ${{ steps.check.outputs.is-release }}
|
is-release: ${{ steps.check.outputs.is-release }}
|
||||||
steps:
|
steps:
|
||||||
@@ -41,7 +45,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Check if this is a release commit
|
- name: Check if this is a release commit
|
||||||
id: check
|
id: check
|
||||||
env:
|
env:
|
||||||
@@ -54,13 +58,17 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: needs.detect-type.outputs.is-release == 'false'
|
if: needs.detect-type.outputs.is-release == 'false'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Validate latest commit message
|
- name: Validate latest commit message
|
||||||
env:
|
env:
|
||||||
PYTHONPATH: src
|
PYTHONPATH: src
|
||||||
@@ -74,7 +82,11 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: needs.detect-type.outputs.is-release == 'false'
|
if: needs.detect-type.outputs.is-release == 'false'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-full:latest
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
outputs:
|
outputs:
|
||||||
tag: ${{ steps.release-tag.outputs.tag }}
|
tag: ${{ steps.release-tag.outputs.tag }}
|
||||||
steps:
|
steps:
|
||||||
@@ -85,7 +97,7 @@ jobs:
|
|||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
run: make setup-release
|
run: make setup-image
|
||||||
- name: Configure git
|
- name: Configure git
|
||||||
run: |
|
run: |
|
||||||
git config user.name "devx-ci-bot"
|
git config user.name "devx-ci-bot"
|
||||||
@@ -123,7 +135,11 @@ jobs:
|
|||||||
needs: [release]
|
needs: [release]
|
||||||
if: needs.release.outputs.tag != ''
|
if: needs.release.outputs.tag != ''
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-full:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -131,7 +147,7 @@ jobs:
|
|||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
run: make setup-release
|
run: make setup-image
|
||||||
- name: Build and publish release
|
- name: Build and publish release
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
@@ -158,13 +174,17 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: needs.detect-type.outputs.is-release == 'false'
|
if: needs.detect-type.outputs.is-release == 'false'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Sync documentation to wiki
|
- name: Sync documentation to wiki
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
@@ -189,7 +209,11 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: always()
|
if: always()
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-quality:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -201,7 +225,7 @@ jobs:
|
|||||||
git fetch origin master
|
git fetch origin master
|
||||||
git reset --hard origin/master
|
git reset --hard origin/master
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Generate and push badges
|
- name: Generate and push badges
|
||||||
env:
|
env:
|
||||||
PRE_COMMIT_ALLOW_NO_CONFIG: "1"
|
PRE_COMMIT_ALLOW_NO_CONFIG: "1"
|
||||||
@@ -225,13 +249,17 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: needs.detect-type.outputs.is-release == 'false'
|
if: needs.detect-type.outputs.is-release == 'false'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Update Vikunja task
|
- name: Update Vikunja task
|
||||||
env:
|
env:
|
||||||
VIKUNJA_TOKEN: ${{ secrets.VIKUNJA_TOKEN }}
|
VIKUNJA_TOKEN: ${{ secrets.VIKUNJA_TOKEN }}
|
||||||
@@ -257,11 +285,15 @@ jobs:
|
|||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
if: needs.detect-type.outputs.is-release == 'false'
|
if: needs.detect-type.outputs.is-release == 'false'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container: git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-base:latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: make setup-ci
|
run: make setup-image
|
||||||
- name: Ensure branch protection and labels
|
- name: Ensure branch protection and labels
|
||||||
env:
|
env:
|
||||||
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Hadolint configuration for devx Dockerfiles
|
||||||
|
# https://github.com/hadolint/hadolint#configure
|
||||||
|
|
||||||
|
ignored:
|
||||||
|
- DL3008 # Don't require pinning apt package versions
|
||||||
|
- DL3013 # Don't require pinning pip package versions
|
||||||
|
- DL3018 # Don't require pinning apk package versions
|
||||||
|
- DL3007 # Using latest is intentional for tier images (rebuilt on every merge)
|
||||||
|
- SC2102 # False positive: pip extras [release,molecule,deploy] look like shell ranges
|
||||||
|
|
||||||
|
trustedRegistries:
|
||||||
|
- git.oblachno.oblachno.fyi
|
||||||
|
- docker.io
|
||||||
|
- gitea/runner-images
|
||||||
@@ -2,6 +2,14 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [0.20.3] - 2026-06-27
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Release publish failures and duplicate release commits
|
||||||
|
|
||||||
|
## [0.20.2] - 2026-06-27
|
||||||
|
|
||||||
## [0.20.2] - 2026-06-27
|
## [0.20.2] - 2026-06-27
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.PHONY: all setup setup-ci setup-quality setup-release setup-image install update lint lint-all test test-unit pytest-cov clean install-tools install-hooks activate-scripts checkmake check-mutable-globals check-dep-docs check-test-speed build-images push-images build-images-dry-run clean-images
|
.PHONY: all setup setup-ci setup-quality setup-release setup-image install update lint lint-all lint-dockerfiles test test-unit pytest-cov clean install-tools install-hooks activate-scripts checkmake check-mutable-globals check-dep-docs check-test-speed build-images push-images build-images-dry-run clean-images
|
||||||
|
|
||||||
PYTHON := python3
|
PYTHON := python3
|
||||||
VENV := .venv
|
VENV := .venv
|
||||||
@@ -25,10 +25,10 @@ setup-quality: $(VENV)/bin/activate .env install-tools
|
|||||||
|
|
||||||
# Setup for release jobs (needs git-cliff, tea, lint tools)
|
# Setup for release jobs (needs git-cliff, tea, lint tools)
|
||||||
setup-release: $(VENV)/bin/activate .env
|
setup-release: $(VENV)/bin/activate .env
|
||||||
@$(BIN)/pip install -e '.[ci,lint]' 2>/dev/null; \
|
@$(BIN)/pip install -e '.[ci,lint,release]' 2>/dev/null; \
|
||||||
$(BIN)/python -m devx.tools.install_tools --tool git-cliff --tool tea; \
|
$(BIN)/python -m devx.tools.install_tools --tool git-cliff --tool tea; \
|
||||||
export PATH="$(HOME)/.local/bin:$$PATH"; \
|
export PATH="$(HOME)/.local/bin:$$PATH"; \
|
||||||
$(BIN)/python -m devx.tools.setup --bin "$(BIN)" --extras "ci,lint" --no-pre-commit
|
$(BIN)/python -m devx.tools.setup --bin "$(BIN)" --extras "ci,lint,release" --no-pre-commit
|
||||||
|
|
||||||
# Setup for pre-built image jobs (deps already in image, just link venv + install project)
|
# Setup for pre-built image jobs (deps already in image, just link venv + install project)
|
||||||
setup-image:
|
setup-image:
|
||||||
@@ -96,9 +96,18 @@ create-pr: devx-create-pr
|
|||||||
push-with-pr: devx-push-with-pr
|
push-with-pr: devx-push-with-pr
|
||||||
git-push: devx-push
|
git-push: devx-push
|
||||||
|
|
||||||
lint-all: lint workflow-lint
|
lint-all: lint workflow-lint lint-dockerfiles
|
||||||
@echo "[lint-all] All linting checks passed."
|
@echo "[lint-all] All linting checks passed."
|
||||||
|
|
||||||
|
lint-dockerfiles:
|
||||||
|
@echo "[lint-dockerfiles] Linting Dockerfiles with hadolint..."
|
||||||
|
@if command -v hadolint >/dev/null 2>&1; then \
|
||||||
|
find docker -name 'Dockerfile*' -exec hadolint {} +; \
|
||||||
|
echo "[lint-dockerfiles] All Dockerfiles passed."; \
|
||||||
|
else \
|
||||||
|
echo "[lint-dockerfiles] hadolint not found — skipping (install with: pip install hadolint or download from GitHub)"; \
|
||||||
|
fi
|
||||||
|
|
||||||
test-unit: devx-test-unit
|
test-unit: devx-test-unit
|
||||||
|
|
||||||
pytest-cov: devx-pytest-cov
|
pytest-cov: devx-pytest-cov
|
||||||
|
|||||||
@@ -16,12 +16,12 @@ quality badges.
|
|||||||
|
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
||||||
[](https://www.python.org/downloads/)
|
[](https://www.python.org/downloads/)
|
||||||
|
|
||||||
## Why devx?
|
## Why devx?
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
FROM git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-quality:latest
|
FROM git.oblachno.oblachno.fyi/oblachno-oss/runner-images/ci-quality:latest
|
||||||
|
|
||||||
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
# Install devx[release,molecule,deploy] from local source
|
# Install devx[release,molecule,deploy] from local source
|
||||||
COPY . /tmp/devx
|
COPY . /tmp/devx
|
||||||
RUN pip install --no-cache-dir /tmp/devx[release,molecule,deploy] \
|
RUN pip install --no-cache-dir /tmp/devx[release,molecule,deploy] \
|
||||||
|
|||||||
@@ -15,3 +15,8 @@ RUN pip install --no-cache-dir /tmp/devx[lint] \
|
|||||||
# Install CI/CD binary tools
|
# Install CI/CD binary tools
|
||||||
RUN python3 -m devx.tools.install_tools --tool actionlint \
|
RUN python3 -m devx.tools.install_tools --tool actionlint \
|
||||||
&& python3 -m devx.tools.install_checkmake
|
&& python3 -m devx.tools.install_checkmake
|
||||||
|
|
||||||
|
# Install hadolint (Dockerfile linter)
|
||||||
|
RUN curl -fsSL "https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64" \
|
||||||
|
-o /usr/local/bin/hadolint \
|
||||||
|
&& chmod +x /usr/local/bin/hadolint
|
||||||
|
|||||||
+6
-6
@@ -12,12 +12,12 @@ project to be reusable across all oblachno-oss repositories.
|
|||||||
|
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
||||||
[](https://www.python.org/downloads/)
|
[](https://www.python.org/downloads/)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""devx — reusable development and CI/CD tools for oblachno-oss projects."""
|
"""devx — reusable development and CI/CD tools for oblachno-oss projects."""
|
||||||
|
|
||||||
__version__ = "0.20.2"
|
__version__ = "0.20.3"
|
||||||
|
|||||||
@@ -669,6 +669,20 @@ def main(dry_run: bool, skip_tests: bool, verify: bool) -> None:
|
|||||||
return
|
return
|
||||||
|
|
||||||
current_tag = get_latest_tag()
|
current_tag = get_latest_tag()
|
||||||
|
# If the bumped version equals the current tag version, there's nothing
|
||||||
|
# new to release. git-cliff didn't bump because the commits since the last
|
||||||
|
# tag don't warrant a version change (e.g., only ci:/chore: commits).
|
||||||
|
# Creating a release commit with the same version would cause a tag
|
||||||
|
# conflict.
|
||||||
|
if current_tag and current_tag.lstrip("v") == new_version:
|
||||||
|
click.echo(
|
||||||
|
_(
|
||||||
|
"Version stays at v{version} — no version bump from git-cliff. "
|
||||||
|
"Commits since last tag don't warrant a new release. Skipping.",
|
||||||
|
version=new_version,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return
|
||||||
click.echo(
|
click.echo(
|
||||||
_(
|
_(
|
||||||
"Bumping version: {current} -> v{new_version}",
|
"Bumping version: {current} -> v{new_version}",
|
||||||
|
|||||||
@@ -1990,5 +1990,13 @@
|
|||||||
"pl": "{file} już istnieje. Użyj --force, aby nadpisać.",
|
"pl": "{file} już istnieje. Użyj --force, aby nadpisać.",
|
||||||
"ru": "{file} already exists. Use --force to overwrite.",
|
"ru": "{file} already exists. Use --force to overwrite.",
|
||||||
"zh": "{file} already exists. Use --force to overwrite."
|
"zh": "{file} already exists. Use --force to overwrite."
|
||||||
|
},
|
||||||
|
"Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.": {
|
||||||
|
"bg": "",
|
||||||
|
"de": "",
|
||||||
|
"en": "Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.",
|
||||||
|
"pl": "",
|
||||||
|
"ru": "",
|
||||||
|
"zh": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1207,7 +1207,7 @@ class TestMain:
|
|||||||
@patch("devx.ci.release.update_init_version")
|
@patch("devx.ci.release.update_init_version")
|
||||||
@patch("devx.ci.release.get_changelog", return_value="changelog")
|
@patch("devx.ci.release.get_changelog", return_value="changelog")
|
||||||
@patch("devx.ci.release.get_latest_tag", return_value="v0.1.0")
|
@patch("devx.ci.release.get_latest_tag", return_value="v0.1.0")
|
||||||
@patch("devx.ci.release.get_bumped_version", return_value="0.1.0")
|
@patch("devx.ci.release.get_bumped_version", return_value="0.2.0")
|
||||||
@patch("devx.ci.release.has_unreleased_changes", return_value=True)
|
@patch("devx.ci.release.has_unreleased_changes", return_value=True)
|
||||||
@patch("devx.ci.release.run_cmd")
|
@patch("devx.ci.release.run_cmd")
|
||||||
def test_full_flow_tag_exists(
|
def test_full_flow_tag_exists(
|
||||||
@@ -1232,7 +1232,33 @@ class TestMain:
|
|||||||
result = runner.invoke(main, [])
|
result = runner.invoke(main, [])
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert "already existed" in result.output
|
assert "already existed" in result.output
|
||||||
mock_tag.assert_called_once_with("0.1.0", "changelog", False)
|
mock_tag.assert_called_once_with("0.2.0", "changelog", False)
|
||||||
|
|
||||||
|
@patch.dict("os.environ", {})
|
||||||
|
@patch("devx.ci.release.verify_tag_consistency", return_value=[])
|
||||||
|
@patch("devx.ci.release.fetch_tags")
|
||||||
|
@patch("devx.ci.release.has_user_facing_changes", return_value=True)
|
||||||
|
@patch("devx.ci.release.get_latest_tag", return_value="v0.1.0")
|
||||||
|
@patch("devx.ci.release.get_bumped_version", return_value="0.1.0")
|
||||||
|
@patch("devx.ci.release.has_unreleased_changes", return_value=True)
|
||||||
|
@patch("devx.ci.release.run_cmd")
|
||||||
|
def test_skips_when_version_doesnt_bump(
|
||||||
|
self,
|
||||||
|
mock_run_cmd: MagicMock,
|
||||||
|
mock_has: MagicMock,
|
||||||
|
mock_bumped: MagicMock,
|
||||||
|
mock_latest: MagicMock,
|
||||||
|
mock_user: MagicMock,
|
||||||
|
mock_ft: MagicMock,
|
||||||
|
mock_vtc: MagicMock,
|
||||||
|
) -> None:
|
||||||
|
"""Release is skipped when git-cliff doesn't bump the version."""
|
||||||
|
mock_run_cmd.return_value = MagicMock(returncode=0, stdout="master\n", stderr="")
|
||||||
|
runner = CliRunner()
|
||||||
|
result = runner.invoke(main, [])
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "no version bump" in result.output
|
||||||
|
assert "Skipping" in result.output
|
||||||
|
|
||||||
@patch.dict("os.environ", {})
|
@patch.dict("os.environ", {})
|
||||||
@patch("devx.ci.release.verify_tag_consistency", return_value=[])
|
@patch("devx.ci.release.verify_tag_consistency", return_value=[])
|
||||||
|
|||||||
Reference in New Issue
Block a user