Features: #11
This file contains hidden or 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: Release | ||
| on: | ||
| push: | ||
| tags: | ||
| - 'v[0-9]+.[0-9]+.[0-9]+' | ||
| workflow_dispatch: | ||
| inputs: | ||
| tag: | ||
| description: 'Tag to build (e.g. v1.1.0)' | ||
| required: true | ||
| permissions: | ||
| contents: write | ||
| jobs: | ||
| test: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/setup-java@v4 | ||
| with: | ||
| java-version: '17' | ||
| distribution: 'temurin' | ||
| - name: Run tests | ||
| run: ./gradlew test | ||
| build-linux: | ||
| needs: test | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: graalvm/setup-graalvm@v1 | ||
| with: | ||
| java-version: '21' | ||
| distribution: 'graalvm-community' | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Verify version matches tag | ||
| run: | | ||
| GRADLE_VER=$(grep '^version = ' build.gradle.kts | sed 's/version = "\(.*\)"/\1/') | ||
| TAG_VER=${GITHUB_REF_NAME#v} | ||
| if [ "${GRADLE_VER}" != "${TAG_VER}" ]; then | ||
| echo "Tag ${GITHUB_REF_NAME} does not match build.gradle.kts version ${GRADLE_VER}" | ||
| exit 1 | ||
| fi | ||
| - name: Build native image | ||
| run: ./gradlew nativeCompile | ||
| - name: Smoke test | ||
| run: | | ||
| ./build/native/nativeCompile/localdevstack --service go --database postgres --output /tmp/s1 --name t | ||
| test -f /tmp/s1/service/main.go && test -f /tmp/s1/docker-compose.yml | ||
| mkdir /tmp/ex && echo 'module test' > /tmp/ex/go.mod | ||
| ./build/native/nativeCompile/localdevstack --existing-dir /tmp/ex --database postgres | ||
| test -f /tmp/ex/Dockerfile.dev && test -f /tmp/ex/docker-compose.yml | ||
| - name: Package artifact | ||
| run: | | ||
| VERSION=${GITHUB_REF_NAME#v} | ||
| cp build/native/nativeCompile/localdevstack localdevstack-linux-x64 | ||
| tar czf localdevstack-${VERSION}-linux-x64.tar.gz localdevstack-linux-x64 | ||
| sha256sum localdevstack-${VERSION}-linux-x64.tar.gz > localdevstack-${VERSION}-linux-x64.tar.gz.sha256 | ||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: linux-x64 | ||
| path: localdevstack-*-linux-x64.tar.gz* | ||
| build-macos-x64: | ||
| needs: test | ||
| runs-on: macos-13 | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: graalvm/setup-graalvm@v1 | ||
| with: | ||
| java-version: '21' | ||
| distribution: 'graalvm-community' | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Build native image | ||
| run: ./gradlew nativeCompile | ||
| - name: Smoke test | ||
| run: | | ||
| ./build/native/nativeCompile/localdevstack --service go --database postgres --output /tmp/s1 --name t | ||
| test -f /tmp/s1/service/main.go | ||
| - name: Package artifact | ||
| run: | | ||
| VERSION=${GITHUB_REF_NAME#v} | ||
| cp build/native/nativeCompile/localdevstack localdevstack-macos-x64 | ||
| tar czf localdevstack-${VERSION}-macos-x64.tar.gz localdevstack-macos-x64 | ||
| shasum -a 256 localdevstack-${VERSION}-macos-x64.tar.gz > localdevstack-${VERSION}-macos-x64.tar.gz.sha256 | ||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: macos-x64 | ||
| path: localdevstack-*-macos-x64.tar.gz* | ||
| build-macos-arm64: | ||
| needs: test | ||
| runs-on: macos-14 | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: graalvm/setup-graalvm@v1 | ||
| with: | ||
| java-version: '21' | ||
| distribution: 'graalvm-community' | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Build native image | ||
| run: ./gradlew nativeCompile | ||
| - name: Smoke test | ||
| run: | | ||
| ./build/native/nativeCompile/localdevstack --service go --database postgres --output /tmp/s1 --name t | ||
| test -f /tmp/s1/service/main.go | ||
| - name: Package artifact | ||
| run: | | ||
| VERSION=${GITHUB_REF_NAME#v} | ||
| cp build/native/nativeCompile/localdevstack localdevstack-macos-arm64 | ||
| tar czf localdevstack-${VERSION}-macos-arm64.tar.gz localdevstack-macos-arm64 | ||
| shasum -a 256 localdevstack-${VERSION}-macos-arm64.tar.gz > localdevstack-${VERSION}-macos-arm64.tar.gz.sha256 | ||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: macos-arm64 | ||
| path: localdevstack-*-macos-arm64.tar.gz* | ||
| build-windows: | ||
| needs: test | ||
| runs-on: windows-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: graalvm/setup-graalvm@v1 | ||
| with: | ||
| java-version: '21' | ||
| distribution: 'graalvm-community' | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Build native image | ||
| run: ./gradlew nativeCompile | ||
| - name: Package artifact | ||
| shell: pwsh | ||
| run: | | ||
| $VERSION = $env:GITHUB_REF_NAME -replace '^v', '' | ||
| Copy-Item build/native/nativeCompile/localdevstack.exe localdevstack-windows-x64.exe | ||
| Compress-Archive localdevstack-windows-x64.exe "localdevstack-${VERSION}-windows-x64.zip" | ||
| $hash = (Get-FileHash "localdevstack-${VERSION}-windows-x64.zip" -Algorithm SHA256).Hash.ToLower() | ||
| "${hash} localdevstack-${VERSION}-windows-x64.zip" | Out-File -Encoding utf8 "localdevstack-${VERSION}-windows-x64.zip.sha256" | ||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: windows-x64 | ||
| path: localdevstack-*-windows-x64.zip* | ||
| publish: | ||
| needs: [build-linux, build-macos-x64, build-macos-arm64, build-windows] | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/download-artifact@v4 | ||
| with: | ||
| merge-multiple: true | ||
| path: dist/ | ||
| - name: Publish to distribution repo | ||
| env: | ||
| DIST_TOKEN: ${{ secrets.DIST_TOKEN }} | ||
| run: | | ||
| VERSION=${GITHUB_REF_NAME#v} | ||
| # Create release in the public distribution repo | ||
| gh release create "$GITHUB_REF_NAME" \ | ||
| --repo krishgok/localdevstack \ | ||
| --title "LocalDevelopmentStack v${VERSION}" \ | ||
| --generate-notes \ | ||
| dist/* | ||
| # Update Homebrew formula | ||
| SHA_ARM64=$(cat dist/localdevstack-${VERSION}-macos-arm64.tar.gz.sha256 | awk '{print $1}') | ||
| SHA_X64=$(cat dist/localdevstack-${VERSION}-macos-x64.tar.gz.sha256 | awk '{print $1}') | ||
| SHA_LINUX=$(cat dist/localdevstack-${VERSION}-linux-x64.tar.gz.sha256 | awk '{print $1}') | ||
| git clone https://x-access-token:${DIST_TOKEN}@github.com/krishgok/localdevstack.git dist-repo/ | ||
| cd dist-repo | ||
| sed -i "s/version \".*\"/version \"${VERSION}\"/" Formula/localdevstack.rb | ||
| sed -i "s|url \".*macos-arm64.*\"|url \"https://github.com/krishgok/localdevstack/releases/download/v${VERSION}/localdevstack-${VERSION}-macos-arm64.tar.gz\"|" Formula/localdevstack.rb | ||
| sed -i "s/sha256 \".*\" # arm64/sha256 \"${SHA_ARM64}\" # arm64/" Formula/localdevstack.rb | ||
| sed -i "s|url \".*macos-x64.*\"|url \"https://github.com/krishgok/localdevstack/releases/download/v${VERSION}/localdevstack-${VERSION}-macos-x64.tar.gz\"|" Formula/localdevstack.rb | ||
| sed -i "s/sha256 \".*\" # x64/sha256 \"${SHA_X64}\" # x64/" Formula/localdevstack.rb | ||
| sed -i "s|url \".*linux-x64.*\"|url \"https://github.com/krishgok/localdevstack/releases/download/v${VERSION}/localdevstack-${VERSION}-linux-x64.tar.gz\"|" Formula/localdevstack.rb | ||
| sed -i "s/sha256 \".*\" # linux-x64/sha256 \"${SHA_LINUX}\" # linux-x64/" Formula/localdevstack.rb | ||
| # Update Scoop manifest | ||
| SHA_WIN=$(cat ../dist/localdevstack-${VERSION}-windows-x64.zip.sha256 | awk '{print $1}') | ||
| python3 -c " | ||
| import json | ||
| with open('bucket/localdevstack.json') as f: m = json.load(f) | ||
| m['version'] = '${VERSION}' | ||
| m['architecture']['64bit']['url'] = 'https://github.com/krishgok/localdevstack/releases/download/v${VERSION}/localdevstack-${VERSION}-windows-x64.zip' | ||
| m['architecture']['64bit']['hash'] = '${SHA_WIN}' | ||
| with open('bucket/localdevstack.json', 'w') as f: json.dump(m, f, indent=2) | ||
| print('Updated Scoop manifest') | ||
| " | ||
| git config user.email "release-bot@localdevstack.io" | ||
| git config user.name "Release Bot" | ||
| git add Formula/localdevstack.rb bucket/localdevstack.json | ||
| git commit -m "localdevstack v${VERSION}" | ||
| git push | ||
| env: | ||
| GH_TOKEN: ${{ secrets.DIST_TOKEN }} | ||