Default Test Execution #14338
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
# Basic workflow with Actions | |
name: Default Test Execution | |
on: | |
# Triggers the workflow on push & pull request events for the main branch. Also allows for manual triggers | |
push: | |
branches: [ main, develop ] | |
pull_request: | |
types: | |
- opened | |
- reopened | |
- synchronize | |
schedule: | |
- cron: '0 6 * * *' # Execute every day at noon | |
workflow_dispatch: | |
inputs: | |
distinct_id: | |
description: 'distinct id for the triggered run from OSS' | |
required: false | |
runDescription: | |
description: 'Description of run' | |
required: false | |
runDetails: | |
description: 'JSON details of run. Provided by automation' | |
required: false | |
liquibaseBranch: | |
description: Liquibase branch to pull artifacts from. Leave empty to use latest commit on current branch. For forks, use the `owner:branch` format. Can support a comma separated list of branches to search for | |
required: false | |
liquibaseCommit: | |
description: Liquibase commit to pull artifacts from. Leave empty to use "liquibaseBranch" setting. | |
required: false | |
testClasses: | |
type: choice | |
description: Test Suite or test class to run | |
options: | |
- LiquibaseHarnessSuiteTest | |
- FoundationalHarnessSuiteTest | |
- AdvancedHarnessSuiteTest | |
- ChangeObjectTests | |
- ChangeDataTests | |
- SnapshotObjectTests | |
- GenerateChangelogTest | |
- FoundationalTest | |
ignoreLiquibaseSnapshot: | |
type: boolean | |
description: Don't autoconfigure Liquibase Snapshot | |
liquibaseRepo: | |
description: Repo pull artifacts from. Defaults to liquibase/liquibase but also supports liquibase/liquibase-pro | |
required: true | |
default: "liquibase/liquibase" | |
databases: | |
description: Databases to start up. Comma separated list of "name" | |
required: true | |
default: | | |
[ | |
"mysql-5.6", | |
"mysql-5.7", | |
"mysql-8", | |
"percona-xtradb-cluster-5.7", | |
"percona-xtradb-cluster-8.0", | |
"percona-xtradb-cluster-8.4", | |
"postgres-12", | |
"postgres-13", | |
"postgres-14", | |
"postgres-15", | |
"postgres-16", | |
"mariadb-10.2", | |
"mariadb-10.3", | |
"mariadb-10.4", | |
"mariadb-10.5", | |
"mariadb-10.6", | |
"mariadb-10.7", | |
"mssql-2017", | |
"mssql-2019", | |
"mssql-2022", | |
"H2Database-2.2", | |
"crdb-23.1", | |
"crdb-23.2", | |
"crdb-24.1", | |
"edb-postgres-12", | |
"edb-postgres-13", | |
"edb-postgres-14", | |
"edb-postgres-15", | |
"edb-postgres-16", | |
"edb-edb-12", | |
"edb-edb-13", | |
"edb-edb-14", | |
"edb-edb-15", | |
"edb-edb-16", | |
"derby", | |
"sqlite", | |
"hsqldb-2.4", | |
"hsqldb-2.5", | |
"firebird-3", | |
"firebird-4", | |
"db2-luw", | |
"informix-12.10", | |
"informix-14.10" | |
] | |
jobs: | |
authorize: | |
environment: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository && 'external' || 'internal' }} | |
runs-on: ubuntu-latest | |
steps: | |
- run: true | |
setup: | |
name: Setup | |
needs: authorize | |
runs-on: ubuntu-20.04 | |
env: | |
GITHUB_TOKEN: ${{ secrets.INSTALL_SNAPSHOT_LIQUIBASE }} | |
outputs: | |
liquibaseOwner: ${{ steps.configure-build.outputs.liquibaseOwner }} | |
liquibaseBranch: ${{ steps.configure-build.outputs.liquibaseBranch }} | |
liquibaseRepo: ${{ steps.configure-build.outputs.liquibaseRepo }} | |
liquibaseSha: ${{ steps.configure-build.outputs.liquibaseSha }} | |
databases: ${{ github.event.inputs.databases || '["mysql-5.6","mysql-5.7","mysql-8","percona-xtradb-cluster-5.7","percona-xtradb-cluster-8.0","percona-xtradb-cluster-8.4", | |
"postgres-12","postgres-13","postgres-14","postgres-15","postgres-16","mariadb-10.2","mariadb-10.3","mariadb-10.4","mariadb-10.5","mariadb-10.6", | |
"mariadb-10.7","mssql-2017","H2Database-2.2","crdb-23.1","crdb-23.2","crdb-24.1", | |
"edb-postgres-12","edb-postgres-13","edb-postgres-14","edb-postgres-15","edb-postgres-16", | |
"edb-edb-12","edb-edb-13","edb-edb-14","edb-edb-15","edb-edb-16","derby","sqlite","hsqldb-2.4","hsqldb-2.5","firebird-3","firebird-4","db2-luw","informix-12.10","informix-14.10"]' }} | |
testClasses: ${{ inputs.testClasses || 'LiquibaseHarnessSuiteTest' }} | |
steps: | |
- uses: actions/checkout@v4 | |
#https://github.com/Codex-/return-dispatch | |
- name: echo distinct ID ${{ github.event.inputs.distinct_id }} | |
run: echo ${{ github.event.inputs.distinct_id }} | |
- name: Configure Build | |
id: configure-build | |
uses: actions/github-script@v7.0.1 | |
with: | |
github-token: ${{ secrets.INSTALL_SNAPSHOT_LIQUIBASE }} | |
script: | | |
const helper = require('./.github/util/workflow-helper.js')({github, context}); | |
let testBranchName = helper.getCurrentBranch(); | |
console.log("Running in liquibase-test-harness branch " + testBranchName); | |
core.notice("Running in liquibase-test-harness branch " + testBranchName); | |
console.log("liquibaseBranch == " + "${{ github.event.inputs.liquibaseBranch }}"); | |
core.setOutput("liquibaseBranch", "${{ github.event.inputs.liquibaseBranch }}" || testBranchName+", master"); | |
console.log("liquibaseRepo == " + "${{ github.event.inputs.liquibaseRepo }}"); | |
core.setOutput("liquibaseRepo", "${{ github.event.inputs.liquibaseRepo }}" || "liquibase/liquibase"); | |
let liquibaseRepo = "${{ github.event.inputs.liquibaseRepo || 'liquibase/liquibase' }}"; | |
let repoOwnerName = liquibaseRepo.split("/")[0] | |
let repoName = liquibaseRepo.split("/")[1] | |
let liquibaseBranchName = "${{ github.event.inputs.liquibaseBranch }}"; | |
let liquibaseSha = "${{ github.event.inputs.liquibaseCommit }}"; | |
if (!liquibaseSha) { | |
if (!liquibaseBranchName) { | |
liquibaseBranchName = testBranchName; | |
} | |
console.log("No liquibaseSha passed. Looking for branch "+liquibaseBranchName); | |
let liquibaseBranchResponse = await helper.findMatchingBranch(repoOwnerName, repoName, [liquibaseBranchName, "master", "main"]); | |
liquibaseSha = liquibaseBranchResponse.sha; | |
} | |
core.setOutput("liquibaseSha", liquibaseSha); | |
core.setOutput("liquibaseOwner", repoOwnerName); | |
let runDescription = "${{ github.event.inputs.runDescription }}"; | |
if (!runDescription) { | |
runDescription = "None given"; | |
} | |
core.notice("Triggered by this OSS PR: " + runDescription); | |
let runDetails = null; | |
if (context.payload && context.payload.inputs && context.payload.inputs.runDetails) { | |
runDetails = JSON.parse(context.payload.inputs.runDetails); | |
} | |
if (!runDetails) { | |
runDetails = {}; | |
} | |
if (runDetails.notices) { | |
for (let notice of runDetails.notices) { | |
core.notice(notice); | |
} | |
} | |
- name: maven-settings-xml-action | |
uses: whelk-io/maven-settings-xml-action@v22 | |
with: | |
repositories: | | |
[ | |
{ | |
"id": "liquibase", | |
"url": "https://maven.pkg.github.com/liquibase/liquibase", | |
"releases": { | |
"enabled": "true" | |
}, | |
"snapshots": { | |
"enabled": "true", | |
"updatePolicy": "always" | |
} | |
}, | |
{ | |
"id": "liquibase-pro", | |
"url": "https://maven.pkg.github.com/liquibase/liquibase-pro", | |
"releases": { | |
"enabled": "true" | |
}, | |
"snapshots": { | |
"enabled": "true", | |
"updatePolicy": "always" | |
} | |
} | |
] | |
servers: | | |
[ | |
{ | |
"id": "liquibase-pro", | |
"username": "liquibot", | |
"password": "${{ secrets.LIQUIBOT_PAT }}" | |
}, | |
{ | |
"id": "liquibase", | |
"username": "liquibot", | |
"password": "${{ secrets.LIQUIBOT_PAT }}" | |
} | |
] | |
- uses: actions/setup-java@v3 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
cache: 'maven' | |
- name: Install Snapshot Liquibase | |
env: | |
GITHUB_TOKEN: ${{ secrets.INSTALL_SNAPSHOT_LIQUIBASE }} | |
run: | | |
mvn -B versions:set-property -Dproperty=liquibase-core.version -DnewVersion=0-SNAPSHOT | |
mvn -B liquibase-sdk:install-snapshot \ | |
"-Dliquibase.sdk.branchSearch=${{ steps.configure-build.outputs.liquibaseBranch }},master,main,develop" \ | |
"-Dliquibase.sdk.repo=liquibase/liquibase,liquibase/liquibase-pro" \ | |
"-Dliquibase.sdk.proWorkflowId=build.yml"\ | |
"-Dliquibase.sdk.workflowId=run-tests.yml" | |
mvn -B versions:set-property -Dproperty=liquibase-core.version -DnewVersion=0-SNAPSHOT | |
mvn liquibase-sdk:install-snapshot-cli \ | |
"-Dliquibase.sdk.branchSearch=${{ steps.configure-build.outputs.liquibaseBranch }},master,main,develop" \ | |
"-Dliquibase.sdk.repo=liquibase/liquibase,liquibase/liquibase-pro" \ | |
"-Dliquibase.sdk.proWorkflowId=build.yml" \ | |
"-Dliquibase.sdk.workflowId=run-tests.yml" | |
chmod -R 777 bin | |
ls -l ./bin | |
bin/liquibase --version | |
buildOverview="$(mvn -B -q liquibase-sdk:get-build-info '-Dliquibase.sdk.buildInfo.outputKey=overview' '-Dliquibase.sdk.repo=liquibase/liquibase')" | |
echo "::notice :: Installed Snapshot Liquibase $buildOverview" | |
buildOverview="$(mvn -B -q liquibase-sdk:get-build-info '-Dliquibase.sdk.buildInfo.outputKey=overview' '-Dliquibase.sdk.repo=liquibase/liquibase-pro')" | |
echo "::notice :: Installed Snapshot Liquibase-pro $buildOverview" | |
- name: Cache installed Liquibase | |
uses: actions/cache@v4 | |
with: | |
path: ~/.m2/repository/org/liquibase/ | |
key: mvn-liquibase-${{ github.run_id }}-${{ github.run_attempt }} | |
test: | |
runs-on: ubuntu-20.04 | |
needs: [ setup, authorize ] | |
strategy: | |
fail-fast: false | |
matrix: | |
database: ${{ fromJson(needs.setup.outputs.databases) }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
cache: 'maven' | |
- name: Cache installed Liquibase | |
uses: actions/cache@v4 | |
with: | |
path: ~/.m2/repository/org/liquibase/ | |
key: mvn-liquibase-${{ github.run_id }}-${{ github.run_attempt }} | |
- name: Build ${{ matrix.database }} test infra | |
working-directory: src/test/resources/docker | |
run: ./create-infra.sh ${{ matrix.database }} | |
env: | |
REPO_URL: ${{ secrets.REPO_URL }} | |
REPO_USER: ${{ secrets.REPO_USER }} | |
REPO_PASSWORD: ${{ secrets.REPO_PASSWORD }} | |
- name: Configure Liquibase Version | |
env: | |
GITHUB_TOKEN: ${{ secrets.INSTALL_SNAPSHOT_LIQUIBASE }} | |
run: | | |
mvn -B versions:set-property -Dproperty=liquibase-core.version -DnewVersion=0-SNAPSHOT | |
- name: ${{ matrix.database }} Test Run | |
run: ./src/test/resources/automation-runner.sh ${{ matrix.database }} ${{ needs.setup.outputs.testClasses }} | |
env: | |
LIQUIBASE_PRO_LICENSE_KEY: ${{ secrets.LICENSE_KEY }} | |
- name: Archive ${{ matrix.database }} test results | |
uses: actions/upload-artifact@v4 | |
if: ${{ always() }} | |
with: | |
name: ${{ matrix.database }}-test-results | |
path: build/spock-reports | |
# GitHub Actions has its own cleanup and this might be redundant | |
- name: Tear down ${{ matrix.database }} test infra | |
working-directory: src/test/resources/docker | |
run: ./teardown-infra.sh ${{ matrix.database }} | |
finish: | |
name: Finish | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
statuses: write | |
needs: [ setup, test, authorize ] | |
if: ${{ always() }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Coordinate Liquibase-Test-Harness | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.BOT_TOKEN }} | |
script: | | |
const helper = require('./.github/util/workflow-helper.js')({github, context}); | |
console.log("result is ${{ needs.test.result }}"); | |
let result = "success" | |
if ("${{ needs.test.result }}" != "success") { | |
result = "failure"; | |
} | |
console.log("Mark tests as "+result); | |
await github.rest.repos.createCommitStatus({ | |
"owner": "${{ needs.setup.outputs.liquibaseOwner }}", | |
"repo": "liquibase", | |
"sha": "${{ needs.setup.outputs.liquibaseSha }}", | |
"state": result, | |
"context": "Run Test-Harness Tests", | |
"description": "Test-Harness tests complete", | |
"target_url": "https://github.com/liquibase/liquibase-test-harness/actions/runs/${{ github.run_id }}" | |
}); |