diff --git a/.github/docker/Dockerfile b/.github/docker/Dockerfile deleted file mode 100644 index ea80612..0000000 --- a/.github/docker/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -# set_user Docker image -# This image is used for testing the set_user build process -ARG PGVER -FROM postgres:${PGVER} -ARG PGVER -ARG DEVPKG -ENV DEBIAN_FRONTEND=noninteractive - -COPY . /src/set_user -WORKDIR /src/set_user -RUN apt-get update && \ - apt-get -y upgrade && \ - apt-get -y install postgresql-server-dev-${DEVPKG} make gcc -RUN make install diff --git a/.github/resources/scripts/healthcheck.sh b/.github/resources/scripts/healthcheck.sh deleted file mode 100644 index ddde581..0000000 --- a/.github/resources/scripts/healthcheck.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash -# Modified from https://github.com/jordyv/wait-for-healthy-container -container_name=$1 -shift -timeout=$1 - -default_timeout=120 - -if [ -z ${timeout} ]; then - timeout=${default_timeout} -fi - -RETURN_HEALTHY=0 -RETURN_STARTING=1 -RETURN_UNHEALTHY=2 -RETURN_UNKNOWN=3 -RETURN_ERROR=99 - -function usage() { - echo " - Usage: healthcheck.sh [timeout] - " - return -} - -function get_health_state { - state=$(docker inspect -f '{{ .State.Health.Status }}' ${container_name}) - return_code=$? - if [ ! ${return_code} -eq 0 ]; then - exit ${RETURN_ERROR} - fi - if [[ "${state}" == "healthy" ]]; then - return ${RETURN_HEALTHY} - elif [[ "${state}" == "unhealthy" ]]; then - return ${RETURN_UNHEALTHY} - elif [[ "${state}" == "starting" ]]; then - return ${RETURN_STARTING} - else - return ${RETURN_UNKNOWN} - fi -} - -function wait_for() { - echo "Wait for container '$container_name' to be healthy for max $timeout seconds..." - for i in `seq ${timeout}`; do - get_health_state - state=$? - if [ ${state} -eq 0 ]; then - echo "Container is healthy after ${i} seconds." - exit 0 - fi - sleep 1 - done - - echo "Timeout exceeded. Health status returned: $(docker inspect -f '{{ .State.Health.Status }}' ${container_name})" - exit 1 -} - -if [ -z ${container_name} ]; then - usage - exit 1 -else - wait_for -fi \ No newline at end of file diff --git a/.github/resources/set_user.yml b/.github/resources/set_user.yml deleted file mode 100644 index 2b8ebd2..0000000 --- a/.github/resources/set_user.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Custom service that contains the postgres with the installed set_user extension -version: '3' -services: - set_user: - container_name: set_user - image: set_user:latest - environment: - POSTGRES_HOST_AUTH_METHOD: "trust" - healthcheck: - test: ["CMD", "pg_isready"] - interval: 10s - timeout: 5s diff --git a/.github/workflows/regression-tests.yml b/.github/workflows/regression-tests.yml deleted file mode 100644 index 3575c6f..0000000 --- a/.github/workflows/regression-tests.yml +++ /dev/null @@ -1,58 +0,0 @@ -# CI for set_user Pull Requests and pushes to the cicd branch. -# Runs regression tests against all supported versions of postgres. -on: - push: - branches: - - integration - - '**-ci' - pull_request: - branches: - - master - - integration - -jobs: - regression-tests: - runs-on: ubuntu-latest - env: - DOCKER_DIR: ${{ github.workspace }}/.github/docker - RESOURCE_DIR: ${{ github.workspace }}/.github/resources - SCRIPT_DIR: ${{ github.workspace }}/.github/resources/scripts - DEVPKG: ${{ matrix.devpkg }} - strategy: - fail-fast: false - matrix: - pgver: [12, 13, 14, 15, 16, 17beta2] - - steps: - - name: Checkout set_user repo - uses: actions/checkout@v4 - - - name: Set DEVPKG to pgver if unset - if: ${{ env.DEVPKG == '' }} - run: | - # Cut off label and leave only major version number (17beta2 -> 17) - DEVPKG=$(echo ${{ matrix.pgver }} | sed 's/^\([0-9]\{2\}\).*/\1/') - echo "DEVPKG=$DEVPKG" >> $GITHUB_ENV; - - - name: Build set_user - run: | - sudo apt-get install -y docker-compose - docker build -t set_user:latest \ - --build-arg PGVER=${{ matrix.pgver }} \ - --build-arg DEVPKG=${{ env.DEVPKG }} \ - -f ${{ env.DOCKER_DIR }}/Dockerfile . - - - name: Run PG set_user - run: | - docker-compose -f ${{ env.RESOURCE_DIR }}/set_user.yml up -d - /bin/bash ${{ env.SCRIPT_DIR }}/healthcheck.sh set_user 60 - - - name: Run tests - run: | - docker exec set_user make -C /src/set_user USE_PGXS=1 REGRESS_OPTS='--user=postgres' installcheck - - - name: Show any regression diffs - if: ${{ failure() }} - run: | - docker cp set_user:/src/set_user/regression.diffs ./regression.diffs - cat ./regression.diffs diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..873e9fd --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,38 @@ +on: + push: + branches: + - integration + - '**-ci' + pull_request: + branches: + - master + - integration + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + # Let all the jobs run to completion even if one fails + fail-fast: false + + # Test all supported versions + matrix: + pgver: [12, 13, 14, 15, 16, 17] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + path: set_user + + - name: Build Test Container + run: docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) --build-arg PGVER=${{matrix.pgver}} -f ${GITHUB_WORKSPACE?}/set_user/test/Dockerfile.debian -t set_user-test ${GITHUB_WORKSPACE?}/set_user + + - name: Run Test + run: docker run -v ${GITHUB_WORKSPACE?}/set_user:/set_user set_user-test /set_user/test/test.sh + + - name: Show Any Regression Diffs + if: ${{ failure() }} + run: | + cat ${GITHUB_WORKSPACE?}/set_user/regression.diffs diff --git a/.gitignore b/.gitignore index f186ce4..c90e638 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Derived objects set_user.o set_user.so +set_user.bc results # Generated documentation diff --git a/test/Dockerfile.debian b/test/Dockerfile.debian new file mode 100644 index 0000000..f16b145 --- /dev/null +++ b/test/Dockerfile.debian @@ -0,0 +1,43 @@ +FROM ubuntu:latest + +# Install packages +RUN apt-get update +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y sudo wget gnupg tzdata locales lsb-release apt-utils make gcc libssl-dev \ + libkrb5-dev + +# PostgreSQL version +ARG PGVER=18 + +# Remove the default ubuntu user to reduce the chance of a conflict with the host user +RUN userdel ubuntu + +# Create postgres user/group with specific IDs +ARG UID=1000 +ARG GID=1000 + +RUN groupadd -g $GID -o postgres +RUN useradd -m -u $UID -g $GID -o -s /bin/bash postgres + +# Add PostgreSQL repository +RUN RELEASE_CODENAME=`lsb_release -c | awk '{print $2}'` && \ + echo 'deb http://apt.postgresql.org/pub/repos/apt/ '${RELEASE_CODENAME?}'-pgdg main '${PGVER?} | \ + tee -a /etc/apt/sources.list.d/pgdg.list +RUN APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 && \ + wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - +RUN apt-get update + +# Install PostgreSQL +RUN apt-get install -y postgresql-${PGVER?} postgresql-server-dev-${PGVER?} + +# Create PostgreSQL cluster +ENV PGBIN=/usr/lib/postgresql/${PGVER}/bin +ENV PGDATA="/var/lib/postgresql/${PGVER}/test" +ENV PATH="${PATH}:${PGBIN}" + +RUN sudo -u postgres ${PGBIN?}/initdb -A trust -k ${PGDATA?} +RUN echo "shared_preload_libraries = 'set_user'" >> ${PGDATA}/postgresql.conf + +# Configure sudo +RUN echo 'postgres ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers + +USER postgres diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..fd779f5 --- /dev/null +++ b/test/README.md @@ -0,0 +1,10 @@ +# Testing + +Testing is performed using a Docker container. First build the container with the desired PostgreSQL version: +``` +docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) --build-arg PGVER=17 -f test/Dockerfile.debian -t set_user-test . +``` +Then run the test: +``` +docker run --rm -v $(pwd):/set_user set_user-test /set_user/test/test.sh +``` diff --git a/test/test.sh b/test/test.sh new file mode 100755 index 0000000..11cd771 --- /dev/null +++ b/test/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +# Clean and build set_user +make -C /set_user clean all USE_PGXS=1 + +# Install set_user so postgres will start with shared_preload_libraries set +sudo bash -c "PATH=${PATH?} make -C /set_user install USE_PGXS=1" + +# Start postgres +${PGBIN}/pg_ctl -w start -D ${PGDATA} + +# Test set_user +make -C /set_user installcheck USE_PGXS=1