|
| 1 | +name: Validate Version |
| 2 | + |
| 3 | +description: >- |
| 4 | + Validates and extracts version from git tags or workflow inputs. |
| 5 | + Supports semantic versioning validation. |
| 6 | +
|
| 7 | +inputs: |
| 8 | + allow-prerelease: |
| 9 | + description: Allow pre-release versions (for example, 1.0.0-beta.1). |
| 10 | + default: "false" |
| 11 | + required: false |
| 12 | + input-version: |
| 13 | + description: Manual version input (from workflow_dispatch). |
| 14 | + required: false |
| 15 | + |
| 16 | +outputs: |
| 17 | + is_prerelease: |
| 18 | + description: Whether this is a pre-release version. |
| 19 | + value: ${{ steps.validate.outputs.is_prerelease }} |
| 20 | + should_build: |
| 21 | + description: Whether the build should proceed. |
| 22 | + value: ${{ steps.validate.outputs.should_build }} |
| 23 | + source: |
| 24 | + description: Source of the version (tag, manual, or none). |
| 25 | + value: ${{ steps.validate.outputs.source }} |
| 26 | + version: |
| 27 | + description: Extracted and validated version. |
| 28 | + value: ${{ steps.validate.outputs.version }} |
| 29 | + |
| 30 | +runs: |
| 31 | + using: composite |
| 32 | + steps: |
| 33 | + - name: Extract and validate version |
| 34 | + id: validate |
| 35 | + shell: bash |
| 36 | + env: |
| 37 | + ALLOW_PRERELEASE: ${{ inputs.allow-prerelease }} |
| 38 | + EVENT_DISPATCH: ${{ github.event_name == 'workflow_dispatch' }} |
| 39 | + EVENT_NAME: ${{ github.event_name }} |
| 40 | + INPUT_VERSION: ${{ inputs.input-version }} |
| 41 | + REF_NAME: ${{ github.ref_name }} |
| 42 | + run: | |
| 43 | + set -Eeuo pipefail |
| 44 | +
|
| 45 | + VERSION="" |
| 46 | + SHOULD_BUILD="false" |
| 47 | + IS_PRERELEASE="false" |
| 48 | + SOURCE="none" |
| 49 | +
|
| 50 | + # Extract version based on trigger |
| 51 | + if [[ "${REF_NAME:-}" == v* ]]; then |
| 52 | + # From git tag |
| 53 | + VERSION="${REF_NAME#v}" |
| 54 | + SOURCE="tag" |
| 55 | + echo "📍 Version from tag: $VERSION" |
| 56 | + elif [[ "$EVENT_DISPATCH" == "true" && -n "$INPUT_VERSION" ]]; then |
| 57 | + # From manual input |
| 58 | + VERSION="$INPUT_VERSION" |
| 59 | + SOURCE="manual" |
| 60 | + echo "📍 Version from manual input: $VERSION" |
| 61 | + else |
| 62 | + echo "⚠️ No version source found" |
| 63 | + echo "version=" >> "$GITHUB_OUTPUT" |
| 64 | + echo "should_build=false" >> "$GITHUB_OUTPUT" |
| 65 | + echo "is_prerelease=false" >> "$GITHUB_OUTPUT" |
| 66 | + echo "source=none" >> "$GITHUB_OUTPUT" |
| 67 | + exit 0 |
| 68 | + fi |
| 69 | +
|
| 70 | + # Validate semantic version patterns |
| 71 | + SEMVER_REGEX="^[0-9]+\.[0-9]+\.[0-9]+$" |
| 72 | + PRERELEASE_REGEX="^[0-9]+\.[0-9]+\.[0-9]+-.+$" |
| 73 | +
|
| 74 | + if [[ "$VERSION" =~ $SEMVER_REGEX ]]; then |
| 75 | + # Valid stable version |
| 76 | + SHOULD_BUILD="true" |
| 77 | + IS_PRERELEASE="false" |
| 78 | + echo "✅ Valid stable version: $VERSION" |
| 79 | + elif [[ "$ALLOW_PRERELEASE" == "true" ]] && \ |
| 80 | + [[ "$VERSION" =~ $PRERELEASE_REGEX ]]; then |
| 81 | + # Valid pre-release version |
| 82 | + SHOULD_BUILD="true" |
| 83 | + IS_PRERELEASE="true" |
| 84 | + echo "✅ Valid pre-release version: $VERSION" |
| 85 | + else |
| 86 | + # Invalid version format |
| 87 | + SHOULD_BUILD="false" |
| 88 | + echo "❌ Invalid version format: $VERSION" |
| 89 | + echo "Expected: X.Y.Z or X.Y.Z-suffix (if prerelease allowed)" |
| 90 | + fi |
| 91 | +
|
| 92 | + if [[ "$IS_PRERELEASE" == "true" ]]; then |
| 93 | + TYPE="Pre-release" |
| 94 | + else |
| 95 | + TYPE="Stable" |
| 96 | + fi |
| 97 | +
|
| 98 | + if [[ "$SHOULD_BUILD" == "true" ]]; then |
| 99 | + BUILD_STATUS="✅ Yes" |
| 100 | + else |
| 101 | + BUILD_STATUS="❌ No" |
| 102 | + fi |
| 103 | +
|
| 104 | + # Output results |
| 105 | + echo "version=$VERSION" >> "$GITHUB_OUTPUT" |
| 106 | + echo "should_build=$SHOULD_BUILD" >> "$GITHUB_OUTPUT" |
| 107 | + echo "is_prerelease=$IS_PRERELEASE" >> "$GITHUB_OUTPUT" |
| 108 | + echo "source=$SOURCE" >> "$GITHUB_OUTPUT" |
| 109 | +
|
| 110 | + # Summary for GitHub Actions UI |
| 111 | + { |
| 112 | + echo "### 🏷️ Version Validation" |
| 113 | + echo "- **Version:** \`$VERSION\`" |
| 114 | + echo "- **Source:** $SOURCE" |
| 115 | + echo "- **Type:** $TYPE" |
| 116 | + echo "- **Should Build:** $BUILD_STATUS" |
| 117 | + } >> "$GITHUB_STEP_SUMMARY" |
0 commit comments