Build and Publish #683
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
# Heavyweight build and test | |
name: Build and Publish | |
on: | |
push: | |
branches: | |
- main | |
paths-ignore: | |
- docs/ | |
workflow_dispatch: | |
jobs: | |
set-version-number: | |
name: Set version number | |
runs-on: ubuntu-latest | |
outputs: | |
nuGetVersion: ${{ steps.gitversion.outputs.nuGetVersionV2 }} | |
semVer: ${{ steps.gitversion.outputs.fullSemVer }} | |
is-release: ${{ steps.gitversion.outputs.CommitsSinceVersionSource == 0 }} | |
#is-release: 'true' | |
steps: | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install GitVersion | |
uses: gittools/actions/gitversion/setup@v2.0.1 | |
with: | |
versionSpec: '5.x' | |
- name: Determine Version | |
id: gitversion | |
uses: gittools/actions/gitversion/execute@v2.0.1 | |
build-netcore-tool: | |
if: false | |
needs: set-version-number | |
name: Build .NET Core (global) tool | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Restore dependencies | |
run: dotnet restore | |
- name: Build | |
#run: dotnet pack ./grate/grate.csproj -c release -p:PackAsTool=true -p:PackageOutputPath=/tmp/grate/nupkg | |
run: dotnet pack ./src/grate/grate.csproj -p:SelfContained=false -p:PackAsTool=true -p:PackageOutputPath=/tmp/grate/nupkg | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Upload published tool artifact | |
uses: actions/upload-artifact@v4 | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
with: | |
name: grate-dotnet-tool-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: /tmp/grate/nupkg/* | |
- name: Push to Nuget.org | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
run: dotnet nuget push /tmp/grate/nupkg/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{secrets.NUGET_ORG_KEY}} --skip-duplicate | |
build-nuget-package: | |
if: false | |
needs: set-version-number | |
name: Build Nuget | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
package: [ | |
"grate.core", | |
"grate.mariadb", | |
"grate.oracle", | |
"grate.postgresql", | |
"grate.sqlite", | |
"grate.sqlserver" | |
] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Restore dependencies | |
run: dotnet restore | |
- name: Pack Nuget package ${{ matrix.package }} | |
run: dotnet pack ./src/${{ matrix.package }} -c Release --include-symbols -o /tmp/grate/nupkg /p:Version=${{ env.VERSION }} | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Push to Nuget.org | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
run: dotnet nuget push /tmp/grate/nupkg/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{secrets.NUGET_ORG_KEY}} --skip-duplicate | |
build-standalone: | |
if: false | |
name: Build cli | |
needs: set-version-number | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
arch: [ "win-x64", "win-x86", "win-arm64", | |
"linux-musl-x64", "linux-musl-arm64", "linux-x64", "linux-arm64", | |
"osx-x64" | |
] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Publish self-contained ${{ matrix.arch }} | |
run: dotnet publish ./src/grate/grate.csproj -f net8.0 -r ${{ matrix.arch }} -c release --self-contained -p:SelfContained=true -o ./publish/${{ matrix.arch }}/self-contained | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Upload self-contained ${{ matrix.arch }} | |
#if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ./publish/${{ matrix.arch }}/self-contained/* | |
build-standalone-mac-arm64: | |
if: false | |
name: Build cli | |
needs: set-version-number | |
# Use macos-14 to build osx-arm64, it runs on M1, see | |
# https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/ | |
# | |
# I've earlier had problems with that the trimmed, self-contained binary for osx-arm64 that was built on Linux | |
# did not work when opened on an actual mac with arm64. | |
runs-on: macos-14 | |
strategy: | |
matrix: | |
arch: [ "osx-arm64" ] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Publish self-contained ${{ matrix.arch }} | |
run: dotnet publish ./src/grate/grate.csproj -f net8.0 -r ${{ matrix.arch }} -c release --self-contained -p:SelfContained=true -o ./publish/${{ matrix.arch }}/self-contained | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Upload self-contained ${{ matrix.arch }} | |
#if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ./publish/${{ matrix.arch }}/self-contained/* | |
build-msi: | |
name: Build MSI | |
needs: | |
- set-version-number | |
- build-standalone | |
runs-on: windows-latest | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
strategy: | |
matrix: | |
arch: [ "win-x64", "win-arm64" ] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ${{ matrix.arch }}/ | |
- name: Create msi | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
run: ./installers/msi/Create-Installer.ps1 -grateExe ./${{ matrix.arch }}/grate.exe -Version "${{ needs.set-version-number.outputs.nuGetVersion }}" | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Upload MSI ${{ matrix.arch }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: grate-msi-${{ matrix.arch }}-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ./installers/msi/tmp/*.msi | |
build-docker-images: | |
name: Build and push docker images | |
needs: | |
- set-version-number | |
runs-on: ubuntu-latest | |
#if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
env: | |
#REGISTRY: ghcr.io | |
IMAGE_NAME: ${{ github.repository }} | |
FULL_IMAGE_NAME: ${{ github.repository }} | |
strategy: | |
matrix: | |
config: | |
- arch: amd64 | |
os: linux-musl | |
- arch: arm64 | |
os: linux | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Log in to the Container registry | |
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 | |
with: | |
username: ${{ github.repository_owner}} | |
password: ${{ secrets.DOCKER_HUB_TOKEN }} | |
- name: Extract metadata (tags, labels) for Docker | |
id: meta | |
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 | |
with: | |
tags: | | |
type=semver,pattern={{version}} | |
type=semver,pattern={{version}},value=${{ needs.set-version-number.outputs.semVer }}-${{ matrix.config.arch }} | |
type=ref,event=tag | |
images: ${{ env.IMAGE_NAME }} | |
- name: Build Docker images | |
uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445 | |
with: | |
file: ./installers/docker/Dockerfile | |
context: . | |
push: false | |
build-args: | |
arch=${{ matrix.config.arch }} | |
os=${{ matrix.config.os }} | |
platforms: linux/${{ matrix.config.arch }} | |
tags: ${{ steps.meta.outputs.tags }} | |
labels: ${{ steps.meta.outputs.labels }} | |
create-docker-manifests: | |
name: Create and push combined docker images | |
needs: | |
- set-version-number | |
runs-on: ubuntu-latest | |
#if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
env: | |
REGISTRY: docker.io | |
IMAGE_NAME: ${{ github.repository }} | |
steps: | |
- name: Create combined docker manifest | |
run: | | |
docker manifest create "$REGISTRY/${IMAGE_NAME}:$TAG" "$registry/${image}:$TAG-x64" "$registry/${image}:$TAG-arm64" | |
docker manifest push "$REGISTRY/${IMAGE_NAME}:$TAG" | |
env: | |
REGISTRY: docker.io | |
IMAGE_NAME: ${{ env.IMAGE_NAME }} | |
TAG: ${{ needs.set-version-number.outputs.semVer }} | |
build-deb: | |
name: Build Debian package | |
needs: | |
- set-version-number | |
- build-standalone | |
runs-on: ubuntu-latest | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
strategy: | |
matrix: | |
arch: [ "linux-arm64", "linux-x64" ] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ${{ matrix.arch }}/ | |
- id: get-arch | |
name: Get architecture | |
run: | | |
arch=$(echo ${{ matrix.arch }} | cut -d- -f2 | sed 's/x64/amd64/') | |
echo "::set-output name=arch::$arch" | |
- name: Create dpkg # Linux with powershell script? really? YES! :D | |
if: ${{ needs.set-version-number.outputs.is-release == 'true' }} | |
run: ./installers/deb/Create-Package.ps1 -grateExe ./${{ matrix.arch }}/grate -Version "${{ needs.set-version-number.outputs.nuGetVersion }}" -arch ${{ steps.get-arch.outputs.arch}} | |
env: | |
VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} | |
- name: Upload .dpkg ${{ steps.get-arch.outputs.arch }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: grate_${{ needs.set-version-number.outputs.nuGetVersion }}-1_${{ steps.get-arch.outputs.arch}}.deb | |
path: ./installers/deb/grate_${{ needs.set-version-number.outputs.nuGetVersion }}-1_${{ steps.get-arch.outputs.arch }}.deb | |
test: | |
name: Run tests | |
if: false | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
category: [ "Basic_tests", "SqlServer", "PostgreSQL", "MariaDB", "Sqlite", "Oracle" ] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: Test | |
run: > | |
dotnet test | |
unittests/${{ matrix.category }} | |
--logger:"xunit;LogFilePath=/tmp/test-results/${{ matrix.category }}.xml" -- | |
-MaxCpuCount 2 | |
env: | |
LogLevel: Warning | |
TZ: UTC | |