Merge pull request #5 from jsilverdev/improve_remote_logic #18
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: Build and Release | |
on: | |
workflow_dispatch: | |
inputs: | |
version_number: | |
description: "Version number (example: 1.0.0), if is empty then use the last version of CHANGELOG.md" | |
required: false | |
ref: | |
type: string | |
required: false | |
push: | |
branches: ["main"] | |
paths: | |
- "**.dart" | |
- "pubspec.lock" | |
jobs: | |
last_version: | |
runs-on: ubuntu-latest | |
outputs: | |
version_number: ${{ steps.get_latest_version.outputs.version_number }} | |
current_sha: ${{ steps.current_sha.outputs.sha }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} | |
fetch-depth: 0 | |
- name: Get latest version number | |
id: get_latest_version | |
run: | | |
if [[ -n "${{ github.event.inputs.version_number }}" ]]; then | |
VERSION_NUMBER="${{ github.event.inputs.version_number }}" | |
else | |
VERSION_NUMBER=$(grep -m 1 -oP '## \[\d+\.\d+\.\d+(-\S+)?\]' CHANGELOG.md | sed 's/## \[\(.*\)\]/\1/') | |
fi | |
echo "version_number=${VERSION_NUMBER}" >> $GITHUB_OUTPUT | |
- name: Check if Tag Exists | |
run: | | |
tag_name="v${{ steps.get_latest_version.outputs.version_number }}" | |
if git rev-parse --verify "$tag_name" >/dev/null 2>&1; then | |
echo "Tag $tag_name already exists." | |
exit 1 | |
else | |
echo "Tag $tag_name does not exist. Proceeding with the workflow." | |
fi | |
- name: Check if entry exists on CHANGELOG.md | |
if: github.event.inputs.version_number != '' | |
run: | | |
changelog_entry=$(grep -E "^##\s+\[${{ github.event.inputs.version_number }}\]" CHANGELOG.md) | |
if [ -z "$changelog_entry" ]; then | |
echo "No changelog entry found for version ${{ github.event.inputs.version_number }} in CHANGELOG.md" | |
exit 1 | |
fi | |
- name: Add version link on CHANGELOG.md | |
if: github.event.inputs.version_number == '' && github.event.inputs.ref == '' | |
run: | | |
new_version="${{ steps.get_latest_version.outputs.version_number }}" | |
unreleased_link=$(grep -m 1 -oP '\[unreleased\]: \Khttps:\/\/github\.com\/[^.]*\/[^.]*\/compare\/' "CHANGELOG.md") | |
sha_latest=$(git rev-list -n 1 latest) | |
new_version_link="[$new_version]: ${unreleased_link}$sha_latest...v$new_version" | |
sed -i "/\[unreleased\]: .*/a $new_version_link" "CHANGELOG.md" | |
- name: Update version number | |
if: github.event.inputs.version_number == '' && github.event.inputs.ref == '' | |
uses: mikefarah/yq@master | |
with: | |
cmd: yq -i '.version="${{ steps.get_latest_version.outputs.version_number }}"' pubspec.yaml | |
- name: Commit new version and update latest tag | |
if: github.event.inputs.version_number == '' && github.event.inputs.ref == '' | |
run: | | |
git config user.name github-actions | |
git config user.email [email protected] | |
git add . | |
git commit -m "${{ steps.get_latest_version.outputs.version_number }}" -m $'\nskip-checks: true' --cleanup=verbatim | |
git tag -d latest | |
git push origin :refs/tags/latest | |
git tag latest | |
git push origin main --tags | |
- name: Get current SHA | |
id: current_sha | |
run: | | |
if [[ -n "${{ github.event.inputs.ref }}" ]]; then | |
CURRENT_SHA="${{ github.event.inputs.ref }}" | |
else | |
CURRENT_SHA=$(git rev-parse HEAD) | |
fi | |
echo "sha=${CURRENT_SHA}" >> $GITHUB_OUTPUT | |
build: | |
needs: [last_version] | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [ubuntu-latest, windows-latest, macos-latest] | |
include: | |
- os: ubuntu-latest | |
binary_extension: "-linux" | |
pub_cache: "~/.pub-cache" | |
- os: windows-latest | |
binary_extension: "-win.exe" | |
pub_cache: "~\\.pub-cache" | |
- os: macos-latest | |
binary_extension: "-macos" | |
pub_cache: "~/.pub-cache" | |
fail-fast: false | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ needs.last_version.outputs.current_sha }} | |
- name: Restore Cache dependencies | |
id: restore-cache-deps | |
uses: actions/cache/restore@v3 | |
with: | |
key: ${{ runner.os }}-pub-cache-${{ hashFiles('**/pubspec.lock') }} | |
path: ${{ matrix.pub_cache }} | |
- name: Setup Dart | |
uses: dart-lang/setup-dart@v1 | |
- name: Install dependencies | |
run: dart pub get | |
- name: Save Cache dependencies | |
uses: actions/cache/save@v3 | |
if: steps.restore-cache-deps.outputs.cache-hit != 'true' | |
with: | |
key: ${{ steps.restore-cache-deps.outputs.cache-primary-key }} | |
path: ${{ matrix.pub_cache }} | |
- name: Compile executable | |
run: | | |
mkdir binaries | |
dart compile exe bin/main.dart -o binaries/run${{ matrix.binary_extension }} | |
- name: Upload compiled files | |
if: ${{ job.status == 'success' }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: compiled-files | |
path: binaries/run${{ matrix.binary_extension }} | |
retention-days: 1 | |
release: | |
needs: [build, last_version] | |
runs-on: ubuntu-latest | |
if: ${{ needs.build.result == 'success' }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ needs.last_version.outputs.current_sha }} | |
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} | |
- name: Download compiled files | |
uses: actions/download-artifact@v3 | |
with: | |
name: compiled-files | |
path: binaries/ | |
- name: Make executable run binary files | |
run: find binaries/ -type f -name 'run*' -exec chmod +x {} \; | |
- name: Move executables to root path | |
run: mv binaries/* . | |
- name: Remove ignore files from .gitignore | |
run: sed -i '/run[^[:space:]]*/d' .gitignore | |
- name: Create and push tag | |
run: | | |
git config user.name github-actions | |
git config user.email [email protected] | |
git checkout -b ${{ needs.last_version.outputs.version_number }} | |
git add . | |
git status | |
git commit -m "Add compiled files" | |
git status | |
git tag v${{ needs.last_version.outputs.version_number }} | |
git push origin v${{ needs.last_version.outputs.version_number }} | |
- name: Switch to latest main branch (to get latest CHANGELOG.md) | |
if: github.event.inputs.ref != '' | |
run: | | |
git config user.name github-actions | |
git config user.email [email protected] | |
git fetch origin main | |
git switch main | |
- name: Get Changelog Entry | |
id: changelog_reader | |
uses: mindsers/changelog-reader-action@v2 | |
with: | |
validation_level: warn | |
validation_depth: 5 | |
version: ${{ needs.last_version.outputs.version_number }} | |
path: ./CHANGELOG.md | |
- name: Return to versioned branch | |
if: github.event.inputs.ref != '' | |
run: git checkout ${{ needs.last_version.outputs.version_number }} | |
- name: Rename files | |
run: | | |
for file in ./run*; do | |
if [ -f "$file" ]; then | |
new_name="config_props_extractor_v${{needs.last_version.outputs.version_number}}-$(echo "$file" | cut -d'-' -f2)" | |
mv "$file" "$new_name" | |
fi | |
done | |
- name: Create and publish release | |
uses: ncipollo/release-action@v1 | |
with: | |
tag: v${{ needs.last_version.outputs.version_number }} | |
artifacts: "config_props_extractor_v*" | |
body: ${{ steps.changelog_reader.outputs.changes }} | |
prerelease: ${{ steps.changelog_reader.outputs.status == 'prereleased' }} | |
draft: ${{ steps.changelog_reader.outputs.status == 'unreleased' }} |