diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..09892a9 --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,108 @@ +name: Auto Release + +on: + push: + tags: + - 'v*' + +permissions: + contents: write + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + id: get_tag + shell: bash + run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + + - name: Get base version + id: get_base_version + shell: bash + run: | + BASE_VERSION=$(echo ${{ steps.get_tag.outputs.TAG }} | cut -d. -f1) + echo "BASE_VERSION=${BASE_VERSION}" >> $GITHUB_OUTPUT + + - name: Get previous tag + id: get_previous_tag + shell: bash + run: | + PREVIOUS_TAG=$(git describe --tags --abbrev=0 ${{ steps.get_tag.outputs.TAG }}^ || echo "") + echo "PREVIOUS_TAG=${PREVIOUS_TAG}" >> $GITHUB_OUTPUT + + - name: Generate changelog + id: generate_changelog + shell: bash + run: | + if [ -n "${{ steps.get_previous_tag.outputs.PREVIOUS_TAG }}" ]; then + CHANGELOG=$(git log --pretty=format:"- %s" ${{ steps.get_previous_tag.outputs.PREVIOUS_TAG }}..${{ steps.get_tag.outputs.TAG }}) + else + CHANGELOG=$(git log --pretty=format:"- %s" ${{ steps.get_tag.outputs.TAG }}) + fi + echo "CHANGELOG<> $GITHUB_OUTPUT + echo "$CHANGELOG" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Create or Update Base Release + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const baseVersion = '${{ steps.get_base_version.outputs.BASE_VERSION }}'; + const fullVersion = '${{ steps.get_tag.outputs.TAG }}'; + const changelog = `${{ steps.generate_changelog.outputs.CHANGELOG }}`; + + try { + // Try to get the existing release + await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag: baseVersion + }); + + // If it exists, update it + await github.rest.repos.updateRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: release.data.id, + tag_name: baseVersion, + name: `Base Release ${baseVersion}`, + body: `This is the base release for ${baseVersion}. Latest version: ${fullVersion}\n\nChangelog:\n${changelog}`, + draft: false, + prerelease: false + }); + } catch (error) { + if (error.status === 404) { + // If it doesn't exist, create it + await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: baseVersion, + name: `Base Release ${baseVersion}`, + body: `This is the base release for ${baseVersion}. Latest version: ${fullVersion}\n\nChangelog:\n${changelog}`, + draft: false, + prerelease: false + }); + } else { + throw error; + } + } + + - name: Create Full Version Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.get_tag.outputs.TAG }} + release_name: Release ${{ steps.get_tag.outputs.TAG }} + body: | + Changes in this Release: + ${{ steps.generate_changelog.outputs.CHANGELOG }} + draft: false + prerelease: false diff --git a/action.yml b/action.yml index 847a1f5..8d09664 100644 --- a/action.yml +++ b/action.yml @@ -29,6 +29,7 @@ runs: ref: ${{ inputs.dev_branch }} - name: Set up Git + shell: bash run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com"