2 Commits

Author SHA1 Message Date
e1c218431a DEBUG REVERTME
All checks were successful
run tests / check (push) Successful in 25s
run tests / release (push) Successful in 19s
check if project is already released / unittest (push) Successful in 13s
2025-12-11 11:01:20 +01:00
c33b8aae0c WIP
All checks were successful
run tests / check (push) Successful in 27s
run tests / release (push) Successful in 19s
2025-12-11 10:56:28 +01:00
11 changed files with 92 additions and 27 deletions

View File

@@ -0,0 +1,11 @@
name: check if project is already released
on:
- pull_request
- push # TODO test
jobs:
unittest:
runs-on: action-runner
steps:
- uses: actions/checkout@v4
- uses: ./check-is-not-released

View File

@@ -67,6 +67,26 @@ jobs:
with: with:
configure_runner_environment: false configure_runner_environment: false
test-skip-release-if-already-released:
runs-on: action-runner
steps:
- uses: actions/checkout@v4
# skip login locally
- if: github.repository == 'actions/release'
uses: https://gitea.puzzleyou.net/actions/configure-runner-environment@master
- uses: ./declare
with:
configure_runner_environment: false
version_descriptor: test-assets/Cargo.toml
- uses: ./release
with:
configure_runner_environment: false
dry_run: true
sync_versions: false
test-declare-with-release-yaml: test-declare-with-release-yaml:
runs-on: action-runner runs-on: action-runner
steps: steps:
@@ -80,6 +100,7 @@ jobs:
with: with:
dry_run: true dry_run: true
configure_runner_environment: false configure_runner_environment: false
sync_versions: false
- run: set -u; echo "$RELEASE_PROJECT_CURRENT_VERSION" - run: set -u; echo "$RELEASE_PROJECT_CURRENT_VERSION"

View File

@@ -33,15 +33,11 @@ runs:
run: | run: |
set +e set +e
nix run ${{ github.action_path }} -- \ if [[ "$RELEASE_PROJECT_IS_RELEASED" = "1" ]]; then
dump \
--state "${RELEASE_ACTION_STATEFILE}" \
| grep "is already released: True"
IS_RELEASED_EXIT_CODE=$?
if [[ "$IS_RELEASED_EXIT_CODE" -eq 0 ]]; then
VERSION="$RELEASE_PROJECT_CURRENT_VERSION" VERSION="$RELEASE_PROJECT_CURRENT_VERSION"
echo "Project is already released with version ${VERSION}." echo "Project is already released with version ${VERSION}."
echo "You should increment the project version."
echo "If you don't, then the project will not be released."
exit -1 exit -1
else else
echo "Project is not yet released." echo "Project is not yet released."

View File

@@ -104,6 +104,11 @@ runs:
- name: declare release project - name: declare release project
run: | run: |
if [[ ! -z "${RELEASE_PROJECT_CURRENT_VERSION}" ]]; then
echo "already set up."
exit 0
fi
nix run ${{ github.action_path }} -- \ nix run ${{ github.action_path }} -- \
declare \ declare \
--release-yaml-filename "${{ inputs.filename }}" \ --release-yaml-filename "${{ inputs.filename }}" \

View File

@@ -34,7 +34,10 @@ test-workflows:
--image "-self-hosted" \ --image "-self-hosted" \
--event pull_request \ --event pull_request \
--workflows ./.gitea/workflows/check.yaml \ --workflows ./.gitea/workflows/check.yaml \
--job test-sync-versions --job test-skip-release-if-already-released
# TODO act_runner exec \
# --image "europe-docker.pkg.dev/puzzle-and-play/docker/action-runner-job:latest" \ --image "-self-hosted" \
--event pull_request \
--workflows ./.gitea/workflows/check.yaml \
--job test-sync-versions

View File

@@ -18,7 +18,7 @@ inputs:
sync_versions: sync_versions:
required: false required: false
default: false default: true
runs: runs:
using: composite using: composite
@@ -43,18 +43,28 @@ runs:
--release-commit-sha "${{ github.sha }}" \ --release-commit-sha "${{ github.sha }}" \
--write-env-vars-to-filename "$GITHUB_ENV" --write-env-vars-to-filename "$GITHUB_ENV"
- name: check if already released
id: check_released
run: |
if [[ "$RELEASE_PROJECT_IS_RELEASED" == "1" ]] && [[ "$RELEASE_IS_PRERELEASE" == "0" ]]; then
echo "is_released=1" >> "$GITHUB_OUTPUT"
else
echo "is_released=0" >> "$GITHUB_OUTPUT"
fi
- name: sync versions - name: sync versions
if: inputs.sync_versions == 'true' if: ${{ steps.check_released.outputs.is_released == '0' && inputs.sync_versions == 'true' }}
run: | run: |
nix run ${{ github.action_path }} -- \ nix run ${{ github.action_path }} -- \
sync-versions \ sync-versions \
--state "${RELEASE_ACTION_STATEFILE}" --state "${RELEASE_ACTION_STATEFILE}"
- name: run build commands - name: run build commands
if: inputs.build_run != '' if: ${{ steps.check_released.outputs.is_released == '0' && inputs.build_run != '' }}
run: ${{ inputs.build_run }} run: ${{ inputs.build_run }}
- name: publish artefacts - name: publish artefacts
if: ${{ steps.check_released.outputs.is_released == '0' }}
run: | run: |
nix run ${{ github.action_path }} -- \ nix run ${{ github.action_path }} -- \
publish-artefacts \ publish-artefacts \
@@ -62,6 +72,7 @@ runs:
--dry-run "${{ inputs.dry_run }}" --dry-run "${{ inputs.dry_run }}"
- name: update deployments - name: update deployments
if: ${{ steps.check_released.outputs.is_released == '0' }}
run: | run: |
nix run ${{ github.action_path }} -- \ nix run ${{ github.action_path }} -- \
update-deployments \ update-deployments \
@@ -69,6 +80,7 @@ runs:
--dry-run "${{ inputs.dry_run }}" --dry-run "${{ inputs.dry_run }}"
- name: create release - name: create release
if: ${{ steps.check_released.outputs.is_released == '0' }}
run: | run: |
nix run ${{ github.action_path }} -- \ nix run ${{ github.action_path }} -- \
create-release \ create-release \

View File

@@ -2,5 +2,5 @@ from setuptools import setup
setup( setup(
name='release-action', name='release-action',
version='0.0.1.dev0', version='0.0.2',
) )

View File

@@ -262,7 +262,7 @@ class ProjectDescription:
if self.gitea_tool is None: if self.gitea_tool is None:
return None return None
return self.gitea_tool.is_released(self.planned_version) return self.gitea_tool.is_released(self.project_version)
@cached_property @cached_property
def gitea_tool(self): def gitea_tool(self):
@@ -302,6 +302,8 @@ class ProjectDescription:
str(self.project_version), str(self.project_version),
'RELEASE_PROJECT_PLANNED_VERSION': 'RELEASE_PROJECT_PLANNED_VERSION':
str(self.planned_version), str(self.planned_version),
'RELEASE_PROJECT_IS_RELEASED':
'1' if self.is_released else '0',
}] }]
)) ))

View File

@@ -9,6 +9,8 @@ from release.project import (DeploymentCondition, HelmRelease, HelmReleaseInfo,
SdistReleaseInfo, Tarball, TarballReleaseInfo, SdistReleaseInfo, Tarball, TarballReleaseInfo,
Wheel, WheelReleaseInfo) Wheel, WheelReleaseInfo)
DEFAULT_PACKAGE_OWNER = 'puzzleYOU'
class Cli: class Cli:
def __init__(self, dry_run: bool): def __init__(self, dry_run: bool):
@@ -66,8 +68,9 @@ def publish_tarball(info: TarballReleaseInfo, cli: Cli):
'--upload-file', info.filename, '--upload-file', info.filename,
'-i', '-i',
'-X', 'PUT', '-X', 'PUT',
'%s/api/packages/puzzleYOU/generic/%s/%s/%s' % ( # TODO owner '%s/api/packages/%s/generic/%s/%s/%s' % (
info.repository, info.repository,
DEFAULT_PACKAGE_OWNER,
info.package_name, info.package_name,
info.version_str, info.version_str,
path.basename(info.filename))) path.basename(info.filename)))
@@ -147,19 +150,19 @@ def update_helm_release(info: HelmReleaseInfo, cli: Cli):
'--version', chart_version, '--version', chart_version,
'-d', td) '-d', td)
chart_filename = '%s/%s-%s.tgz' % (td, chart_name, chart_version) chart_filename = '%s/%s-%s.tgz' % (td, chart_name, chart_version)
value_overrides = ','.join( value_overrides = ','.join(
map(lambda t: '%s=%s' % (t, info.image_tag), info.image_paths)) map(lambda t: '%s=%s' % (t, info.image_tag), info.image_paths))
cli('helm', cli('helm',
'upgrade', info.release_name, 'upgrade', info.release_name,
chart_filename, chart_filename,
'--version', chart_version, '--version', chart_version,
'--namespace', info.namespace, '--namespace', info.namespace,
'--reuse-values', '--reuse-values',
'--set', value_overrides, '--set', value_overrides,
'--timeout', info.timeout) '--timeout', info.timeout)
def update_deployments(project: ProjectDescription, dry_run: bool = False): def update_deployments(project: ProjectDescription, dry_run: bool = False):

View File

@@ -1,5 +1,6 @@
from os import path from os import path
from unittest import TestCase from unittest import TestCase
from unittest.mock import patch
import yaml import yaml
from semver import Version from semver import Version
@@ -14,6 +15,14 @@ from release.project import (ArtefactDescription, DeploymentCondition,
WheelReleaseInfo, parse_project_description) WheelReleaseInfo, parse_project_description)
class MockGiteaTool:
def __init__(self, *args, **kwargs):
pass
def is_released(self, version):
return False
class TestProjectDescription(TestCase): class TestProjectDescription(TestCase):
def test_can_describe_projects(self): def test_can_describe_projects(self):
# resi-lib # resi-lib
@@ -136,6 +145,7 @@ class TestProjectDescription(TestCase):
namespace='prngl-testing')) namespace='prngl-testing'))
]) ])
@patch('release.project.toolkit.Gitea', MockGiteaTool)
def test_environment_variables(self): def test_environment_variables(self):
# motacilla # motacilla
desc = ProjectDescription( desc = ProjectDescription(
@@ -184,6 +194,7 @@ class TestProjectDescription(TestCase):
'RELEASE_IMAGE_LOCAL_NAME_MOTACILLA_CDN': 'RELEASE_IMAGE_LOCAL_NAME_MOTACILLA_CDN':
'motacilla-cdn:0AB123', 'motacilla-cdn:0AB123',
'RELEASE_IS_PRERELEASE': '1', 'RELEASE_IS_PRERELEASE': '1',
'RELEASE_PROJECT_IS_RELEASED': '0',
'RELEASE_PROJECT_CURRENT_VERSION': '2.10.4', 'RELEASE_PROJECT_CURRENT_VERSION': '2.10.4',
'RELEASE_PROJECT_PLANNED_VERSION': '2.10.4-dev42' 'RELEASE_PROJECT_PLANNED_VERSION': '2.10.4-dev42'
} }

View File

@@ -47,6 +47,7 @@ class Structured:
for part in item_path: for part in item_path:
cur = cur[part] cur = cur[part]
self.filename = filename
self.format = format self.format = format
self.item_path = item_path self.item_path = item_path
self.content = obj self.content = obj