diff --git a/.github/workflows/automated_release.yml b/.github/workflows/automated_release.yml new file mode 100644 index 0000000000..8144c5fc90 --- /dev/null +++ b/.github/workflows/automated_release.yml @@ -0,0 +1,86 @@ +name: Automated Release + +on: + push: + branches: + - main + +jobs: + check-and-release: + runs-on: ubuntu-latest + + steps: + # Checkout + - name: Checkout code + uses: actions/checkout@v3 + + # Get the latest release version + - name: Get latest release version + id: get_latest_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + latest_release=$(gh release list --limit 1 --json tagName --jq '.[0].tagName' || echo "v0.0.0") + echo "latest_release=${latest_release}" >> $GITHUB_ENV + echo "latest_release=${latest_release}" + + # Extract version from _RELEASE_VERSION constant in main.py + - name: Extract version from main.py + id: get_file_version + run: | + file_version=$(grep '_RELEASE_VERSION' src/backend/main.py | sed -E 's/.*"([^"]+)".*/\1/') + echo "file_version=${file_version}" >> $GITHUB_ENV + echo "file_version=${file_version}" + + # Check if new version is greater + - name: Check if new version is greater + id: check_version + run: | + latest_version_number=$(echo "$latest_release" | sed 's/^v//') + file_version_number=$(echo "$file_version" | sed 's/^v//') + # Get major, minor, and patch from the versions + IFS='.' read -r l_major l_minor l_patch <<<"$latest_version_number" + IFS='.' read -r f_major f_minor f_patch <<<"$file_version_number" + + # Compare major, minor, and patch versions + if [ "$f_major" -gt "$l_major" ] || + ([ "$f_major" -eq "$l_major" ] && [ "$f_minor" -gt "$l_minor" ]) || + ([ "$f_major" -eq "$l_major" ] && [ "$f_minor" -eq "$l_minor" ] && [ "$f_patch" -gt "$l_patch" ]); then + echo "new_version_needed=true" >> $GITHUB_ENV + echo "NEED TO CREATE A NEW RELEASE" + else + echo "new_version_needed=false" >> $GITHUB_ENV + echo "NO NEED TO CREATE A NEW RELEASE" + exit 0 + fi + + # Changelog generation + - name: Generate pull request changelog + id: generate_changelog + run: | + echo "Generating changelog from ${{ env.latest_release }} to ${{ env.file_version }}..." + changelog=$(gh pr list --state merged --base main --search "merged:>${{ env.latest_release }}" --json title --jq '.[].title') + if [[ -z "$changelog" ]]; then + echo "No pull requests found since the last release." + echo "changelog=No changes since the last release." >> $GITHUB_ENV + else + echo "Changelog:" + echo "$changelog" + echo "changelog=$changelog" >> $GITHUB_ENV + fi + + # Create a new release if the version is greater + - name: Create new release + if: env.new_version_needed == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + release_date=$(date +'%Y-%m-%d') + release_title="${release_date} (${file_version})" + description="**Full Changelog**: https://github.com/${GITHUB_REPOSITORY}/compare/${latest_release}...${file_version}" + echo "Creating release with title: $release_title" + echo "Creating release with notes: $description" + gh release create "${file_version}" \ + --title "$release_title" --draft \ + --notes "$description" + echo "Release created successfully." \ No newline at end of file