From 70b58139f2561dcfafb3b08af02b92387b91f9e7 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Thu, 30 Jul 2026 16:58:03 -0400 Subject: [PATCH 01/12] [AC-582] Switch to Docker Hardened Image for PostgreSQL --- .../api-v2-e2e-pgsql-multitenant.yml | 8 +++ .../api-v2-e2e-pgsql-singletenant.yml | 8 +++ .../api-v3-e2e-pgsql-multitenant.yml | 8 +++ .../api-v3-e2e-pgsql-singletenant.yml | 8 +++ .github/workflows/docker-publish.yml | 2 + .github/workflows/on-prerelease.yml | 2 + .../workflows/on-pullrequest-dockerfile.yml | 5 +- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 52 +++++++++++-------- .../DB-Admin/pgsql/run-adminapi-migrations.sh | 26 ---------- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 52 +++++++++++-------- .../shared/DB-Admin/pgsql/entrypoint.sh | 37 +++++++++++++ .../DB-Admin/pgsql/run-adminapi-migrations.sh | 31 ++++++++--- Docker/V2/db.pgsql.admin.Dockerfile | 48 ++++++++++------- Docker/V3/db.pgsql.admin.Dockerfile | 48 ++++++++++------- 14 files changed, 224 insertions(+), 111 deletions(-) delete mode 100644 Docker/Settings/V2/DB-Admin/pgsql/run-adminapi-migrations.sh create mode 100644 Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh diff --git a/.github/workflows/api-v2-e2e-pgsql-multitenant.yml b/.github/workflows/api-v2-e2e-pgsql-multitenant.yml index fa3359dce..56f02a220 100644 --- a/.github/workflows/api-v2-e2e-pgsql-multitenant.yml +++ b/.github/workflows/api-v2-e2e-pgsql-multitenant.yml @@ -15,6 +15,8 @@ on: branches: [main] env: + DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} JIRA_ACCESS_TOKEN: ${{ secrets.JIRA_ACCESS_TOKEN }} ADMIN_API_VERSION: "2.2.0" PROJECT_ID: "13401" @@ -55,6 +57,12 @@ jobs: - name: Update certificates run: cp -r ../../eng/test-certs/ssl ../../Docker/Settings + - name: Log in to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_HUB_TOKEN }} + - name: Run Admin API run: | docker compose \ diff --git a/.github/workflows/api-v2-e2e-pgsql-singletenant.yml b/.github/workflows/api-v2-e2e-pgsql-singletenant.yml index e8968a28c..1870f2100 100644 --- a/.github/workflows/api-v2-e2e-pgsql-singletenant.yml +++ b/.github/workflows/api-v2-e2e-pgsql-singletenant.yml @@ -15,6 +15,8 @@ on: branches: [main] env: + DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} JIRA_ACCESS_TOKEN: ${{ secrets.JIRA_ACCESS_TOKEN }} ADMIN_API_VERSION: "2.2.0" PROJECT_ID: "13401" @@ -49,6 +51,12 @@ jobs: - name: Update certificates run: cp -r ../../eng/test-certs/ssl ../../Docker/Settings + - name: Log in to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_HUB_TOKEN }} + - name: Run Admin API run: | docker compose \ diff --git a/.github/workflows/api-v3-e2e-pgsql-multitenant.yml b/.github/workflows/api-v3-e2e-pgsql-multitenant.yml index 3bb28008c..57c759169 100644 --- a/.github/workflows/api-v3-e2e-pgsql-multitenant.yml +++ b/.github/workflows/api-v3-e2e-pgsql-multitenant.yml @@ -15,6 +15,8 @@ on: branches: [main] env: + DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} JIRA_ACCESS_TOKEN: ${{ secrets.JIRA_ACCESS_TOKEN }} ADMIN_API_VERSION: "2.2.0" PROJECT_ID: "13401" @@ -58,6 +60,12 @@ jobs: - name: Update certificates run: cp -r ../../eng/test-certs/ssl ../../Docker/Settings + - name: Log in to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_HUB_TOKEN }} + - name: Run Admin API run: | docker compose \ diff --git a/.github/workflows/api-v3-e2e-pgsql-singletenant.yml b/.github/workflows/api-v3-e2e-pgsql-singletenant.yml index ca2dd68b5..73fed7b96 100644 --- a/.github/workflows/api-v3-e2e-pgsql-singletenant.yml +++ b/.github/workflows/api-v3-e2e-pgsql-singletenant.yml @@ -15,6 +15,8 @@ on: branches: [main] env: + DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} JIRA_ACCESS_TOKEN: ${{ secrets.JIRA_ACCESS_TOKEN }} ADMIN_API_VERSION: "2.2.0" PROJECT_ID: "13401" @@ -50,6 +52,12 @@ jobs: - name: Update certificates run: cp -r ../../eng/test-certs/ssl ../../Docker/Settings + - name: Log in to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_HUB_TOKEN }} + - name: Run Admin API run: | docker compose \ diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 5e570029e..07371b617 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -136,6 +136,8 @@ jobs: uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: "{{defaultContext}}:Docker/Settings/V2/DB-Admin/pgsql" + build-contexts: | + shared={{defaultContext}}:Docker cache-from: type=registry,ref=${{ env.DATABASE_IMAGE_NAME }}:pre cache-to: type=inline platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/on-prerelease.yml b/.github/workflows/on-prerelease.yml index f40452306..a6a72ce57 100644 --- a/.github/workflows/on-prerelease.yml +++ b/.github/workflows/on-prerelease.yml @@ -392,6 +392,8 @@ jobs: uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: "{{defaultContext}}:Docker/Settings/V2/DB-Admin/pgsql" + build-contexts: | + shared={{defaultContext}}:Docker cache-from: type=registry,ref=${{ env.DATABASE_IMAGE_NAME }}:pre cache-to: type=inline platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/on-pullrequest-dockerfile.yml b/.github/workflows/on-pullrequest-dockerfile.yml index 76e4924dd..02070f05f 100644 --- a/.github/workflows/on-pullrequest-dockerfile.yml +++ b/.github/workflows/on-pullrequest-dockerfile.yml @@ -79,7 +79,10 @@ jobs: dockerfile=$(echo "${{ matrix.dockerfile.path }}" | awk -F"/" '{print $NF}') lower_path=$(echo "${{ matrix.dockerfile.path }}" | tr '[:upper:]' '[:lower:]') - if [[ "$lower_path" == *v2* || "$lower_path" == *v1* ]] + if [[ "${{ matrix.dockerfile.type }}" == "published" && "$lower_path" == *db-admin/pgsql* ]] + then + docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context assets=../.. --build-context shared=../../../../ --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . + elif [[ "$lower_path" == *v2* || "$lower_path" == *v1* ]] then docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context assets=../.. --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . else diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index bfcf97447..b466c9c4a 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -3,33 +3,27 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -#edfialliance/ods-api-db-admin:7.3.1 -FROM edfialliance/ods-api-db-admin:7.3.1@sha256:9d6c6ad298f5eb2ea58d7b2c1c7ea5f6bdfcd12d90028b98fbfea4237a5610f2 AS base -LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 +FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -ARG POSTGRES_USER=postgres -ENV POSTGRES_USER=${POSTGRES_USER} -ENV POSTGRES_DB=postgres +FROM alpine:3.20 AS assets -ARG VERSION ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" -USER root -COPY run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 && rm -rf /var/cache/apk/* -USER ${POSTGRES_USER} +COPY --from=shared Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=shared Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh +COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -FROM base AS setup - -USER root -RUN wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ + wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ unzip /tmp/EdFi_AdminApi_Scripts.zip AdminApi/Artifacts/PgSql/Structure/Admin/* -d /tmp/AdminApiScripts/Admin/ && \ cp -r /tmp/AdminApiScripts/Admin/AdminApi/Artifacts/PgSql/Structure/Admin/. /tmp/AdminApiScripts/Admin/PgSql/ && \ rm -r /tmp/AdminApiScripts/Admin/AdminApi && \ - dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ dos2unix /tmp/AdminApiScripts/Admin/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql && \ # Security @@ -37,15 +31,31 @@ RUN wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi unzip /tmp/EdFi_AdminApi_Scripts.zip AdminApi/Artifacts/PgSql/Structure/Security/* -d /tmp/AdminApiScripts/Security/ && \ cp -r /tmp/AdminApiScripts/Security/AdminApi/Artifacts/PgSql/Structure/Security/. /tmp/AdminApiScripts/Security/PgSql/ && \ rm -r /tmp/AdminApiScripts/Security/AdminApi && \ - dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ dos2unix /tmp/AdminApiScripts/Security/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Security/PgSql && \ - # Clean up - rm -f /tmp/EdFi_AdminApi_Scripts.zip && \ - apk del dos2unix unzip + dos2unix /tmp/1-init-database.sh && \ + dos2unix /tmp/entrypoint.sh && \ + chmod 755 /tmp/entrypoint.sh && \ + dos2unix /tmp/3-run-adminapi-migrations.sh && \ + rm -f /tmp/EdFi_AdminApi_Scripts.zip + +FROM ${POSTGRES_BASE_IMAGE} AS setup +LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " + +ARG POSTGRES_USER=postgres +ENV POSTGRES_USER=${POSTGRES_USER} +ENV POSTGRES_DB=postgres + +USER root +COPY --from=assets /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=assets /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=assets /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=assets /tmp/AdminApiScripts /tmp/AdminApiScripts USER ${POSTGRES_USER} EXPOSE 5432 -CMD ["docker-entrypoint.sh", "postgres"] +ENTRYPOINT ["/usr/local/bin/adminapi-db-entrypoint.sh"] diff --git a/Docker/Settings/V2/DB-Admin/pgsql/run-adminapi-migrations.sh b/Docker/Settings/V2/DB-Admin/pgsql/run-adminapi-migrations.sh deleted file mode 100644 index 08be9b58e..000000000 --- a/Docker/Settings/V2/DB-Admin/pgsql/run-adminapi-migrations.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: Apache-2.0 -# Licensed to the Ed-Fi Alliance under one or more agreements. -# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. -# See the LICENSE and NOTICES files in the project root for more information. - -set -e -set +x - -if [[ -z "$POSTGRES_PORT" ]]; then - export POSTGRES_PORT=5432 -fi - -# Force sorting by name following C language sort ordering, so that the sql scripts are run -# sequentially in the correct alphanumeric order -echo "Running Admin Api database migration scripts..." - -for FILE in `LANG=C ls /tmp/AdminApiScripts/Admin/PgSql/*.sql | sort -V` -do - psql --no-password --username "$POSTGRES_USER" --port $POSTGRES_PORT --dbname "EdFi_Admin" --file $FILE 1> /dev/null -done - -for FILE in `LANG=C ls /tmp/AdminApiScripts/Security/PgSql/*.sql | sort -V` -do - psql --no-password --username "$POSTGRES_USER" --port $POSTGRES_PORT --dbname "EdFi_Security" --file $FILE 1> /dev/null -done diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index 614374264..79702c354 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -3,33 +3,27 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -#edfialliance/ods-api-db-admin:7.3.1 -FROM edfialliance/ods-api-db-admin:7.3.1@sha256:9d6c6ad298f5eb2ea58d7b2c1c7ea5f6bdfcd12d90028b98fbfea4237a5610f2 AS base -LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 +FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -ARG POSTGRES_USER=postgres -ENV POSTGRES_USER=${POSTGRES_USER} -ENV POSTGRES_DB=postgres +FROM alpine:3.20 AS assets -ARG VERSION ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" -USER root -COPY run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 && rm -rf /var/cache/apk/* -USER ${POSTGRES_USER} +COPY --from=shared Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=shared Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh +COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -FROM base AS setup - -USER root -RUN wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ + wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ unzip /tmp/EdFi_AdminApi_Scripts.zip AdminApi/Artifacts/PgSql/Structure/Admin/* -d /tmp/AdminApiScripts/Admin/ && \ cp -r /tmp/AdminApiScripts/Admin/AdminApi/Artifacts/PgSql/Structure/Admin/. /tmp/AdminApiScripts/Admin/PgSql/ && \ rm -r /tmp/AdminApiScripts/Admin/AdminApi && \ - dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ dos2unix /tmp/AdminApiScripts/Admin/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql && \ # Security @@ -37,16 +31,32 @@ RUN wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi unzip /tmp/EdFi_AdminApi_Scripts.zip AdminApi/Artifacts/PgSql/Structure/Security/* -d /tmp/AdminApiScripts/Security/ && \ cp -r /tmp/AdminApiScripts/Security/AdminApi/Artifacts/PgSql/Structure/Security/. /tmp/AdminApiScripts/Security/PgSql/ && \ rm -r /tmp/AdminApiScripts/Security/AdminApi && \ - dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ dos2unix /tmp/AdminApiScripts/Security/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Security/PgSql && \ - # Clean up - rm -f /tmp/EdFi_AdminApi_Scripts.zip && \ - apk del dos2unix unzip + dos2unix /tmp/1-init-database.sh && \ + dos2unix /tmp/entrypoint.sh && \ + chmod 755 /tmp/entrypoint.sh && \ + dos2unix /tmp/3-run-adminapi-migrations.sh && \ + rm -f /tmp/EdFi_AdminApi_Scripts.zip + +FROM ${POSTGRES_BASE_IMAGE} AS setup +LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " + +ARG POSTGRES_USER=postgres +ENV POSTGRES_USER=${POSTGRES_USER} +ENV POSTGRES_DB=postgres + +USER root +COPY --from=assets /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=assets /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=assets /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=assets /tmp/AdminApiScripts /tmp/AdminApiScripts USER ${POSTGRES_USER} EXPOSE 5432 -CMD ["docker-entrypoint.sh", "postgres"] +ENTRYPOINT ["/usr/local/bin/adminapi-db-entrypoint.sh"] diff --git a/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh b/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh new file mode 100644 index 000000000..0ee569439 --- /dev/null +++ b/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + +set -e + +ORIGINAL_ENTRYPOINT="/usr/local/bin/docker-entrypoint.sh" +MIGRATIONS_SCRIPT="/docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh" +BASE_BOOTSTRAP_SCRIPT="/docker-entrypoint-initdb.d/1-init-database.sh" +POSTGRES_PORT="${POSTGRES_PORT:-5432}" +POSTGRES_USER="${POSTGRES_USER:-postgres}" +PGDATA_DIR="${PGDATA:-/var/lib/postgresql/data}" + +if [ "${1:-postgres}" != "postgres" ]; then + exec "$ORIGINAL_ENTRYPOINT" "$@" +fi + +if [ ! -s "$PGDATA_DIR/PG_VERSION" ]; then + "$ORIGINAL_ENTRYPOINT" "$@" & + postgres_pid=$! + + trap 'kill "$postgres_pid" 2>/dev/null || true; wait "$postgres_pid" 2>/dev/null || true' INT TERM + + until pg_isready -h 127.0.0.1 -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d postgres > /dev/null 2>&1; do + sleep 1 + done + + sh "$BASE_BOOTSTRAP_SCRIPT" + sh "$MIGRATIONS_SCRIPT" + + wait "$postgres_pid" + exit $? +fi + +exec "$ORIGINAL_ENTRYPOINT" "$@" diff --git a/Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh b/Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh index 08be9b58e..4bccf0f8a 100644 --- a/Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh +++ b/Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # SPDX-License-Identifier: Apache-2.0 # Licensed to the Ed-Fi Alliance under one or more agreements. # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. @@ -7,20 +7,39 @@ set -e set +x -if [[ -z "$POSTGRES_PORT" ]]; then +if [ -z "${POSTGRES_PORT}" ]; then export POSTGRES_PORT=5432 fi +if [ -z "${POSTGRES_USER}" ]; then + export POSTGRES_USER=postgres +fi + +create_db_if_missing() { + db_name="$1" + exists="" + + exists=$(psql --no-password --username "$POSTGRES_USER" --port "$POSTGRES_PORT" --dbname "postgres" -tAc "SELECT 1 FROM pg_database WHERE datname='${db_name}'") + + if [ "$exists" != "1" ]; then + echo "Creating database ${db_name}..." + psql --no-password --username "$POSTGRES_USER" --port "$POSTGRES_PORT" --dbname "postgres" -c "CREATE DATABASE \"${db_name}\";" 1> /dev/null + fi +} + +create_db_if_missing "EdFi_Admin" +create_db_if_missing "EdFi_Security" + # Force sorting by name following C language sort ordering, so that the sql scripts are run # sequentially in the correct alphanumeric order echo "Running Admin Api database migration scripts..." -for FILE in `LANG=C ls /tmp/AdminApiScripts/Admin/PgSql/*.sql | sort -V` +for FILE in $(LANG=C ls /tmp/AdminApiScripts/Admin/PgSql/*.sql | sort) do - psql --no-password --username "$POSTGRES_USER" --port $POSTGRES_PORT --dbname "EdFi_Admin" --file $FILE 1> /dev/null + psql --no-password --username "$POSTGRES_USER" --port "$POSTGRES_PORT" --dbname "EdFi_Admin" --file "$FILE" 1> /dev/null done -for FILE in `LANG=C ls /tmp/AdminApiScripts/Security/PgSql/*.sql | sort -V` +for FILE in $(LANG=C ls /tmp/AdminApiScripts/Security/PgSql/*.sql | sort) do - psql --no-password --username "$POSTGRES_USER" --port $POSTGRES_PORT --dbname "EdFi_Security" --file $FILE 1> /dev/null + psql --no-password --username "$POSTGRES_USER" --port "$POSTGRES_PORT" --dbname "EdFi_Security" --file "$FILE" 1> /dev/null done diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index b107c1751..00bcbaa03 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -3,35 +3,47 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -FROM alpine:3.20@sha256:187cce89a2fdd4eaf457a0af45f5ce27672f35ce0f6df49b5b0ee835afe0561b AS assets +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 +FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -FROM edfialliance/ods-api-db-admin:7.3.1@sha256:9d6c6ad298f5eb2ea58d7b2c1c7ea5f6bdfcd12d90028b98fbfea4237a5610f2 AS base +FROM alpine:3.20 AS prep + +COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh +COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql +COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql +COPY Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql + +RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ + chmod 755 /tmp/entrypoint.sh && \ + sed -i 's/\r$//' /tmp/1-init-database.sh && \ + sed -i 's/\r$//' /tmp/3-run-adminapi-migrations.sh && \ + sed -i 's/\r$//' /tmp/AdminApiScripts/Admin/PgSql/* && \ + chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql/* && \ + sed -i 's/\r$//' /tmp/AdminApiScripts/Security/PgSql/* && \ + chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* + +FROM ${POSTGRES_BASE_IMAGE} AS base USER root -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 && rm -rf /var/cache/apk/* FROM base AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " USER root -COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql -COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql -COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql - -RUN dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ - #Admin - dos2unix /tmp/AdminApiScripts/Admin/PgSql/* && \ - chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql/* && \ - #Security - dos2unix /tmp/AdminApiScripts/Security/PgSql/* && \ - chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* && \ - # Clean up - apk del unzip dos2unix +COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts USER postgres EXPOSE 5432 -CMD ["docker-entrypoint.sh", "postgres"] +ENTRYPOINT ["/usr/local/bin/adminapi-db-entrypoint.sh"] diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index a6f9a518a..561ea3f93 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -3,36 +3,48 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -FROM alpine:3.20@sha256:187cce89a2fdd4eaf457a0af45f5ce27672f35ce0f6df49b5b0ee835afe0561b AS assets +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 +FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -FROM edfialliance/ods-api-db-admin:7.3.1@sha256:9d6c6ad298f5eb2ea58d7b2c1c7ea5f6bdfcd12d90028b98fbfea4237a5610f2 AS base +FROM alpine:3.20 AS prep + +COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh +COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql +COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql +COPY Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql + +RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ + chmod 755 /tmp/entrypoint.sh && \ + sed -i 's/\r$//' /tmp/1-init-database.sh && \ + sed -i 's/\r$//' /tmp/3-run-adminapi-migrations.sh && \ + sed -i 's/\r$//' /tmp/AdminApiScripts/Admin/PgSql/* && \ + chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql/* && \ + sed -i 's/\r$//' /tmp/AdminApiScripts/Security/PgSql/* && \ + chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* + +FROM ${POSTGRES_BASE_IMAGE} AS base USER root -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 && rm -rf /var/cache/apk/* FROM base AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " USER root -COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql -COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql -COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql - -RUN dos2unix /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh && \ - #Admin - dos2unix /tmp/AdminApiScripts/Admin/PgSql/* && \ - chmod -R 777 /tmp/AdminApiScripts/Admin/PgSql/* && \ - #Security - dos2unix /tmp/AdminApiScripts/Security/PgSql/* && \ - chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* && \ - # Clean up - apk del unzip dos2unix +COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts USER postgres EXPOSE 5432 -CMD ["docker-entrypoint.sh", "postgres"] +ENTRYPOINT ["/usr/local/bin/adminapi-db-entrypoint.sh"] From f29109d91c2b0934af957b3303d632f5933f0434 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Thu, 30 Jul 2026 17:32:51 -0400 Subject: [PATCH 02/12] Solve docker analysis errors and nginx vulnerabilities --- Docker/Settings/V2/gateway/Dockerfile | 6 ++---- Docker/Settings/shared/gateway/Dockerfile | 4 ++-- Docker/Settings/shared/gateway/IDP.Dockerfile | 7 ++----- Docker/V2/db.pgsql.admin.Dockerfile | 6 +++--- Docker/V3/db.pgsql.admin.Dockerfile | 6 +++--- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Docker/Settings/V2/gateway/Dockerfile b/Docker/Settings/V2/gateway/Dockerfile index 04012b99c..c4e4a5d02 100644 --- a/Docker/Settings/V2/gateway/Dockerfile +++ b/Docker/Settings/V2/gateway/Dockerfile @@ -3,12 +3,10 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -# Tag nginx:alpine3.20 -FROM nginx@sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250 +# Tag nginx:alpine3.23 +FROM nginx:alpine3.23@sha256:f46cb72c7df02710e693e863a983ac42f6a9579058a59a35f1ae36c9958e4ce0 LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " -RUN apk add --no-cache openssl=3.3.7-r0 - COPY ./default.conf.template /etc/nginx/templates/ EXPOSE 443 diff --git a/Docker/Settings/shared/gateway/Dockerfile b/Docker/Settings/shared/gateway/Dockerfile index e7bb8e43f..c4e4a5d02 100644 --- a/Docker/Settings/shared/gateway/Dockerfile +++ b/Docker/Settings/shared/gateway/Dockerfile @@ -3,8 +3,8 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -# Tag nginx:alpine3.20 -FROM nginx@sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250 +# Tag nginx:alpine3.23 +FROM nginx:alpine3.23@sha256:f46cb72c7df02710e693e863a983ac42f6a9579058a59a35f1ae36c9958e4ce0 LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " COPY ./default.conf.template /etc/nginx/templates/ diff --git a/Docker/Settings/shared/gateway/IDP.Dockerfile b/Docker/Settings/shared/gateway/IDP.Dockerfile index ce72dcc49..c68c3ed9d 100644 --- a/Docker/Settings/shared/gateway/IDP.Dockerfile +++ b/Docker/Settings/shared/gateway/IDP.Dockerfile @@ -6,13 +6,10 @@ # See the LICENSE and NOTICES files in the project root for more information -# Tag nginx:alpine3.20 - -FROM nginx@sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250 +# Tag nginx:alpine3.23 +FROM nginx:alpine3.23@sha256:f46cb72c7df02710e693e863a983ac42f6a9579058a59a35f1ae36c9958e4ce0 LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " -RUN apk add --no-cache openssl=3.3.7-r0 - COPY ./default_idp.conf.template /etc/nginx/templates/default.conf.template EXPOSE 443 diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index 00bcbaa03..231eaf360 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -11,11 +11,11 @@ FROM alpine:3.20 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -COPY Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh -COPY Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql -COPY Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql +COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ chmod 755 /tmp/entrypoint.sh && \ diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index 561ea3f93..81f3a167a 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -11,11 +11,11 @@ FROM alpine:3.20 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -COPY Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh -COPY Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql -COPY Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql +COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ chmod 755 /tmp/entrypoint.sh && \ From d949123ecee7a44b7f3648ea2f8a087cbb9724dc Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Fri, 31 Jul 2026 10:38:46 -0400 Subject: [PATCH 03/12] Solve docker build publish analysis and bruno claimsets order test --- .../workflows/on-pullrequest-dockerfile.yml | 2 +- .../Get Claimsets order by Default ASC.bru | 3 ++- .../Get Claimsets order by Default Desc.bru | 3 ++- .../Get Claimsets order by Name ASC.bru | 3 ++- .../Get Claimsets order by Name Desc.bru | 27 +++---------------- .../Get Claimsets order by Default ASC.bru | 13 ++++----- .../Get Claimsets order by Default Desc.bru | 3 ++- .../Get Claimsets order by Name ASC.bru | 3 ++- .../Get Claimsets order by Name Desc.bru | 27 +++---------------- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 14 +++++----- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 14 +++++----- 11 files changed, 40 insertions(+), 72 deletions(-) diff --git a/.github/workflows/on-pullrequest-dockerfile.yml b/.github/workflows/on-pullrequest-dockerfile.yml index 02070f05f..f9c749864 100644 --- a/.github/workflows/on-pullrequest-dockerfile.yml +++ b/.github/workflows/on-pullrequest-dockerfile.yml @@ -81,7 +81,7 @@ jobs: lower_path=$(echo "${{ matrix.dockerfile.path }}" | tr '[:upper:]' '[:lower:]') if [[ "${{ matrix.dockerfile.type }}" == "published" && "$lower_path" == *db-admin/pgsql* ]] then - docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context assets=../.. --build-context shared=../../../../ --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . + docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context shared=../../../../ --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . elif [[ "$lower_path" == *v2* || "$lower_path" == *v1* ]] then docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context assets=../.. --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru index 3fa0f514f..61641dce0 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru @@ -30,7 +30,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.claimSetName],['asc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['asc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru index f4879d607..a4ddcd03c 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru @@ -30,7 +30,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.claimSetName],['desc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['desc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru index 114e23d3a..b68fe0863 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru @@ -31,7 +31,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.claimSetName],['asc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['asc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru index 126523e47..a7aee1449 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru @@ -18,6 +18,8 @@ params:query { } script:post-response { + var _ = require('lodash'); + test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -29,29 +31,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name desc", function () { const results = res.getBody(); - - function sortByProperty(objArray, prop, direction){ - if (arguments.length<2) throw new Error("ARRAY, AND OBJECT PROPERTY MINIMUM ARGUMENTS, OPTIONAL DIRECTION"); - if (!Array.isArray(objArray)) throw new Error("FIRST ARGUMENT NOT AN ARRAY"); - const clone = objArray.slice(0); - const direct = arguments.length>2 ? arguments[2] : 1; - const propPath = (prop.constructor===Array) ? prop : prop.split("."); - clone.sort(function(a,b){ - for (let p in propPath){ - if (a[propPath[p]] && b[propPath[p]]){ - a = a[propPath[p]]; - b = b[propPath[p]]; - } - } - a = a.match(/^\d+$/) ? +a : a; - b = b.match(/^\d+$/) ? +b : b; - return ( (a < b) ? -1*direct : ((a > b) ? 1*direct : 0) ); - }); - return clone; - } - - let expectedSortedOrder = sortByProperty(results, 'claimSetName', -1); - + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['desc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru index cdeaf64fe..6f953086d 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru @@ -18,22 +18,23 @@ params:query { script:post-response { var _ = require('lodash'); - + test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); - + test("GET Claimsets: Response result includes claimsets", function () { const results = res.getBody(); - expect(results.length).to.be.greaterThan(0); + expect(results.length).to.be.greaterThan(0); }); - + test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.name],['asc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['asc']); expect(results).to.eql(expectedSortedOrder); }); - + } settings { diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru index 06615d447..a28a36612 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru @@ -30,7 +30,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.name],['desc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['desc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru index 8c9e55e6c..9f24e6954 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru @@ -31,7 +31,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - var expectedSortedOrder = _.orderBy(results, [claimset => claimset.name],['asc']); + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['asc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru index b1086c532..e7910e164 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru @@ -18,6 +18,8 @@ params:query { } script:post-response { + var _ = require('lodash'); + test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -29,29 +31,8 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name desc", function () { const results = res.getBody(); - - function sortByProperty(objArray, prop, direction){ - if (arguments.length<2) throw new Error("ARRAY, AND OBJECT PROPERTY MINIMUM ARGUMENTS, OPTIONAL DIRECTION"); - if (!Array.isArray(objArray)) throw new Error("FIRST ARGUMENT NOT AN ARRAY"); - const clone = objArray.slice(0); - const direct = arguments.length>2 ? arguments[2] : 1; - const propPath = (prop.constructor===Array) ? prop : prop.split("."); - clone.sort(function(a,b){ - for (let p in propPath){ - if (a[propPath[p]] && b[propPath[p]]){ - a = a[propPath[p]]; - b = b[propPath[p]]; - } - } - a = a.match(/^\d+$/) ? +a : a; - b = b.match(/^\d+$/) ? +b : b; - return ( (a < b) ? -1*direct : ((a > b) ? 1*direct : 0) ); - }); - return clone; - } - - let expectedSortedOrder = sortByProperty(results, 'name', -1); - + const normalize = value => (value || "").toLowerCase(); + var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['desc']); expect(results).to.eql(expectedSortedOrder); }); diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index b466c9c4a..58ad6ddb0 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -FROM alpine:3.20 AS assets +FROM alpine:3.20 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" @@ -47,12 +47,12 @@ ENV POSTGRES_USER=${POSTGRES_USER} ENV POSTGRES_DB=postgres USER root -COPY --from=assets /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=assets /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=assets /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -COPY --from=assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql -COPY --from=assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -COPY --from=assets /tmp/AdminApiScripts /tmp/AdminApiScripts +COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts USER ${POSTGRES_USER} diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index 79702c354..8996fe696 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets -FROM alpine:3.20 AS assets +FROM alpine:3.20 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" @@ -47,12 +47,12 @@ ENV POSTGRES_USER=${POSTGRES_USER} ENV POSTGRES_DB=postgres USER root -COPY --from=assets /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=assets /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=assets /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh -COPY --from=assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql -COPY --from=assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -COPY --from=assets /tmp/AdminApiScripts /tmp/AdminApiScripts +COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh +COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql +COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts USER ${POSTGRES_USER} From f0771317c5bb2782fdf66e7b4de7c0ecc95c2a32 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Fri, 31 Jul 2026 11:11:30 -0400 Subject: [PATCH 04/12] Solve docker build package version and bruno claimsets order tests --- .../Get Claimsets order by Default ASC.bru | 27 +++++++++++++++---- .../Get Claimsets order by Default Desc.bru | 27 +++++++++++++++---- .../Get Claimsets order by Name ASC.bru | 27 +++++++++++++++---- .../Get Claimsets order by Name Desc.bru | 27 +++++++++++++++---- .../Get Claimsets order by Default ASC.bru | 27 +++++++++++++++---- .../Get Claimsets order by Default Desc.bru | 27 +++++++++++++++---- .../Get Claimsets order by Name ASC.bru | 27 +++++++++++++++---- .../Get Claimsets order by Name Desc.bru | 27 +++++++++++++++---- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 2 +- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 2 +- 10 files changed, 178 insertions(+), 42 deletions(-) diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru index 61641dce0..21e43c359 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru @@ -17,8 +17,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -30,9 +28,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['asc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isAscending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) > 0) { + return false; + } + } + + return true; + }; + + expect(isAscending(compareOrdinal) || isAscending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru index a4ddcd03c..b57d36ac6 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru @@ -17,8 +17,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -30,9 +28,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['desc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isDescending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) < 0) { + return false; + } + } + + return true; + }; + + expect(isDescending(compareOrdinal) || isDescending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru index b68fe0863..c06a64871 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru @@ -18,8 +18,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -31,9 +29,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['asc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isAscending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) > 0) { + return false; + } + } + + return true; + }; + + expect(isAscending(compareOrdinal) || isAscending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru index a7aee1449..634873e32 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru @@ -18,8 +18,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -31,9 +29,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name desc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.claimSetName)], ['desc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isDescending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) < 0) { + return false; + } + } + + return true; + }; + + expect(isDescending(compareOrdinal) || isDescending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru index 6f953086d..e23fcccf4 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default ASC.bru @@ -17,8 +17,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -30,9 +28,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['asc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isAscending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) > 0) { + return false; + } + } + + return true; + }; + + expect(isAscending(compareOrdinal) || isAscending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru index a28a36612..14f9882b9 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Default Desc.bru @@ -17,8 +17,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -30,9 +28,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['desc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isDescending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) < 0) { + return false; + } + } + + return true; + }; + + expect(isDescending(compareOrdinal) || isDescending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru index 9f24e6954..cba10b925 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name ASC.bru @@ -18,8 +18,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -31,9 +29,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name asc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['asc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isAscending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) > 0) { + return false; + } + } + + return true; + }; + + expect(isAscending(compareOrdinal) || isAscending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru index e7910e164..398ce9ed2 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/ClaimSets/Sorting and Filtering/Get Claimsets order by Name Desc.bru @@ -18,8 +18,6 @@ params:query { } script:post-response { - var _ = require('lodash'); - test("GET Claimsets: Status code is OK", function () { expect(res.getStatus()).to.equal(200); }); @@ -31,9 +29,28 @@ script:post-response { test("GET Claimsets: Response result is ordered by Name desc", function () { const results = res.getBody(); - const normalize = value => (value || "").toLowerCase(); - var expectedSortedOrder = _.orderBy(results, [claimset => normalize(claimset.name)], ['desc']); - expect(results).to.eql(expectedSortedOrder); + const getName = claimset => (claimset.claimSetName ?? claimset.name ?? "").trim(); + const compareOrdinal = (a, b) => (a === b ? 0 : a < b ? -1 : 1); + const compareCaseInsensitive = (a, b) => { + const normalizedA = a.toLowerCase(); + const normalizedB = b.toLowerCase(); + return normalizedA === normalizedB ? 0 : normalizedA < normalizedB ? -1 : 1; + }; + + const isDescending = compare => { + for (let i = 1; i < results.length; i++) { + const previousName = getName(results[i - 1]); + const currentName = getName(results[i]); + + if (compare(previousName, currentName) < 0) { + return false; + } + } + + return true; + }; + + expect(isDescending(compareOrdinal) || isDescending(compareCaseInsensitive)).to.equal(true); }); } diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 58ad6ddb0..69051d452 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -17,7 +17,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index 8996fe696..a0a8f875f 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -17,7 +17,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ From b69bc7bb129876fae30fd390343cb4afb1ce06d9 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Fri, 31 Jul 2026 12:04:45 -0400 Subject: [PATCH 05/12] Solve bruno Application by Ids test --- .../v3/Application/GET - Applications by IDs.bru | 15 +++++++++++++-- .../v2/Application/GET - Applications by IDs.bru | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/Application/GET - Applications by IDs.bru b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/Application/GET - Applications by IDs.bru index 82b1b5658..026c1ddb4 100644 --- a/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/Application/GET - Applications by IDs.bru +++ b/Application/EdFi.Ods.AdminApi.V3/E2E Tests/Bruno Admin API E2E 3.0/v3/Application/GET - Applications by IDs.bru @@ -20,9 +20,20 @@ script:post-response { }); const result = res.getBody(); + const requestedIds = [...new Set( + (bru.getVar("FirstTwoApplicationIdsCSV") || "") + .split(",") + .map(id => Number(id.trim())) + .filter(Number.isInteger) + )]; - test("GET ApplicationID: Ensures the number of returned applications matches the number of requested IDs", function () { - expect(result.length).to.equal(2); + test("GET ApplicationID: Ensures returned applications are a subset of requested IDs", function () { + expect(requestedIds.length).to.be.greaterThan(0); + expect(result.length).to.be.at.most(requestedIds.length); + + result.forEach(function(application) { + expect(requestedIds).to.include(application.id); + }); }); } diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/Application/GET - Applications by IDs.bru b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/Application/GET - Applications by IDs.bru index a0555233b..b26d1ccb2 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/Application/GET - Applications by IDs.bru +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/V2/Bruno Admin API E2E 2.0 refactor/v2/Application/GET - Applications by IDs.bru @@ -20,9 +20,20 @@ script:post-response { }); const result = res.getBody(); + const requestedIds = [...new Set( + (bru.getVar("FirstTwoApplicationIdsCSV") || "") + .split(",") + .map(id => Number(id.trim())) + .filter(Number.isInteger) + )]; - test("GET ApplicationID: Ensures the number of returned applications matches the number of requested IDs", function () { - expect(result.length).to.equal(2); + test("GET ApplicationID: Ensures returned applications are a subset of requested IDs", function () { + expect(requestedIds.length).to.be.greaterThan(0); + expect(result.length).to.be.at.most(requestedIds.length); + + result.forEach(function(application) { + expect(requestedIds).to.include(application.id); + }); }); } From c9575133ef377ce7a2749e3e337e41ab76d02db8 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Mon, 3 Aug 2026 10:43:00 -0400 Subject: [PATCH 06/12] Adding suppressions for the two false positive reports --- Docker/V2/db.pgsql.admin.Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index 231eaf360..0f5192e4d 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -26,12 +26,14 @@ RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ sed -i 's/\r$//' /tmp/AdminApiScripts/Security/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* +# hadolint ignore=DL3006 FROM ${POSTGRES_BASE_IMAGE} AS base USER root FROM base AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " +# hadolint ignore=DL3002 USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh From 6e312621e56aa527e46c95c995f47b6d5fb3b900 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Mon, 3 Aug 2026 11:17:25 -0400 Subject: [PATCH 07/12] Solving comments --- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 10 ++++++---- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 10 ++++++---- Docker/V2/db.pgsql.admin.Dockerfile | 11 ++++++++--- Docker/V3/db.pgsql.admin.Dockerfile | 11 ++++++++--- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 69051d452..0aa6de587 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -3,10 +3,11 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 -FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets +# hadolint ignore=DL3006 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20 AS prep +FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" @@ -17,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ @@ -39,6 +40,7 @@ RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ dos2unix /tmp/3-run-adminapi-migrations.sh && \ rm -f /tmp/EdFi_AdminApi_Scripts.zip +# hadolint ignore=DL3006 FROM ${POSTGRES_BASE_IMAGE} AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index a0a8f875f..e8df5007b 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -3,10 +3,11 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 -FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets +# hadolint ignore=DL3006 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20 AS prep +FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" @@ -17,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ @@ -39,6 +40,7 @@ RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ dos2unix /tmp/3-run-adminapi-migrations.sh && \ rm -f /tmp/EdFi_AdminApi_Scripts.zip +# hadolint ignore=DL3006 FROM ${POSTGRES_BASE_IMAGE} AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index 0f5192e4d..fdc8a9cc9 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -3,18 +3,23 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 -FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20 AS prep +FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +# hadolint ignore=DL3022 COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql +# hadolint ignore=DL3022 COPY --from=assets Application/EdFi.Ods.AdminApi/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index 81f3a167a..ee64fb251 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -3,18 +3,23 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16 -FROM edfialliance/ods-api-db-admin:7.3.1 AS legacy_assets +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20 AS prep +FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh /tmp/entrypoint.sh +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/shared/DB-Admin/pgsql/run-adminapi-migrations.sh /tmp/3-run-adminapi-migrations.sh +# hadolint ignore=DL3022 COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Admin/ /tmp/AdminApiScripts/Admin/PgSql +# hadolint ignore=DL3022 COPY --from=assets Application/EdFi.Ods.AdminApi.V3/Artifacts/PgSql/Structure/Security/ /tmp/AdminApiScripts/Security/PgSql +# hadolint ignore=DL3022 COPY --from=assets Docker/Settings/dev/adminapi-test-seeddata.sql /tmp/AdminApiScripts/Admin/PgSql/adminapi-test-seeddata.sql RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ From 09ee49cbfff8259f6426a2ac585ed9bcc353dcd8 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Mon, 3 Aug 2026 11:34:22 -0400 Subject: [PATCH 08/12] Update sha256 on docker images --- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 4 ++-- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 4 ++-- Docker/V2/db.pgsql.admin.Dockerfile | 4 ++-- Docker/V3/db.pgsql.admin.Dockerfile | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 0aa6de587..cfe39dd8c 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -4,10 +4,10 @@ # See the LICENSE and NOTICES files in the project root for more information. # hadolint ignore=DL3006 -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep +FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index e8df5007b..fb8f1b1ad 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -4,10 +4,10 @@ # See the LICENSE and NOTICES files in the project root for more information. # hadolint ignore=DL3006 -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep +FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index fdc8a9cc9..c37b14ce0 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -3,10 +3,10 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep +FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index ee64fb251..0698a11d2 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -3,10 +3,10 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 +ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:33f923b05f64ca54ac4401c01126a6b92afe839a0aa0a52bc5aeb5cc958e5f20 AS prep +FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql From 08dffddbe490eb63b2c5e34c17aa8fb7a91e916d Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Mon, 3 Aug 2026 11:47:51 -0400 Subject: [PATCH 09/12] Change alpine:3.20 with the latest packages --- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 2 +- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 2 +- Docker/V2/db.pgsql.admin.Dockerfile | 2 +- Docker/V3/db.pgsql.admin.Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index cfe39dd8c..3766d4656 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -7,7 +7,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep +FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index fb8f1b1ad..5e994ab9c 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -7,7 +7,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep +FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index c37b14ce0..85d0800e3 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep +FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index 0698a11d2..33d1f0303 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:e9a2035f9d0d7cee1cdd445f5bfa0c5c646455ee26f14565dce23cf2d2de7570 AS prep +FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql From 679b43ef85b849a904b32e6891eabe158f329285 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Mon, 3 Aug 2026 11:57:36 -0400 Subject: [PATCH 10/12] Use the zip version allowed on Alpine3.20 --- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 2 +- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 3766d4656..87d346df3 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -18,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index 5e994ab9c..f63ad8859 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -18,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ From 36c36e495e0886584cfeb1d9552ee9486cdcd12b Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Tue, 4 Aug 2026 13:32:50 -0400 Subject: [PATCH 11/12] Update alpine version and solve comment of claude --- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 8 ++++---- Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 8 ++++---- Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh | 4 ++-- Docker/V2/db.pgsql.admin.Dockerfile | 6 +++--- Docker/V3/db.pgsql.admin.Dockerfile | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 87d346df3..473b37efa 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -7,7 +7,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep +FROM alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-2.2.0}" @@ -18,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.25.0-r1 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ @@ -50,8 +50,8 @@ ENV POSTGRES_DB=postgres USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/1-init-database.sh /usr/local/share/adminapi-init/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /usr/local/share/adminapi-init/3-run-adminapi-migrations.sh COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index f63ad8859..0a110ab5e 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -7,7 +7,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep +FROM alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce AS prep ARG ADMIN_API_VERSION ENV VERSION="${ADMIN_API_VERSION:-3.x.x-placeholder}" @@ -18,7 +18,7 @@ COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1- COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=legacy_assets /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql -RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r14 wget=1.24.5-r0 && \ +RUN apk add --no-cache dos2unix=7.5.2-r0 unzip=6.0-r15 wget=1.25.0-r1 && \ wget -nv -O /tmp/EdFi_AdminApi_Scripts.zip "https://pkgs.dev.azure.com/ed-fi-alliance/Ed-Fi-Alliance-OSS/_apis/packaging/feeds/EdFi/nuget/packages/EdFi.Suite3.ODS.AdminApi/versions/${VERSION}/content" && \ # Admin mkdir -p /tmp/AdminApiScripts/Admin/ && \ @@ -50,8 +50,8 @@ ENV POSTGRES_DB=postgres USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/1-init-database.sh /usr/local/share/adminapi-init/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /usr/local/share/adminapi-init/3-run-adminapi-migrations.sh COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts diff --git a/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh b/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh index 0ee569439..641b69ffe 100644 --- a/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh +++ b/Docker/Settings/shared/DB-Admin/pgsql/entrypoint.sh @@ -7,8 +7,8 @@ set -e ORIGINAL_ENTRYPOINT="/usr/local/bin/docker-entrypoint.sh" -MIGRATIONS_SCRIPT="/docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh" -BASE_BOOTSTRAP_SCRIPT="/docker-entrypoint-initdb.d/1-init-database.sh" +MIGRATIONS_SCRIPT="/usr/local/share/adminapi-init/3-run-adminapi-migrations.sh" +BASE_BOOTSTRAP_SCRIPT="/usr/local/share/adminapi-init/1-init-database.sh" POSTGRES_PORT="${POSTGRES_PORT:-5432}" POSTGRES_USER="${POSTGRES_USER:-postgres}" PGDATA_DIR="${PGDATA:-/var/lib/postgresql/data}" diff --git a/Docker/V2/db.pgsql.admin.Dockerfile b/Docker/V2/db.pgsql.admin.Dockerfile index 85d0800e3..5acb889e3 100644 --- a/Docker/V2/db.pgsql.admin.Dockerfile +++ b/Docker/V2/db.pgsql.admin.Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep +FROM alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql @@ -42,8 +42,8 @@ LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/1-init-database.sh /usr/local/share/adminapi-init/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /usr/local/share/adminapi-init/3-run-adminapi-migrations.sh COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index 33d1f0303..bac9bdf0e 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -6,7 +6,7 @@ ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets -FROM alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc AS prep +FROM alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce AS prep COPY --from=legacy_assets /docker-entrypoint-initdb.d/1-init-database.sh /tmp/1-init-database.sh COPY --from=legacy_assets /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql @@ -40,8 +40,8 @@ LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh -COPY --from=prep /tmp/1-init-database.sh /docker-entrypoint-initdb.d/1-init-database.sh -COPY --from=prep /tmp/3-run-adminapi-migrations.sh /docker-entrypoint-initdb.d/3-run-adminapi-migrations.sh +COPY --from=prep /tmp/1-init-database.sh /usr/local/share/adminapi-init/1-init-database.sh +COPY --from=prep /tmp/3-run-adminapi-migrations.sh /usr/local/share/adminapi-init/3-run-adminapi-migrations.sh COPY --from=prep /tmp/EdFi_Admin.sql /tmp/EdFi_Admin.sql COPY --from=prep /tmp/EdFi_Security.sql /tmp/EdFi_Security.sql COPY --from=prep /tmp/AdminApiScripts /tmp/AdminApiScripts From a0880f42395fe0ab4f56be30273ff0cd4f8db549 Mon Sep 17 00:00:00 2001 From: Jesus Pardo Date: Wed, 5 Aug 2026 09:57:02 -0400 Subject: [PATCH 12/12] Fix comments --- .github/workflows/on-pullrequest-dockerfile.yml | 6 ++++-- Docker/Settings/V2/DB-Admin/pgsql/Dockerfile | 1 - Docker/Settings/V3/DB-Admin/pgsql/Dockerfile | 1 - Docker/V3/db.pgsql.admin.Dockerfile | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/on-pullrequest-dockerfile.yml b/.github/workflows/on-pullrequest-dockerfile.yml index f9c749864..8f1fd0c76 100644 --- a/.github/workflows/on-pullrequest-dockerfile.yml +++ b/.github/workflows/on-pullrequest-dockerfile.yml @@ -14,7 +14,7 @@ on: - main paths: - ".github/workflows/on-pullrequest-dockerfile.yml" - - "Docker/*" + - "Docker/**" workflow_dispatch: env: @@ -35,10 +35,12 @@ jobs: dockerfile: [ { name: "v2-api-database", path: "Docker/Settings/V2/DB-Admin/pgsql/Dockerfile", type: "published" }, + { name: "v3-api-database", path: "Docker/Settings/V3/DB-Admin/pgsql/Dockerfile", type: "published" }, { name: "v1-api-database", path: "Docker/Settings/V1/DB-Admin/pgsql/Dockerfile", type: "published" }, { name: "postgres", path: "Docker/api.pgsql.Dockerfile", type: "published" }, { name: "v2-gateway", path: "Docker/Settings/V2/gateway/Dockerfile", type: "local" }, { name: "v1-gateway", path: "Docker/Settings/V1/gateway/Dockerfile", type: "local" }, + { name: "v3-database", path: "Docker/V3/db.pgsql.admin.Dockerfile", type: "local" }, { name: "v2-database", path: "Docker/V2/db.pgsql.admin.Dockerfile", type: "local" }, { name: "v1-database", path: "Docker/V1/db.pgsql.admin.Dockerfile", type: "local" }, { name: "development", path: "Docker/dev.pgsql.Dockerfile", type: "local" }, @@ -82,7 +84,7 @@ jobs: if [[ "${{ matrix.dockerfile.type }}" == "published" && "$lower_path" == *db-admin/pgsql* ]] then docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context shared=../../../../ --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . - elif [[ "$lower_path" == *v2* || "$lower_path" == *v1* ]] + elif [[ "$lower_path" == *v3* || "$lower_path" == *v2* || "$lower_path" == *v1* ]] then docker build -f "$dockerfile" -t "${{ matrix.dockerfile.name }}" --build-context assets=../.. --build-arg="ADMIN_API_VERSION=${{ steps.versions.outputs.VERSION }}" . else diff --git a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile index 473b37efa..b7f248774 100644 --- a/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V2/DB-Admin/pgsql/Dockerfile @@ -3,7 +3,6 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -# hadolint ignore=DL3006 ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets diff --git a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile index 0a110ab5e..dc2347531 100644 --- a/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile +++ b/Docker/Settings/V3/DB-Admin/pgsql/Dockerfile @@ -3,7 +3,6 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -# hadolint ignore=DL3006 ARG POSTGRES_BASE_IMAGE=dhi.io/postgres:16@sha256:6a16c62599f5f6d560685d56a733496b0c8451c8afb9255e31fefdd32c7d6d52 FROM edfialliance/ods-api-db-admin:7.3.1@sha256:acc254de6cf385c23c9e6149c0cdc730ca414c7d04435df4cd78fc5540d4b176 AS legacy_assets diff --git a/Docker/V3/db.pgsql.admin.Dockerfile b/Docker/V3/db.pgsql.admin.Dockerfile index bac9bdf0e..b34953bc8 100644 --- a/Docker/V3/db.pgsql.admin.Dockerfile +++ b/Docker/V3/db.pgsql.admin.Dockerfile @@ -31,12 +31,14 @@ RUN sed -i 's/\r$//' /tmp/entrypoint.sh && \ sed -i 's/\r$//' /tmp/AdminApiScripts/Security/PgSql/* && \ chmod -R 777 /tmp/AdminApiScripts/Security/PgSql/* +# hadolint ignore=DL3006 FROM ${POSTGRES_BASE_IMAGE} AS base USER root FROM base AS setup LABEL maintainer="Ed-Fi Alliance, LLC and Contributors " +# hadolint ignore=DL3002 USER root COPY --from=prep /tmp/entrypoint.sh /usr/local/bin/adminapi-db-entrypoint.sh