Integration tests #106
Workflow file for this run
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 integration tests | |
name: Integration tests | |
on: | |
push: | |
branches: | |
- main | |
paths-ignore: | |
- docs/ | |
workflow_dispatch: | |
permissions: | |
id-token: write # This is required for requesting the JWT | |
contents: read # This is required for actions/checkout | |
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/[email protected] | |
with: | |
versionSpec: '5.x' | |
- name: Determine Version | |
id: gitversion | |
uses: gittools/actions/gitversion/[email protected] | |
build-standalone: | |
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 }} | |
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: | |
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 }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: ./publish/${{ matrix.arch }}/self-contained/* | |
setup-test-environment: | |
name: Set up test enviroment | |
environment: integration-tests | |
runs-on: ubuntu-latest | |
env: | |
tf_actions_working_dir: "${{ github.workspace }}/test-infra/terraform/test-environment" | |
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} | |
ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
defaults: | |
run: | |
working-directory: ${{ env.tf_actions_working_dir }} | |
outputs: | |
# Need to split the connection string in two, and assemble when used, as GitHub Actions refuses to | |
# write anything to the outputs that have what it considers sensitive values. And, 'Pwd=<password>' | |
# apparently is. | |
mariadb_connection_string: ${{ steps.show.outputs.mariadb_connection_string }} | |
mariadb_pw: ${{ steps.show.outputs.mariadb_pw }} | |
dbs: ${{ steps.show.outputs.dbs }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Log into Azure | |
uses: azure/login@v2 | |
with: | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Show account info | |
run: > | |
az account show | |
- uses: hashicorp/setup-terraform@v3 | |
- run: terraform init | |
- name: Terraform Validate | |
run: terraform validate | |
- name: Terraform plan | |
id: plan | |
run: terraform plan -input=false | |
# - run: echo ${{ steps.plan.outputs.stdout }} | |
# - run: echo ${{ steps.plan.outputs.stderr }} | |
# - run: echo ${{ steps.plan.outputs.exitcode }} | |
- name: Exit on invalid Terraform plan | |
if: steps.plan.outcome == 'failure' | |
run: exit 1 | |
- name: Terraform Apply | |
id: apply | |
run: terraform apply -auto-approve | |
- name: Get terraform outputs | |
id: show | |
run: | | |
terraform show -json > state.json | |
HOST=$(cat state.json | jq -r '.values.outputs | ."mariadb-fqdn".value') | |
PW=$(cat state.json | jq -r '.values.outputs | ."mariadb-admin-password".value') | |
echo "mariadbs:" | |
echo "=============" | |
cat state.json | jq -r '.values.outputs.mariadb' | |
DBS=$(cat state.json | jq -r '.values.outputs.dbs.value') | |
CONNSTR="Server=${HOST};Port=3306;Database=mysql;Uid=root" | |
echo "mariadb_connection_string=${CONNSTR}" >> "$GITHUB_OUTPUT" | |
echo "mariadb_pw=${PW}" >> "$GITHUB_OUTPUT" | |
# cat /tmp/state.json| jq -r '.values.outputs.dbs.value.[] | "\(.fqdn):Port=\(.port)"' | |
echo "dbs=${DBS}" >> "$GITHUB_OUTPUT" | |
# - run: echo ${{ steps.apply.outputs.stdout }} | |
# - run: echo ${{ steps.apply.outputs.stderr }} | |
# - run: echo ${{ steps.apply.outputs.exitcode }} | |
integration-test: | |
environment: integration-tests | |
name: ${{ matrix.database.name }}, ${{ matrix.os.name }} | |
#name: "${{ matrix.os.name }}: ${{ matrix.database.name }}" | |
needs: | |
- set-version-number | |
- build-standalone | |
- build-standalone-mac-arm64 | |
- setup-test-environment | |
continue-on-error: true | |
strategy: | |
fail-fast: false | |
matrix: | |
database: ${{ fromJson(needs.setup-test-environment.outputs.dbs) }} | |
# - name: SqlServer Conn1 | |
# project: SqlServer | |
# connectionstring: "DbConn SqlServer Conn1" | |
# - name: SqlServer Conn2 | |
# project: SqlServer | |
# connectionstring: "DbConn SqlServer Conn2" | |
# - name: "PostgreSQL Conn1" | |
# project: PostgreSQL | |
# connectionstring: "DbConn PostgreSQL Conn1" | |
# - name: "PostgreSQL Conn2" | |
# project: PostgreSQL | |
# connectionstring: "DbConn PostgreSQL Conn2" | |
# - name: "MariaDB ACA" | |
# project: MariaDB | |
# connectionstring: "${{ needs.setup-test-environment.outputs.mariadb_connection_string }};Pwd=${{ needs.setup-test-environment.outputs.mariadb_pw }}" | |
# # - name: "MariaDB Conn2" | |
# project: MariaDB | |
# connectionstring: "DbConn MariaDB Conn2" | |
# - name: "Sqlite Conn1" | |
# project: Sqlite | |
# connectionstring: "DbConn Sqlite Conn1" | |
# - name: "Sqlite Conn2" | |
# project: Sqlite | |
# connectionstring: "DbConn Sqlite Conn2" | |
# - name: "Oracle Conn1" | |
# project: Oracle | |
# connectionstring: "DbConn Oracle Conn1" | |
# - name: "Oracle Conn2" | |
# project: Oracle | |
# connectionstring: "DbConn Oracle Conn2" | |
os: | |
- name: windows-latest | |
arch: win-x64 | |
executable: grate.exe | |
- name: ubuntu-latest | |
arch: linux-x64 | |
executable: grate | |
- name: macos-latest | |
arch: osx-x64 | |
executable: grate | |
#macos-14 is M1 (arm64) | |
- name: macos-14 | |
arch: osx-arm64 | |
executable: grate | |
runs-on: ${{ matrix.os.name }} | |
steps: | |
- name: Test run info | |
run: | | |
echo "Test run info:" | |
echo "====================" | |
echo "OS: ${{ matrix.os.name }}" | |
echo "Arch: ${{ matrix.os.arch }}" | |
echo "Executable: ${{ matrix.os.executable }}" | |
echo "Database: ${{ matrix.database.name }}" | |
echo "Connection string: ${{ matrix.database.connectionstring }}" | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: grate-${{ matrix.os.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} | |
path: executables/${{ matrix.os.arch }} | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: 8.0.x | |
- name: chmod u+x | |
run: chmod u+x $GrateExecutablePath | |
if: ${{ matrix.os.arch != 'win-x64' }} | |
env: | |
GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} | |
- name: Log into Azure | |
uses: azure/login@v2 | |
with: | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Test | |
run: > | |
dotnet test | |
unittests/CommandLine/CommandLine.${{ matrix.database.type }} | |
--logger:"xunit;LogFilePath=/tmp/test-results/${{ matrix.os.arch }}/CommandLine.${{ matrix.database.type }}.xml" -- | |
-MaxCpuCount 2 | |
env: | |
LogLevel: Warning | |
GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} | |
GrateTestConfig__AdminConnectionString: ${{ matrix.database.connectionstring }} | |
TZ: UTC | |
teardown-test-environment: | |
name: Tear down test enviroment | |
environment: integration-tests | |
runs-on: ubuntu-latest | |
needs: integration-test | |
if: always() | |
#if: false | |
env: | |
tf_actions_working_dir: "${{ github.workspace }}/test-infra/terraform/test-environment" | |
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} | |
ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
defaults: | |
run: | |
working-directory: ${{ env.tf_actions_working_dir }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Log into Azure | |
uses: azure/login@v2 | |
with: | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Show account info | |
run: > | |
az account show | |
- uses: hashicorp/setup-terraform@v3 | |
- run: terraform init | |
- name: Terraform Validate | |
run: terraform validate | |
- id: plan-destroy | |
run: terraform plan -destroy -input=false | |
# - name: Terraform Plan Status | |
# if: steps.plan.outcome == 'failure' | |
# run: exit 1 | |
- name: Terraform Destroy | |
#run: terraform apply -destroy -auto-approve | |
run: terraform destroy -auto-approve | |