From 7bbd70bddceefb88544211b87d5820d7614c4694 Mon Sep 17 00:00:00 2001 From: Gabriel Omar Cotelli Date: Tue, 1 Aug 2023 11:43:19 -0300 Subject: [PATCH 1/4] Add scripting for loading rowan projects --- .github/workflows/docker-build.yml | 22 ++++++------- docs/README.md | 5 +++ docs/how-to/how-to-load-rowan-project.md | 21 ++++++++++++ .../{DockerImages.md => docker-images.md} | 14 ++++---- source/Dockerfile | 15 ++++----- source/load-rowan-project.sh | 32 +++++++++++++++++++ 6 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 docs/how-to/how-to-load-rowan-project.md rename docs/reference/{DockerImages.md => docker-images.md} (61%) create mode 100755 source/load-rowan-project.sh diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index d8c8777..1d93324 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -33,26 +33,26 @@ jobs: username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} password: ${{ secrets.DOCKER_REGISTRY_TOKEN }} - # GS64 base image - - name: Gather docker meta data for base image + # GS64 server image + - name: Gather docker meta data for server image id: docker_meta_runtime uses: crazy-max/ghaction-docker-meta@v4 with: images: ghcr.io/${{ github.repository_owner }}/gs64 - - name: Docker build and push base image + - name: Docker build and push server image uses: docker/build-push-action@v4 with: context: ./source file: ./source/Dockerfile build-args: GS_VERSION=${{ matrix.version }} - target: docker-gs64-base + target: docker-gs64-server push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.docker_meta_runtime.outputs.tags }} labels: ${{ steps.docker_meta_runtime.outputs.labels }} secrets: GIT_AUTH_TOKEN=${{ secrets.DOCKER_REGISTRY_TOKEN }} - # GS64 base image + rowan extent + # GS64 server image + rowan extent - name: Gather docker meta data for rowan image id: docker_meta_runtime_rowan uses: crazy-max/ghaction-docker-meta@v4 @@ -71,20 +71,20 @@ jobs: labels: ${{ steps.docker_meta_runtime_rowan.outputs.labels }} secrets: GIT_AUTH_TOKEN=${{ secrets.DOCKER_REGISTRY_TOKEN }} - # GS64 base image + rowan extent + git - - name: Gather docker meta data for rowan-loader image - id: docker_meta_runtime_rowan_loader + # GS64 server image + base extent0.dbf + - name: Gather docker meta data for base image + id: docker_meta_runtime_base uses: crazy-max/ghaction-docker-meta@v4 with: - images: ghcr.io/${{ github.repository_owner }}/gs64-rowan-loader + images: ghcr.io/${{ github.repository_owner }}/gs64-base - - name: Docker build and push rowan-loader image + - name: Docker build and push base image uses: docker/build-push-action@v4 with: context: ./source file: ./source/Dockerfile build-args: GS_VERSION=${{ matrix.version }} - target: docker-gs64-rowan-loader + target: docker-gs64-base push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.docker_meta_runtime_rowan_loader.outputs.tags }} labels: ${{ steps.docker_meta_runtime_rowan_loader.outputs.labels }} diff --git a/docs/README.md b/docs/README.md index b1ba5e1..64cc45b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,3 +28,8 @@ You can configure some things with environment variables: - `/opt/gemstone/logs` Log files - `/opt/gemstone/product/sys/gemstone.key` License key, by default `community.starter.key` is used. + +## Additional docs + +- [How to load a Rowan project](how-to/how-to-load-rowan-project.md) +- [Docker images reference](reference/docker-images.md) diff --git a/docs/how-to/how-to-load-rowan-project.md b/docs/how-to/how-to-load-rowan-project.md new file mode 100644 index 0000000..f945fad --- /dev/null +++ b/docs/how-to/how-to-load-rowan-project.md @@ -0,0 +1,21 @@ +# How to load a Rowan project + +`gs64-rowan` images contains some simple scripts to load a Rowan-aware project +from disk located in `ROWAN_PROJECTS_HOME`. Once you have started the image you +can do something like: + +```bash +docker exec -it -e GS64_CI_PROJECT_NAME=Buoy examples-stone-1 ./load-rowan-project.sh +``` + +This will try to use `${ROWAN_PROJECTS_HOME}/Buoy/rowan/specs/Buoy-CI.ston` as the +loading specification. + +The script supports the following configuration: + +- `GS64_CI_PROJECT_NAME` is mandatory and will be used as the folder containing + the project to load +- `GS64_CI_SPEC` is optional. It's the name of the spec file to load. + Defaults to `${GS64_CI_PROJECT_NAME}-CI` +- `GS64_CI_SYSTEM_USER_PASSWORD` is optional. The password for the `SystemUser` + account in the mounted extent. Defaults to `swordfish`. diff --git a/docs/reference/DockerImages.md b/docs/reference/docker-images.md similarity index 61% rename from docs/reference/DockerImages.md rename to docs/reference/docker-images.md index 03aac40..047fb48 100644 --- a/docs/reference/DockerImages.md +++ b/docs/reference/docker-images.md @@ -1,6 +1,6 @@ # Docker images reference -## `gs64` base docker image +## `gs64` server docker image This container image contains the GemStone/S 64 bits runtime support but doesn't provide an `extent0.dbf`. Users will need to map a volume against `/opt/gemstone/data/` @@ -8,12 +8,12 @@ containing the relevant data files (extents and transaction logs). ## `gs64-rowan` docker image -This container image builds on top of the base image providing the `extent0.rowan.dbf`. -It's a useful target for a CI system. - -## `gs64-rowan-loader` docker image - -This container image builds on top of the rowan image installing also git. +This container image builds on top of the server image providing the `extent0.rowan.dbf` +and a git installation. It's a useful target for a CI system. In order to use Rowan for cloning and manipulating remote repositories, users will need to map a volume against `/home/gemstone/.ssh/` containing the relevant keys. + +## `gs64-base` docker image + +This container image builds on top of the server image providing the `extent0.dbf` diff --git a/source/Dockerfile b/source/Dockerfile index 3d6b83a..8184074 100644 --- a/source/Dockerfile +++ b/source/Dockerfile @@ -127,15 +127,6 @@ CMD ["./entrypoint.sh"] ## Prepare server rowan image FROM docker-gs64-server as docker-gs64-rowan -ENV ROWAN_PROJECTS_HOME=${GEMSTONE_GLOBAL_DIR}/projects - -RUN install -d --owner=${GS_USER} --group=users ${ROWAN_PROJECTS_HOME} -COPY --from=download --chown=${GS_USER}:users /tmp/extent0.rowan.dbf ${GEMSTONE_GLOBAL_DIR}/data/extent0.dbf -CMD ["./entrypoint.sh"] - -## Prepare server rowan loader image -FROM docker-gs64-rowan as docker-gs64-rowan-loader - # Install git RUN apt-get update \ && apt-get install --assume-yes --no-install-recommends git \ @@ -143,4 +134,10 @@ RUN apt-get update \ && rm --recursive --force /var/lib/apt/lists/* /tmp/* /var/tmp/* \ ; +ENV ROWAN_PROJECTS_HOME=${GEMSTONE_GLOBAL_DIR}/projects + +RUN install -d --owner=${GS_USER} --group=users ${ROWAN_PROJECTS_HOME} +COPY --chown=${GS_USER}:users load-rowan-project.sh ${GEMSTONE_GLOBAL_DIR}/load-rowan-project.sh + +COPY --from=download --chown=${GS_USER}:users /tmp/extent0.rowan.dbf ${GEMSTONE_GLOBAL_DIR}/data/extent0.dbf CMD ["./entrypoint.sh"] diff --git a/source/load-rowan-project.sh b/source/load-rowan-project.sh new file mode 100755 index 0000000..864c0cb --- /dev/null +++ b/source/load-rowan-project.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -e + +if [ -z "${GS64_CI_PROJECT_NAME}" ]; then + echo "[ERROR] Missing GS64_CI_PROJECT_NAME variable" + exit 1 +fi + +readonly LOAD_SPEC="${GS64_CI_SPEC:-${GS64_CI_PROJECT_NAME}-CI}" +readonly SYSTEM_USER_PASSWORD="${GS64_CI_SYSTEM_USER_PASSWORD:-swordfish}" + +echo "Loading code in GS..." +echo " Project Name: ${GS64_CI_PROJECT_NAME}" +echo " Load Spec: ${LOAD_SPEC}" + +topaz -i -q < "${GEMSTONE_LOG_DIR}/loading-rowan-projects.log" +set gemstone gs64stone user SystemUser pass ${SYSTEM_USER_PASSWORD} +iferror exit 1 +login +doit + |spec url | + url := 'file://${ROWAN_PROJECTS_HOME}/${GS64_CI_PROJECT_NAME}/rowan/specs/${LOAD_SPEC}.ston'. + spec := RwSpecification fromUrl: url. + spec resolve load. +% +commit +logout +exit 0 +EOF + +echo "Loading code in GS... [OK]" From 7141b89c1aab0e6bf89f2963abb111730cdcc72f Mon Sep 17 00:00:00 2001 From: Gabriel Omar Cotelli Date: Tue, 1 Aug 2023 11:51:29 -0300 Subject: [PATCH 2/4] Update examples --- examples/docker-compose.build.yml | 2 +- examples/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/docker-compose.build.yml b/examples/docker-compose.build.yml index f552542..9f3f65d 100644 --- a/examples/docker-compose.build.yml +++ b/examples/docker-compose.build.yml @@ -6,7 +6,7 @@ services: network_mode: host build: context: ../source - target: docker-gs64-rowan-loader + target: docker-gs64-rowan args: GS_VERSION: 3.6.6 environment: diff --git a/examples/docker-compose.yml b/examples/docker-compose.yml index fa34c37..332b018 100644 --- a/examples/docker-compose.yml +++ b/examples/docker-compose.yml @@ -4,7 +4,7 @@ services: stone: init: true network_mode: host - image: ghcr.io/ba-st/gs64-rowan-loader:v3.6.6 + image: ghcr.io/ba-st/gs64-rowan:v3.6.6 environment: TZ: America/Argentina/Buenos_Aires volumes: From de101fffa859a3b1b6deebd338deb43c022041af Mon Sep 17 00:00:00 2001 From: Gabriel Omar Cotelli Date: Tue, 1 Aug 2023 11:52:05 -0300 Subject: [PATCH 3/4] Fix docker build action --- .github/workflows/docker-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 1d93324..273ab60 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -86,6 +86,6 @@ jobs: build-args: GS_VERSION=${{ matrix.version }} target: docker-gs64-base push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker_meta_runtime_rowan_loader.outputs.tags }} - labels: ${{ steps.docker_meta_runtime_rowan_loader.outputs.labels }} + tags: ${{ steps.docker_meta_runtime_base.outputs.tags }} + labels: ${{ steps.docker_meta_runtime_base.outputs.labels }} secrets: GIT_AUTH_TOKEN=${{ secrets.DOCKER_REGISTRY_TOKEN }} From 5017fcb4a1077efa4be30bb3d553133926cee95e Mon Sep 17 00:00:00 2001 From: Gabriel Omar Cotelli Date: Tue, 1 Aug 2023 19:46:20 -0300 Subject: [PATCH 4/4] Add run tests scripting --- docs/how-to/how-to-run-tests.md | 15 ++++ source/Dockerfile | 2 + source/StdOutPrinter.gs | 73 ++++++++++++++++++++ source/run-tests.sh | 119 ++++++++++++++++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 docs/how-to/how-to-run-tests.md create mode 100644 source/StdOutPrinter.gs create mode 100755 source/run-tests.sh diff --git a/docs/how-to/how-to-run-tests.md b/docs/how-to/how-to-run-tests.md new file mode 100644 index 0000000..bab6596 --- /dev/null +++ b/docs/how-to/how-to-run-tests.md @@ -0,0 +1,15 @@ +# How to run tests for a Rowan project + +`gs64-rowan` images contains some simple scripts to run the test of a loaded +Rowan-aware project. Once you have started the image you +can do something like: + +```bash +docker exec -it examples-stone-1 ./run-tests.sh Buoy +``` + +The script supports the following configuration: + +- The only accepted script argument is the rowan-aware project name +- `GS64_CI_SYSTEM_USER_PASSWORD` is optional. The password for the `SystemUser` + account in the mounted extent. Defaults to `swordfish`. diff --git a/source/Dockerfile b/source/Dockerfile index 8184074..fb58e37 100644 --- a/source/Dockerfile +++ b/source/Dockerfile @@ -138,6 +138,8 @@ ENV ROWAN_PROJECTS_HOME=${GEMSTONE_GLOBAL_DIR}/projects RUN install -d --owner=${GS_USER} --group=users ${ROWAN_PROJECTS_HOME} COPY --chown=${GS_USER}:users load-rowan-project.sh ${GEMSTONE_GLOBAL_DIR}/load-rowan-project.sh +COPY --chown=${GS_USER}:users run-tests.sh ${GEMSTONE_GLOBAL_DIR}/run-tests.sh +COPY --chown=${GS_USER}:users StdOutPrinter.gs ${GEMSTONE_GLOBAL_DIR}/StdOutPrinter.gs COPY --from=download --chown=${GS_USER}:users /tmp/extent0.rowan.dbf ${GEMSTONE_GLOBAL_DIR}/data/extent0.dbf CMD ["./entrypoint.sh"] diff --git a/source/StdOutPrinter.gs b/source/StdOutPrinter.gs new file mode 100644 index 0000000..2c31404 --- /dev/null +++ b/source/StdOutPrinter.gs @@ -0,0 +1,73 @@ +set compile_env: 0 +! ------------------- Class definition for StdOutPrinter +expectvalue /Class +doit +Object subclass: 'StdOutPrinter' + instVarNames: #() + classVars: #() + classInstVars: #() + poolDictionaries: #() + inDictionary: Globals + options: #() + +% +! ------------------- Remove existing behavior from StdOutPrinter +expectvalue /Metaclass3 +doit +StdOutPrinter removeAllMethods. +StdOutPrinter class removeAllMethods. +% +set compile_env: 0 +! ------------------- Class methods for StdOutPrinter +category: 'printing' +classmethod: StdOutPrinter +printError: aBlock + + self printLine: [:s | + s << Character esc << '[1m'. + s << Character esc << '[31m'. + aBlock value: s. + s << Character esc << '[0m' + ]. +% +category: 'printing' +classmethod: StdOutPrinter +printInfo: aBlock + + self printLine: [:s | + s << Character esc << '[1m'. + s << Character esc << '[34m'. + aBlock value: s. + s << Character esc << '[0m' + ]. +% +category: 'printing' +classmethod: StdOutPrinter +printLine: aBlock + + aBlock value: GsFile stdout. + GsFile stdout lf; flush +% +category: 'printing' +classmethod: StdOutPrinter +printSuccess: aBlock + + self printLine: [:s | + s << Character esc << '[1m'. + s << Character esc << '[32m'. + aBlock value: s. + s << Character esc << '[0m' + ]. +% +category: 'printing' +classmethod: StdOutPrinter +printWarning: aBlock + + self printLine: [:s | + s << Character esc << '[1m'. + s << Character esc << '[33m'. + aBlock value: s. + s << Character esc << '[0m' + ]. +% +! ------------------- Instance methods for StdOutPrinter diff --git a/source/run-tests.sh b/source/run-tests.sh new file mode 100755 index 0000000..ab623c4 --- /dev/null +++ b/source/run-tests.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +set -e + +readonly PROJECT_NAME=$1 +readonly SYSTEM_USER_PASSWORD="${GS64_CI_SYSTEM_USER_PASSWORD:-swordfish}" + +echo "Running ${PROJECT_NAME} tests..." + +topaz -i -q <> /dev/null +set gemstone gs64stone user SystemUser pass ${SYSTEM_USER_PASSWORD} +iferror exit 1 +login +input StdOutPrinter.gs +commit +logout +exit 0 +EOF + +topaz -i -q <