From 023ca37b64e8fb87e306e1d6e609529e8a8ce2c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 15 Apr 2025 08:18:51 +0300 Subject: [PATCH 1/9] Publish Docker images also to ACR --- .github/workflows/cd.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1055356..76371db 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -61,6 +61,19 @@ jobs: docker push $IMAGE_NAME:schema-only docker push $IMAGE_NAME:latest + publish_docker_image_to_acr: + name: Publish Docker image to ACR + permissions: + id-token: write + contents: read + uses: HSLdevcom/jore4-tools/.github/workflows/shared-build-and-publish-docker-image.yml@shared-build-and-publish-docker-image-v1 + with: + docker_image_name: jore4-mssql-testdb + secrets: + azure_client_id: ${{ secrets.AZURE_CLIENT_ID }} + azure_tenant_id: ${{ secrets.AZURE_TENANT_ID }} + azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + test-docker-images: name: verify that the docker images work needs: push_to_registry From fa1f8feda45ae0e7cc15c2c1aa34c7392df043e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 15 Apr 2025 09:06:05 +0300 Subject: [PATCH 2/9] Rename CD GitHub Actions workflow Having simple CD name makes it more clear in GitHub UI what workflow is being run. Also the name does not need to contain the jobs the workflow runs as that can be seen from the run details. --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 76371db..2e86308 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -1,4 +1,4 @@ -name: Docker Build & Push & Test +name: CD on: push: From 86b2b53500221d2a269ce18f1b74b3ebeebba54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 15 Apr 2025 09:42:32 +0300 Subject: [PATCH 3/9] Fix CD workflow triggering Previously push to any branch triggered the workflow --- .github/workflows/cd.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 2e86308..349b30f 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -2,8 +2,9 @@ name: CD on: push: + branches: + - main pull_request: - branches: [main] jobs: push_to_registry: From 3ba2cb040f779e509299b63c6d9d8d7102fa4918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 15 Apr 2025 13:13:13 +0300 Subject: [PATCH 4/9] Rename jobs for releasing Docker image to Docker Hub in CD workflow --- .github/workflows/cd.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 349b30f..9c2a06a 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -7,7 +7,7 @@ on: pull_request: jobs: - push_to_registry: + publish_docker_image_to_docker_hub: name: Build & Push docker image to dockerhub # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. runs-on: ubuntu-22.04 @@ -77,7 +77,7 @@ jobs: test-docker-images: name: verify that the docker images work - needs: push_to_registry + needs: publish_docker_image_to_docker_hub # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. runs-on: ubuntu-22.04 env: @@ -171,7 +171,7 @@ jobs: diff --ignore-all-space --ignore-blank-lines dbresults.txt expectedresults.txt run_e2e_tests: - needs: push_to_registry + needs: publish_docker_image_to_docker_hub name: Run E2E tests # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. runs-on: ubuntu-22.04 From d4ea6a26a6c84662715f708936b263851884042c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Thu, 17 Apr 2025 11:00:44 +0300 Subject: [PATCH 5/9] Fix Dockerfile end It was missing \n --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index daaa6fe..087e4ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,4 +32,4 @@ HEALTHCHECK --interval=5s --timeout=5s --start-period=30s --retries=30 \ # from which the entrypoint automatically load it FROM empty AS schema-only -COPY ./data/schema_only.sql /initialize/init-data.sql \ No newline at end of file +COPY ./data/schema_only.sql /initialize/init-data.sql From 4249cde87ac861a4568dda7c4f47ae5593d0eb91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 22 Apr 2025 16:17:11 +0300 Subject: [PATCH 6/9] Fix warnings from docker build --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 087e4ed..27e6be0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,14 +16,15 @@ EXPOSE 1433 # The username is always "sa" # Password is to be defined with "SA_PASSWORD" environment variable -ENV ACCEPT_EULA Y -ENV MSSQL_PID Developer +ENV \ + ACCEPT_EULA=Y \ + MSSQL_PID=Developer # Copy startup scripts COPY ./scripts /usr/src/app/scripts # Entrypoint for loading sql dumps and starting the mssql server -CMD /bin/bash ./scripts/entrypoint.sh +CMD ["/bin/bash", "./scripts/entrypoint.sh"] HEALTHCHECK --interval=5s --timeout=5s --start-period=30s --retries=30 \ CMD /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -Q "SELECT 1" From 754d48c4ca7706bab61474bb64785e5739efef0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Tue, 22 Apr 2025 16:15:33 +0300 Subject: [PATCH 7/9] Remove running E2E tests E2E tests do not use MSSQL Docker image, i.e. running the tests do not really test anything in the context of this repository --- .github/workflows/cd.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 9c2a06a..a022ee5 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -169,18 +169,3 @@ jobs: /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P "$SA_PASSWORD" -d master -Q "$DB_QUERY" > dbresults.txt echo "${{ matrix.expectedOutput }}" > expectedresults.txt diff --ignore-all-space --ignore-blank-lines dbresults.txt expectedresults.txt - - run_e2e_tests: - needs: publish_docker_image_to_docker_hub - name: Run E2E tests - # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. - runs-on: ubuntu-22.04 - steps: - - name: Extract metadata to env variables - uses: HSLdevcom/jore4-tools/github-actions/extract-metadata@extract-metadata-v1 - - - name: Run e2e tests - uses: HSLdevcom/jore4-tools/github-actions/run-ci@main - with: - mssqltestdb_version: - "${{ env.IMAGE_NAME }}:schema-only-${{ env.COMMIT_ID }}" From 700b184caabfec89f526e3675d708790bdb8e7ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Thu, 17 Apr 2025 11:01:23 +0300 Subject: [PATCH 8/9] Update MS SQL Server base image The old Ubuntu 16.06 requires kernel 6.6 or earlier which is not supported in GHA anymore; the oldest Ubuntu is 22.04 which currently uses kernel 6.8 --- .github/workflows/cd.yml | 2 -- Dockerfile | 14 +++++++++++--- scripts/entrypoint.sh | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index a022ee5..dad8b28 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -9,7 +9,6 @@ on: jobs: publish_docker_image_to_docker_hub: name: Build & Push docker image to dockerhub - # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. runs-on: ubuntu-22.04 steps: @@ -78,7 +77,6 @@ jobs: test-docker-images: name: verify that the docker images work needs: publish_docker_image_to_docker_hub - # The MS SQL server version in use does not run on Linux kernels newer than 6.6.x. runs-on: ubuntu-22.04 env: SA_PASSWORD: "P@ssw0rd" diff --git a/Dockerfile b/Dockerfile index 27e6be0..7735d58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,8 @@ -FROM mcr.microsoft.com/mssql/server:2017-CU22-ubuntu-16.04 AS empty +# Available tags can be found from +# https://mcr.microsoft.com/en-us/artifact/mar/mssql/server/tags +FROM mcr.microsoft.com/mssql/server:2022-CU18-ubuntu-22.04 AS empty + +USER root # Create workdir RUN mkdir -p /usr/src/app @@ -21,7 +25,7 @@ ENV \ MSSQL_PID=Developer # Copy startup scripts -COPY ./scripts /usr/src/app/scripts +COPY --chmod=755 --chown=mssql ./scripts /usr/src/app/scripts # Entrypoint for loading sql dumps and starting the mssql server CMD ["/bin/bash", "./scripts/entrypoint.sh"] @@ -29,8 +33,12 @@ CMD ["/bin/bash", "./scripts/entrypoint.sh"] HEALTHCHECK --interval=5s --timeout=5s --start-period=30s --retries=30 \ CMD /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -Q "SELECT 1" +USER mssql + # extends the :empty image and copies the init data to the /initialize folder # from which the entrypoint automatically load it FROM empty AS schema-only -COPY ./data/schema_only.sql /initialize/init-data.sql +USER root +COPY --chmod=644 --chown=mssql ./data/schema_only.sql /initialize/init-data.sql +USER mssql diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index dc9fdcb..a41f95c 100644 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -15,7 +15,7 @@ SA_PASSWORD=$(generate_password) # find all .sql files from given folder and import them in alphabetical order function import_from_folder { find "$1" -name '*.sql' -print0 | sort -z | xargs -r0 -I{} \ - /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master -i "{}" + /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$SA_PASSWORD" -d master -i "{}" } function wait_for_startup { @@ -24,7 +24,7 @@ function wait_for_startup { for i in $(seq 1 $RETRIES); do sleep $WAIT_BETWEEN echo "Checking if MSSQL server can be connected to. Trial #$i" - /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master \ + /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$SA_PASSWORD" -d master \ -Q "SELECT 1;" && echo "Success!" && return 0 done echo "Could not connect to MSSQL server" @@ -43,7 +43,7 @@ function wait_and_populate { echo "Allow access to MSSQL instance" # set the password to the desired one so that loging in is enabled - /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master \ + /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$SA_PASSWORD" -d master \ -Q "ALTER LOGIN sa WITH PASSWORD = '${SA_PASSWORD_FINAL}' OLD_PASSWORD = '${SA_PASSWORD}';" SA_PASSWORD="$SA_PASSWORD_FINAL" From e3e6ca45b1fdfb756b0009396b0d0a09c1cd92b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20R=C3=B6nkk=C3=B6?= Date: Wed, 23 Apr 2025 08:49:42 +0300 Subject: [PATCH 9/9] Update GitHub Actions runners to Ubuntu 24.04 The 24.04 runners do not have mssql-tools installed, i.e. we need to use the sqlcmd from, for example, the official MSSQL Docker image. --- .github/workflows/cd.yml | 54 ++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index dad8b28..f03fd0e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -9,7 +9,7 @@ on: jobs: publish_docker_image_to_docker_hub: name: Build & Push docker image to dockerhub - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout code @@ -77,7 +77,7 @@ jobs: test-docker-images: name: verify that the docker images work needs: publish_docker_image_to_docker_hub - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 env: SA_PASSWORD: "P@ssw0rd" @@ -146,24 +146,64 @@ jobs: - name: Get metadata as environment variables uses: HSLdevcom/jore4-tools/github-actions/extract-metadata@extract-metadata-v1 + - name: Read Current MS SQL Docker Image + id: docker + shell: bash + run: | + echo mssql_docker_image="$(grep FROM Dockerfile | sed -E 's/FROM *([^ ]*)( AS.*)?/\1/g' | head -n 1)" >> "${GITHUB_OUTPUT}" + - name: Start up mssql docker container run: | - docker run -d --rm -p 1433:1433 --name mssql -e SA_PASSWORD="$SA_PASSWORD" ${{ matrix.volumeMapping }} $IMAGE_NAME:${{ matrix.dockerImage }}-$COMMIT_ID + # A custom network is used so that Docker containers can be referred with names instead of IPs + docker network rm hsl || true + docker network create -d bridge --subnet=10.240.0.0/24 hsl + docker network ls + + docker run \ + -d \ + --rm \ + -p 1433:1433 \ + --name mssql \ + --hostname mssql \ + --network hsl \ + -e SA_PASSWORD="$SA_PASSWORD" \ + ${{ matrix.volumeMapping }} \ + $IMAGE_NAME:${{ matrix.dockerImage }}-$COMMIT_ID - name: Verify that dockerized MSSQL database is up and can be connected to uses: HSLdevcom/jore4-tools/github-actions/healthcheck@healthcheck-v1 with: command: - '/opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P "$SA_PASSWORD" -d - master -Q "SELECT ''OK'';"' - + 'docker run + --network hsl + ${{ steps.docker.outputs.mssql_docker_image }} + /opt/mssql-tools18/bin/sqlcmd + -C + -S mssql + -U sa + -P "$SA_PASSWORD" + -d master + -Q "SELECT ''OK'';"' - name: Verify that the proper sql dumps got imported (diff expected results) env: # query for listing all available database names DB_QUERY: "SELECT name FROM master.sys.databases ORDER BY name;" + # A custom entrypoint needs to be used so that the output does not contain lines printed by + # the default entrypoint which would make the diff fail run: | - /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P "$SA_PASSWORD" -d master -Q "$DB_QUERY" > dbresults.txt + docker run \ + --network hsl \ + --entrypoint /opt/mssql-tools18/bin/sqlcmd \ + ${{ steps.docker.outputs.mssql_docker_image }} \ + -C \ + -S mssql \ + -U sa \ + -P "$SA_PASSWORD" \ + -d master \ + -Q "$DB_QUERY" \ + > dbresults.txt + echo "${{ matrix.expectedOutput }}" > expectedresults.txt diff --ignore-all-space --ignore-blank-lines dbresults.txt expectedresults.txt