feat: add ci & cd integration #36
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CD | |
on: | |
push: | |
branches: [ "main" ] | |
jobs: | |
re-build: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Set up JDK 21 | |
uses: actions/setup-java@v3 | |
with: | |
java-version: '21' | |
distribution: 'temurin' | |
cache: maven | |
- name: Build with Maven | |
run: mvn -B package --file app/pom.xml | |
re-test: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Set up JDK 21 | |
uses: actions/setup-java@v3 | |
with: | |
java-version: '21' | |
distribution: 'temurin' | |
cache: maven | |
- name: Test with Maven | |
run: mvn test --file app/pom.xml | |
generate-release: | |
needs: [re-test, re-build] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 # Fetch all history and tags | |
- uses: graalvm/setup-graalvm@v1 | |
with: | |
java-version: '21' | |
distribution: 'graalvm' # See 'Options' for all available distributions | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Debug step | |
run: | | |
echo "GRAALVM_HOME: $GRAALVM_HOME" | |
echo "JAVA_HOME: $JAVA_HOME" | |
java --version | |
native-image --version | |
# - name: Compile to native image | |
# run: | | |
# pwd | |
# ls | |
# mvn -Pnative native:compile --file app/pom.xml | |
- name: Set Git user | |
run: | | |
git config --global user.email "[email protected]" | |
git config --global user.name "GitHub Actions" | |
- name: Get previous tag | |
id: previous_tag | |
run: | | |
git fetch --tags | |
previous_tag=$(git describe --abbrev=0 --tags $(git rev-list --tags --max-count=1)) | |
echo "PREVIOUS TAG => $previous_tag" | |
echo "::set-output name=previous_tag::$previous_tag" | |
- name: Determine next version | |
id: version | |
run: | | |
git fetch | |
last_tag=${{ steps.previous_tag.outputs.previous_tag }} | |
commit_range="${last_tag}..HEAD" | |
major=$(echo "$last_tag" | cut -d. -f1) | |
minor=$(echo "$last_tag" | cut -d. -f2) | |
patch=$(echo "$last_tag" | cut -d. -f3) | |
has_feat=false | |
while IFS= read -r line; do | |
subject=$(echo "$line" | cut -d' ' -f2-) # Extract the commit subject | |
case "$subject" in | |
*'feat:'*) | |
echo "has_feat to true because of [$subject]" | |
has_feat=true | |
;; | |
*'fix:'*) | |
echo "patch incremented because of [$subject]" | |
patch=$((patch + 1)) | |
;; | |
*'BREAKING CHANGE:'*) | |
echo "has_breaking_change to true because of [$subject]" | |
has_breaking_change=true | |
;; | |
*) | |
echo "no pattern matched, patch incremented because of [$subject]" | |
patch=$((patch + 1)) | |
;; | |
esac | |
done < <(git log --pretty=format:"%h %s" "$commit_range") | |
if [ "$has_breaking_change" = true ]; then | |
major=$((major + 1)) | |
minor=0 | |
patch=0 | |
elif [ "$has_feat" = true ]; then | |
minor=$((minor + 1)) | |
patch=0 | |
else | |
patch=$((patch + 1)) | |
fi | |
new_version="$major.$minor.$patch" | |
echo "NEW VERSION SHOULD BE => $new_version" | |
echo "::set-output name=new_version::$new_version" | |
- name: Create new tag | |
id: new_tag | |
if: steps.commits.outputs.new_version != '0.0.0' | |
run: git tag -a ${{ steps.version.outputs.new_version }} -m "Version ${{ steps.version.outputs.new_version }}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Push new tag | |
if: steps.commits.outputs.new_version != '0.0.0' | |
run: git push origin ${{ steps.version.outputs.new_version }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Generate release notes | |
id: release_notes | |
run: | | |
echo "## What's changed" > release_notes.md | |
git log --pretty=format:"%h %s by @%an" ${{ steps.previous_tag.outputs.previous_tag }}..${{ steps.version.outputs.new_version }} | \ | |
while read line; do | |
case "$line" in | |
*'feat:'*) | |
echo "* **Feature:** ${line#*:}" >> release_notes.md | |
;; | |
*'fix:'*) | |
echo "* **Fix:** ${line#*:}" >> release_notes.md | |
;; | |
*'BREAKING CHANGE:'*) | |
echo "* **Breaking Change:** ${line#*:}" >> release_notes.md | |
;; | |
*) | |
echo "* ${line#*:}" >> release_notes.md | |
;; | |
esac | |
done | |
echo "" >> release_notes.md | |
echo "## Contributors" >> release_notes.md | |
git log --pretty=format:"@%an" ${{ steps.previous_tag.outputs.previous_tag }}..${{ steps.version.outputs.new_version }} | sort -u >> release_notes.md | |
echo "" >> release_notes.md | |
echo "**Full Changelog**: https://github.com/buildrun-tech/brc-cli/commits/${{ steps.previous_tag.outputs.previous_tag }}" >> release_notes.md | |
continue-on-error: false | |
- name: Debug release notes | |
id: debug_release_notes | |
run: | | |
cat release_notes.md | |
continue-on-error: false | |
- name: Create Release | |
id: create_release | |
uses: softprops/action-gh-release@v1 | |
with: | |
files: | | |
${{ github.workspace }} | |
tag_name: ${{ steps.version.outputs.new_version }} | |
release_name: Release ${{ steps.version.outputs.new_version }} | |
body_path: release_notes.md | |
token: ${{ secrets.GITHUB_TOKEN }} |