DAT-18302 DevOps :: Add Dry Run capabilities to liquibase packages #321
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
# This workflow uses actions that are not certified by GitHub. | |
# They are provided by a third-party and are governed by | |
# separate terms of service, privacy policy, and support | |
# documentation. | |
name: Test Dockerfiles | |
on: | |
push: | |
branches: [ "main", "master" ] | |
pull_request: | |
# The branches below must be a subset of the branches above | |
branches: [ "main" ] | |
permissions: | |
contents: read | |
jobs: | |
test: | |
env: | |
CONTAINER_NAME: "liquibase" | |
strategy: | |
fail-fast: false | |
matrix: | |
dockerfile: [Dockerfile, Dockerfile.alpine] | |
os: [ubuntu-latest, macos-13] | |
name: Build & Test ${{ matrix.dockerfile }} - ${{ matrix.os }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Setup Docker on macOS | |
if: matrix.os == 'macos-13' | |
uses: douglascamata/setup-docker-macos-action@v1-alpha | |
- name: Build an image from ${{ matrix.dockerfile }} | |
run: | | |
docker build -f ${{ matrix.dockerfile }} -t liquibase/liquibase:${{ github.sha }} . | |
- name: Test liquibase init start-h2 | |
run: | | |
LOG_STRING="The database does not persist data" | |
docker run --name $CONTAINER_NAME -d -v $(pwd)/.github/test:/liquibase/changelog liquibase/liquibase:${{ github.sha }} init start-h2 | |
sleep 30 | |
# Check if the container is running | |
if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"; then | |
# Get the logs and check if the desired string is present | |
if docker logs "$CONTAINER_NAME" 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
else | |
echo "Error: Container $CONTAINER_NAME is not running." | |
exit 2 | |
fi | |
- name: Test liquibase version | |
run: | | |
LOG_STRING="Liquibase Version:" | |
# Check if the container is running | |
if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"; then | |
# Get the logs and check if the desired string is present | |
if docker exec $CONTAINER_NAME liquibase --version 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
else | |
echo "Error: Container $CONTAINER_NAME is not running." | |
exit 2 | |
fi | |
- name: Test liquibase update | |
run: | | |
LOG_STRING="Update has been successful" | |
# Check if the container is running | |
if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"; then | |
# Get the logs and check if the desired string is present | |
if docker exec $CONTAINER_NAME liquibase update --defaultsFile=/liquibase/changelog/liquibase.properties --changelog-file=/changelog/example-changelog.xml 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
else | |
echo "Error: Container $CONTAINER_NAME is not running." | |
exit 2 | |
fi | |
- name: Test liquibase wrong ENV variable | |
run: | | |
LOG_STRING="Error: Unable to access jarfile wrong_path/internal/lib/" | |
# Stop docker container and remove it | |
docker stop $CONTAINER_NAME | |
docker rm $CONTAINER_NAME | |
# Start docker container with wrong ENV | |
# Get the logs and check if the desired string is present | |
if docker run --name $CONTAINER_NAME -d -v $(pwd)/.github/test:/liquibase/changelog -e LIQUIBASE_HOME="wrong_path" liquibase/liquibase:${{ github.sha }} init start-h2 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
else | |
echo "The log contains the string: $LOG_STRING" | |
fi | |
- name: Test liquibase good ENV variable | |
run: | | |
LOG_STRING="The database does not persist data" | |
# Stop docker container and remove it | |
docker stop $CONTAINER_NAME | |
docker rm $CONTAINER_NAME | |
# Start docker container with good ENV | |
docker run --name $CONTAINER_NAME -d -v $(pwd)/.github/test:/liquibase/changelog -e LIQUIBASE_HOME="/liquibase" liquibase/liquibase:${{ github.sha }} init start-h2 | |
sleep 30 | |
docker logs $CONTAINER_NAME | |
# Check if the container is running | |
if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"; then | |
# Get the logs and check if the desired string is present | |
if docker logs "$CONTAINER_NAME" 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
else | |
echo "Error: Container $CONTAINER_NAME is not running." | |
exit 2 | |
fi | |
- name: Test volume persistence | |
run: | | |
LOG_STRING="Update has been successful" | |
# Stop docker container | |
docker stop $CONTAINER_NAME | |
# Start docker container | |
docker start $CONTAINER_NAME | |
sleep 30 | |
# Check if the container is running | |
if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"; then | |
# Get the logs and check if the desired string is present | |
if docker exec $CONTAINER_NAME liquibase update --defaultsFile=/liquibase/changelog/liquibase.properties --changelog-file=/changelog/example-changelog.xml 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
else | |
echo "Error: Container $CONTAINER_NAME is not running." | |
exit 2 | |
fi | |
- name: Test extension loading | |
run: | | |
LOG_STRING="liquibase-redshift" | |
# Stop docker container | |
docker exec $CONTAINER_NAME lpm add liquibase-redshift --category=extension -g | |
# Get the logs and check if the desired string is present | |
if docker exec $CONTAINER_NAME liquibase --version 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
- name: Test driver connection | |
run: | | |
LOG_STRING="successfully installed in classpath" | |
docker stop $CONTAINER_NAME | |
docker rm $CONTAINER_NAME | |
docker network create --driver bridge test_network | |
# Get the logs and check if the desired string is present | |
docker run -d --name $CONTAINER_NAME --network test_network -v $(pwd)/.github/test:/liquibase/changelog liquibase/liquibase:${{ github.sha }} init start-h2 | |
if docker exec $CONTAINER_NAME lpm add mssql --category=driver -g 2>&1 | grep -q "$LOG_STRING"; then | |
echo "The log contains the string: $LOG_STRING" | |
else | |
echo "The log does not contain the string: $LOG_STRING" | |
exit 1 | |
fi | |
- name: Test custom entrypoint | |
run: | | |
LOG_STRING="Update has been successful" | |
# Build auxiliary liquibase image to inherit from | |
docker build -f ${{ matrix.dockerfile }} -t liquibase:test-entrypoint . | |
# Build custom liquibase image | |
docker build -f $(pwd)/.github/test/Dockerfile -t liquibase:test $(pwd)/.github/test/ | |
# Get the logs and check if the desired string is present | |
docker run --rm --name liquibase-test --entrypoint="/scripts/liquibase_command.sh" -v $(pwd)/.github/test:/liquibase/changelog liquibase:test "version" |