Skip to content

Build and Release with Semantic Version #37

Build and Release with Semantic Version

Build and Release with Semantic Version #37

name: Build and Release with Semantic Version
on:
push:
branches:
- dev
- main
jobs:
build-and-release:
runs-on: ubuntu-latest
steps:
# ------------------------------------------------
# 1. Клонуємо репозиторій
# ------------------------------------------------
- name: Checkout
uses: actions/checkout@v3
# ------------------------------------------------
# 2. Встановлюємо Java (для Gradle)
# ------------------------------------------------
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
# ------------------------------------------------
# 3. Semantic Versioning (PaulHatch/semantic-version)
# ------------------------------------------------
- name: Determine Version
id: version
uses: PaulHatch/[email protected]
with:
tag_prefix: v
major_pattern: /BREAKING CHANGE|feat!/
minor_pattern: /feat:/
default_version: '0.1.0'
search_commit_body: false
bump_version: true # Автоматичне збільшення версії
# ------------------------------------------------
# 4. Формуємо тег і назву JAR (BirthDay-%version%)
# залежно від гілки (dev => -dev)
# ------------------------------------------------
- name: Prepare Tag Variables
id: prepare_tag
run: |
BRANCH_NAME="${GITHUB_REF_NAME}" # "dev" або "main"
RAW_VERSION="${{ steps.version.outputs.version }}" # Напр.: "1.2.3"
TAG_PREFIX="v" # Префікс для тегу, який визначили вище.
if [ "$BRANCH_NAME" = "dev" ]; then
# Пререліз для dev
NEW_TAG="${TAG_PREFIX}${RAW_VERSION}-dev"
IS_PRERELEASE="true"
# Наприклад, BirthDay-1.2.3-dev.jar
JAR_NAME="BirthDay-${RAW_VERSION}-dev.jar"
RELEASE_NAME="Dev Release BirthDay ${RAW_VERSION}"
else
# Стабільна версія (main)
NEW_TAG="${TAG_PREFIX}${RAW_VERSION}"
IS_PRERELEASE="false"
# Наприклад, BirthDay-1.2.3.jar
JAR_NAME="BirthDay-${RAW_VERSION}.jar"
RELEASE_NAME="Release BirthDay ${RAW_VERSION}"
fi
echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
echo "is_prerelease=$IS_PRERELEASE" >> $GITHUB_OUTPUT
echo "jar_name=$JAR_NAME" >> $GITHUB_OUTPUT
echo "release_name=$RELEASE_NAME" >> $GITHUB_OUTPUT
# ------------------------------------------------
# 5. Збираємо проєкт (Gradle)
# ------------------------------------------------
- name: Build with Gradle
run: ./gradlew shadowJar
# ------------------------------------------------
# 6. Перейменовуємо JAR (замість my-plugin => BirthDay)
# ------------------------------------------------
- name: Rename JAR
run: |
FILE=$(find build/libs -name '*.jar' | head -n 1)
if [ -z "$FILE" ]; then
echo "No JAR file found!"
exit 1
fi
mv "$FILE" "build/libs/${{ steps.prepare_tag.outputs.jar_name }}"
echo "Renamed to ${{ steps.prepare_tag.outputs.jar_name }}"
# ------------------------------------------------
# 7. (Необов'язково) Створюємо та пушимо новий тег
# ------------------------------------------------
- name: Create and Push Tag
run: |
NEW_TAG="${{ steps.prepare_tag.outputs.new_tag }}"
echo "Creating and pushing tag: $NEW_TAG"
git config user.name "github-actions"
git config user.email "[email protected]"
git tag "$NEW_TAG" -m "Auto-bumped to $NEW_TAG"
git push origin "$NEW_TAG"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# ------------------------------------------------
# 8. Створюємо GitHub Release
# ------------------------------------------------
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1
with:
tag_name: ${{ steps.prepare_tag.outputs.new_tag }}
release_name: ${{ steps.prepare_tag.outputs.release_name }}
body: |
**Автоматичний реліз** з гілки `${{ github.ref_name }}`
Версія: `${{ steps.version.outputs.version }}`
(за версією semantic-version): `${{ steps.version.outputs.version_type }}`
JAR: `${{ steps.prepare_tag.outputs.jar_name }}`
draft: false
prerelease: ${{ steps.prepare_tag.outputs.is_prerelease }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# ------------------------------------------------
# 9. Завантажуємо JAR у реліз
# ------------------------------------------------
- name: Upload Plugin JAR
uses: actions/upload-release-asset@v1
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: build/libs/${{ steps.prepare_tag.outputs.jar_name }}
asset_name: ${{ steps.prepare_tag.outputs.jar_name }}
asset_content_type: application/java-archive
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}