Skip to content

cyber-dojo/versioner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Github Action (main)

cyberdojo/versioner docker image

To create a new versioner image, after updating one or more of the microservice images (eg runner, web, start-points-base, etc), simply:

  • ./sh/refresh-env/sh
  • git add .
  • git commit -m "[RELEASE=0.1.397] Patch level updates" (assuming 0.1.396 was the current latest)
  • git push

The entrypoint for a cyberdojo/versioner docker image simply prints a self-consistent, working set of image-name, commit-sha, image-tag, and port-number, environment variables. For example:

$ docker run --rm cyberdojo/versioner:0.1.89
...
CYBER_DOJO_RUNNER_IMAGE=cyberdojo/runner
CYBER_DOJO_RUNNER_SHA=a74c5bcbb43e8fcf497be997809ce1951979e7a0
CYBER_DOJO_RUNNER_TAG=a74c5bc
CYBER_DOJO_RUNNER_PORT=4597
...
CYBER_DOJO_WEB_IMAGE=cyberdojo/web
CYBER_DOJO_WEB_SHA=333d9be4f64d3950c0bc5a0c450ce892b10e8389
CYBER_DOJO_WEB_TAG=333d9be
CYBER_DOJO_WEB_PORT=3000
...

The main cyber-dojo bash script uses these environment variables to:

  • control the START_POINTS_BASE identity when running cyber-dojo start-point create ...
  • control the image identity and port number of the cyber-dojo microservice containers.

For example, suppose cyberdojo/versioner:latest is a tag for cyberdojo/versioner:0.1.89 (which we can see a fragment of above), and we bring up a cyber-dojo server:

$ cyber-dojo up
Using version=0.1.89 (public)
...
Using runner=cyberdojo/runner:a74c5bc
Using web=cyberdojo/web:333d9be
...
  • Note the runner service identity is ${CYBER_DOJO_RUNNER_IMAGE}:${CYBER_DOJO_RUNNER_TAG}
  • Note the web service identity is ${CYBER_DOJO_WEB_IMAGE}:${CYBER_DOJO_WEB_TAG}
  • The TAG is currently always the first seven chars of the SHA (but in the future the tag could be based on the image digest).

Integration tests can export these environment variables, and use them in a docker-compose.yml file to bring up dependent services. For example:

#!/usr/bin/env bash
set -Eeu
echo_versioner_env_vars() { docker run --rm cyberdojo/versioner:latest; }
export $(echo_versioner_env_vars)
docker compose --file my-docker-compose.yml up --detach
# ...wait for all services to be ready
# ...run your tests which depend on, eg, runner...
#
# my-docker-compose.yml
services:
  runner:
    image: ${CYBER_DOJO_RUNNER_IMAGE}:${CYBER_DOJO_RUNNER_TAG}
    ...

If you are working on cyber-dojo, from source, and you want to run a cyber-dojo server which uses your locally built image(s) one option is to explicitly replace specific environment variables. For example:

#!/usr/bin/env bash
set -Eeu
echo_versioner_env_vars()
{
  # Echoes all current service env-vars. See above.
  docker run --rm cyberdojo/versioner:latest
  # Now override specific env-vars for local work-in-progress
  echo CYBER_DOJO_RUNNER_SHA=c93a9c650a8c4e7cc83545ce3f9108c2c76746d8
  echo CYBER_DOJO_RUNNER_TAG=c93a9c6
  # 
  echo CYBER_DOJO_SAVER_SHA=13b14d947fa9e873820d3e4a1e2f593735e9410a
  echo CYBER_DOJO_SAVER_TAG=13b14d9
  # ...
}
# Now export all echoed env-vars
export $(echo_versioner_env_vars)

Alternatively you can build a cyberdojo/versioner:latest fake image which prints SHA/TAG values for your locally built image(s).

For example, if you are working on a local web service, you could

  • create a fake cyberdojo/versioner:latest which prints CYBER_DOJO_WEB_SHA and CYBER_DOJO_WEB_TAG values matching the git-sha for cyberdojo/web:TAG image built from your local web git repo (on master at HEAD).
  • reissue the cyber-dojo up ... command.

You can automate creating a fake cyberdojo/versioner:latest using this bash script:

#!/usr/bin/env bash
set -Eeu
# Builds a fake cyberdojo/versioner:latest image that serves
# CYBER_DOJO_WEB SHA/TAG values for a local web image
# whose repo's dir/ contains this script.
readonly ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly TMP_DIR="$(mktemp -d /tmp/XXXXXXX)"
remove_TMP_DIR() { rm -rf "${TMP_DIR} > /dev/null"; }
trap remove_TMP_DIR INT EXIT
echo_versioner_env_vars() { docker run --rm cyberdojo/versioner:latest; }
# - - - - - - - - - - - - - - - - - - - - - - - -
build_fake_versioner_with_sha_and_tag_for_local_web()
{
  local -r sha_var_name=CYBER_DOJO_WEB_SHA
  local -r tag_var_name=CYBER_DOJO_WEB_TAG
  local -r fake_sha="$(git_commit_sha)"
  local -r fake_tag="${fake_sha:0:7}"
  local env_vars="$(echo_versioner_env_vars)"
  env_vars=$(replace_with "${env_vars}" "${sha_var_name}" "${fake_sha}")
  env_vars=$(replace_with "${env_vars}" "${tag_var_name}" "${fake_tag}")
  echo "${env_vars}" > ${TMP_DIR}/.env
  local -r fake_image=cyberdojo/versioner:latest
  {
    echo 'FROM alpine:latest'
    echo 'COPY . /app'
    echo 'ARG SHA'
    echo 'ENV SHA=${SHA}'
    echo 'ARG RELEASE'
    echo 'ENV RELEASE=${RELEASE}'
    echo 'ENTRYPOINT [ "cat", "/app/.env" ]'
  } > ${TMP_DIR}/Dockerfile
  docker build \
    --build-arg SHA="${fake_sha}" \
    --build-arg RELEASE=999.999.999 \
    --tag "${fake_image}" \
    "${TMP_DIR}"
}
# - - - - - - - - - - - - - - - - - - - - - - - -
replace_with()
{
  local -r env_vars="${1}"
  local -r name="${2}"
  local -r fake_value="${3}"
  local -r all_except=$(echo "${env_vars}" | grep --invert-match "${name}")
  printf "${all_except}\n${name}=${fake_value}\n"
}
# - - - - - - - - - - - - - - - - - - - - - - - -  
git_commit_sha()
{
  # eg 3240bfbcf3f02a9625e1ce55d054126c1a1c2cf1
  git rev-parse HEAD
}
# - - - - - - - - - - - - - - - - - - - - - - - -  
build_fake_versioner_with_sha_and_tag_for_local_web

Alternatively, you can hand edit the SHA (git rev-parse HEAD) and TAG values into versioner/app/.env and then build a local cyberdojo/versioner:latest image.

$ cd versioner
$ ./build_test_publish.sh --build-only

cyber-dojo.org home page