diff --git a/.github/workflows/build_and_upload_docker_image_on_push.yaml b/.github/workflows/build_and_upload_docker_image_on_push.yaml new file mode 100644 index 0000000..a0f9db6 --- /dev/null +++ b/.github/workflows/build_and_upload_docker_image_on_push.yaml @@ -0,0 +1,85 @@ +name: Build & Upload Fairspace-Jupyter Docker image + +on: + push: + +jobs: + build-and-upload-jupyterhub: + name: Build & Upload Fairspace-Jupyter (K8s Hub) Docker image + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Get version tag for artifact + run: | + BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} + echo "Building images from the branch: $BRANCH" + VER=$(cat ./VERSION) + echo "Building images of version: $VER" + if [ $BRANCH != "release" ] + then + VER=$VER-SNAPSHOT + fi + echo "VERSION=$VER" >> $GITHUB_ENV + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ vars.DOCKER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ vars.DOCKER_REGISTRY }}/${{ github.repository }}/jupyterhub-hub + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: ./projects/jupyterhub-hub/ + push: ${{github.ref == 'refs/heads/release' || github.ref == 'refs/heads/dev'}} + tags: ${{ vars.DOCKER_REGISTRY }}/${{ github.repository }}/jupyterhub-hub:${{ env.VERSION }} + labels: ${{ steps.meta.outputs.labels }} + + build-and-upload-jupyterhub-singleuser: + name: Build & Upload Fairspace-Jupyter (Single User) Docker image + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Get version tag for artifact + run: | + BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} + echo "Building images from the branch: $BRANCH" + VER=$(cat ./VERSION) + echo "Building images of version: $VER" + if [ $BRANCH != "release" ] + then + VER=$VER-SNAPSHOT + fi + echo "VERSION=$VER" >> $GITHUB_ENV + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ vars.DOCKER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ vars.DOCKER_REGISTRY }}/${{ github.repository }}/jupyterhub-singleuser + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: ./projects/jupyterhub-singleuser/ + push: ${{github.ref == 'refs/heads/release' || github.ref == 'refs/heads/dev'}} + tags: ${{ vars.DOCKER_REGISTRY }}/${{ github.repository }}/jupyterhub-singleuser:${{ env.VERSION }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/package_and_push_helm_chart.yaml b/.github/workflows/package_and_push_helm_chart.yaml new file mode 100644 index 0000000..c955c48 --- /dev/null +++ b/.github/workflows/package_and_push_helm_chart.yaml @@ -0,0 +1,59 @@ +name: Package and Push Helm Chart + +on: + push: + workflow_dispatch: + inputs: + version: + description: "Version of the Helm chart to push" + required: false + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Prepare version + run: | + VERSION=$(cat ./VERSION) + BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} + echo "Building images from the branch: $BRANCH" + if [ $BRANCH != "release" ]; then + VERSION=$VERSION-SNAPSHOT + fi + # override version of custom input is provided + if [[ -n "${{ github.event.inputs.version }}" ]]; then + VERSION=${{ github.event.inputs.version }} + fi + echo "Helm charts version to be deployed: $VERSION" + echo "VERSION=$VERSION" >> $GITHUB_ENV + + - name: Setup Helm + uses: azure/setup-helm@v4.1.0 + with: + version: ${{ vars.HELM_VERSION }} + + - name: Login with Helm + run: | + echo ${{ secrets.GITHUB_TOKEN }} | helm registry login ${{ vars.HELM_REGISTRY }} --username ${{ github.repository_owner }} --password-stdin + + - name: Add/update Helm dependencies + run: | + helm repo add jupyterhub https://jupyterhub.github.io/helm-chart + helm dependency update "charts/jupyter" + + - name: Lint Helm chart + run: | + helm lint "charts/jupyter" + + - name: Package Helm chart + run: | + helm package "charts/jupyter" --version ${{ env.VERSION }} + + - name: Push Helm chart to repository + if: github.ref == 'refs/heads/release' || github.ref == 'refs/heads/dev' + run: | + helm push "fairspace-jupyter-${{ env.VERSION }}.tgz" "oci://${{ vars.HELM_REGISTRY }}" diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8775251..0000000 --- a/.travis.yml +++ /dev/null @@ -1,92 +0,0 @@ -dist: jammy - -language: java - -env: - global: - - APPNAME="jupyter" - - ORG="fairspace" - - ARTIFACT_BUILD_FILE="" - - BUILD_SCRIPTS_REPO="thehyve/fairspace-build-scripts" - - DEPLOYMENT_CONFIG_REPO="thehyve/fairspace-config-private" - - ACCOUNT_CONFIG_DIR="./.travis" - - RELEASE_BRANCH="master" - - SNAPSHOT_BRANCH="dev" - - DOCKER_USERNAME="fairspace" - - GITHUB_USERNAME="fairspace-ci" - - NEXUS_USERNAME="travis-fairspace" - - GIT_TAG_FILES_OVERRIDE="charts/jupyter/Chart.yaml charts/jupyter/values.yaml projects/" - - SHOULD_DEPLOY=false - # DEPLOYMENT RELATED VARIABLES - REQUIRED IF SHOULD_DEPLOY=true - # - GCP_PROJECT="fairspace-207108" - # - SNAPSHOT_CONTEXT="gke_fairspace-207108_europe-west1-b_fairspacecicluster" - # - SNAPSHOT_CLUSTER_NAME="fairspacecicluster" - # - SNAPSHOT_CLUSTER_ZONE="europe-west1-b" - # - RELEASE_CONTEXT="gke_fairspace-207108_europe-west1-b_fairspacecicluster" - # - RELEASE_CLUSTER_NAME="fairspacecicluster" - # - RELEASE_CLUSTER_ZONE="europe-west1-b" - - # DOCKER_PASSWORD= - - secure: "rINH6k9VSyv0N2vmle6xtT9gB3eSilSVsAmHRln4qkLTWHjLW7jjouehqFiRrdrnzFP+NIaAUdvP6ox3MhtZEFpW/pog0fZSMijpidlsHr9uCbsxhrGXjcZuzwtazaqQ/7+9RP+ofb7j6tPqt5HLCwn0pviom4qc9GztTahJwg9uNa6naiCWqIAkn7w5yqcPQZp6sgjcMYF+pKL6OQHywGp07qatozgqYkZGjtBD7QOKfNDNycVewtMQwI+CIno1/STk9kS0lECfIabETVYwt9Hzjk6811NFAwdKWVrgG+1MOU59uJC/CVbEpEfY/m1vWneWJ68L+DyYlcvzY2/pVC2A+T0L0YzhdiFCQC2xr81ODq7AQ0Y4KdYYrnewP8vJhD2zoJmfucdLpX0f93Q9k1oTd9I3sVbNK+J28N8PE6rc72t1uUA6Tzvht+OyJo5W+h4vm8zs0aWIFVLR6r0ShmindyBI0CFi6VbrvxMTNmzH1PM23oLCs3V66CTiHBBlmxEYud99zLt97/WW74DSju17wosPR9O1G2FlVPlRdhF1S7ELCN1WlFgwll7Ssy5Nk/jWqNK004+Ked3g676a38plphuOQLRKSFD7L1rh4tXli09/xjq8AXBjzyWVEUPHVFnKmDZMcQlixBVuO1FhpS6uFDLOzF6N2bfJkR8lwqI=" - - # GITHUB_PASSWORD=.... - - secure: "f0vVPY7oVWXLq+TpLHDwdiTZDPvwbf2dwyabkf/dtp1qAAIqp0fYheGiNVD/sUvfyWepft763BEEJ7xbiV8VaUU8ee4xZTITo4T6xIzYcs4qkBhKIOXG3FAkQP9FrskbkYxsKWR8xLnnQkIcTOaWagPh/yiuZOGErNezKgHIh0/t3WLgZOTmQc7YT0V8FCXzO5TSQTeyR6DPi/7/kni0Q/I+GE68VTccVYGkeCpadOcam3CR7ycEHhKZbXtgvAubq64WQ+Y13hQwP5MXEf5ePNAT3P38DyVk1ObtveGbbZPUoDxeRR4jWP9bPJJAJtO6o5JFLnbdXuqjVfrgX9vAMirIoeoA0ti677faMCSQXr4ioFe/ZPdR84eL/8VN0Ciu+QRG/U2ursGkaW7FfP8XpFEdHFkSw+BDLtJaGwtqP925TrYw05HBjXEwV2w0chysaufBN5ppPLIUuEkSse2pmXN0aEfg10t1IrqXOG0fqiIb5tnbq0hii1lpuNc7VSw0UrLGqMJQjuwflAcHCQvCrlBjnMbErPs0CXWLmK5MY1wUvchEHuWy1rLDvVzjCcXpW2dTHMvY8xe1VX9Pyim/qzQMR4UHUv6A3SlqZmOlqXHJP6NWT7B73QhLitsWeRVd3I/wCfN+DnAdDC/rB/DuPP/vfDb1z/SGFi7XyoSLrGA=" - -cache: - directories: - - $HOME/downloads - - $HOME/.cache - -before_install: - - export KUBE_CONFIG_ENC_KEY=$encrypted_f973873e750b_key - - export KUBE_CONFIG_ENC_IV=$encrypted_f973873e750b_iv - - git clone https://$GITHUB_USERNAME:$GITHUB_PASSWORD@github.com/$BUILD_SCRIPTS_REPO ci - - export BUILD_SCRIPTS_DIR=$(pwd)/ci - - 'if [[ "$SHOULD_DEPLOY" = "true" ]]; then git clone https://$GITHUB_USERNAME:$GITHUB_PASSWORD@github.com/$DEPLOYMENT_CONFIG_REPO ci-config ; fi' - - 'if [[ "$SHOULD_DEPLOY" = "true" ]]; then export DEPLOYMENT_CONFIG_DIR="$(pwd)/ci-config/fairspace-jupyter" ; fi' - - 'if [[ "$SHOULD_DEPLOY" = "true" ]] && [[ "$TRAVIS_BRANCH" = "$SNAPSHOT_BRANCH" ]]; then export ALLOW_SNAPSHOTS=1 DEPLOY_TARGET=ci DEPLOY_PLATFORM="GCP" KUBERNETES_CONTEXT="$SNAPSHOT_CONTEXT" CLUSTER_NAME="$SNAPSHOT_CLUSTER_NAME" CLUSTER_ZONE="$SNAPSHOT_CLUSTER_ZONE" ; fi' - - 'if [[ "$SHOULD_DEPLOY" = "true" ]] &&[[ "$TRAVIS_BRANCH" = "$RELEASE_BRANCH" ]]; then export DEPLOY_TARGET=ci DEPLOY_PLATFORM="GCP" KUBERNETES_CONTEXT="$RELEASE_CONTEXT" CLUSTER_NAME="$RELEASE_CLUSTER_NAME" CLUSTER_ZONE="$RELEASE_CLUSTER_ZONE" ; fi' - - export INFRASTRUCTURE_PLATFORM="${DEPLOY_PLATFORM:-NONE}" - - source ./ci/setup_env.sh - - 'if [[ "$SHOULD_RELEASE" ]] ; then export NEED_INTERNAL_HELM=1 ; fi' - -jobs: - include: - - stage: build - name: Build projects - install: - - ci/gcp/install.sh - - ci/gcp/login.sh - script: - - .travis/build.sh projects/jupyterhub-hub - - travis_wait 60 .travis/build.sh projects/jupyterhub-singleuser - - stage: build - cache: false - name: Build helm charts - install: - - source charts/.travis/install.sh - script: - - charts/.travis/build.sh - - if: branch = env(RELEASE_BRANCH) AND type != "pull_request" - cache: false - stage: Versioning - name: Set tag and update version - script: - - "ci/versioning/add_tag_to_git.sh" - - "ci/versioning/set_next_version.sh" - - stage: deploy - cache: false - if: env(SHOULD_DEPLOY) = true AND branch IN (env(RELEASE_BRANCH), env(SNAPSHOT_BRANCH)) AND type != pull_request - install: - - source charts/.travis/install.sh - script: - - travis_wait ci/helm/deploy.sh $DEPLOY_TARGET - -notifications: - slack: - rooms: - - secure: "eeFtXTWqUURPcxfyV1FB1Qkud41rx441uka1zCEfStHNCVItoGqEvlS22lyQhk4cl7vEdnl378i+UlXFgWWzuaYIEGL9JTa7+WErfigCjYSkLIujC2bciG02TOhHYe2Pq7PhkyA8gcs3uq89ytuRUTOiy/CIvyS2GbEQrsfxNJU1C5rY5XmOeMIhTRUUF44c4ohGh4QgAHvzynk033hOMuPyQrQUpd4uKhzy3saPtYAa+uPsvqojAryvwAnfojeY8qdtAesVKkF+XBA1i0FLIRt6W4XAp3N4KodwZ9uTUelC8RGgKrB3bdad4Gbe+5n+knd6Zhci1SbhV2l94u1g00obGlETh4QAv6x++zrCqS922pkPMWFY4A7NGInyynT3Hi484UBU1Z6h+2vjjJYj28OF7M79pIoR+zzIysco5xwXaH51U1ZJKfBzzJFKSKR104rwIM0X43l6v+/RLPOPL6MNJQ1TVFSdSonyJ7IWoF63n7PrxYgA4aaySrbTr9bZpM5XXikybwZGPAejeuHTmS0Vb+ge56v4SlF3zJ/9t7Kznp54rtrdnOV8g2Sf/pMmuAAeLlxN8YtymLdS6bk8QhTqBhJkP7eOkDTO13n9DVDYcMUTAn9EJ4tIyXUJRqXPgqvG4TmVLwb/BNOFey5Y4+W0DaY4nsC/JJiHttDzibs=" - template: - - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository_slug}@%{branch}" - - "Latest commit: %{commit_message} - by %{author}" - - "Result: %{result} in %{duration}" diff --git a/.travis/build-condition.sh b/.travis/build-condition.sh deleted file mode 100755 index c707c82..0000000 --- a/.travis/build-condition.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# -# This script will check whether a certain directory contains changes -# and thus should be built. -# -# This check can be overridden by adding [full build] to the commit message -# -# Usage: build-condition.sh -# - -if [[ -z $1 ]]; then - echo "Commit range cannot be empty" - echo "Usage: build-condition.sh " - exit 1 -fi - -if [[ -z $2 ]]; then - echo "Change path cannot be empty" - echo "Usage: build-condition.sh " - exit 1 -fi - -# If the commit message contains '[full build]' then all -# directories should be built -if [[ $TRAVIS_COMMIT_MESSAGE == *"[full build]"* ]]; then - exit 0 -fi - -# When doing a real release (on the release branch) we have to -# build all artifacts, as there have never been other builds for this -# particular version -if [[ "$TRAVIS_BRANCH" = "$RELEASE_BRANCH" ]]; then - exit 0 -fi - -# Check whether the given project directory has changes. If so, the script (grep) will -# return 0. If not, grep will return a non-zero exit code -git diff --name-only $1 | sort -u | uniq | grep ^$2 > /dev/null diff --git a/.travis/build.sh b/.travis/build.sh deleted file mode 100755 index 923b2bd..0000000 --- a/.travis/build.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -DIR=$(dirname $0) -PROJECT=$1 - -# Set variables for use in build scripts -export APPNAME=$(basename $PROJECT) -export CONTAINER_NAME="${DOCKER_REPO}/${ORG}/${APPNAME}:${VERSION}" - -# If we are building a PR, use the target branch as 'commit range'. -# As it is used with `git diff ...`, it will trigger all files that -# have updated in the complete pull request. We also need to do this -# in branches that have just one commit. -if [[ "$TRAVIS_PULL_REQUEST" != "false" ]] || [[ -z "$TRAVIS_COMMIT_RANGE" ]] ; then - COMMIT_TRIGGER=$TRAVIS_BRANCH -else - COMMIT_TRIGGER=$TRAVIS_COMMIT_RANGE -fi - -# Only execute build if something has changed within the project -if $DIR/build-condition.sh $COMMIT_TRIGGER $PROJECT; then - echo "Building $APPNAME..."; - cd $PROJECT - - echo -e "travis_fold:start:Building-$APPNAME" - source .travis/env.sh - .travis/build.sh - rc=$? - echo -e "travis_fold:end:Building-$APPNAME" - - # If the build failed, do not bother releasing - if [[ $rc != 0 ]]; then - exit $rc - fi - - if [[ $SHOULD_RELEASE ]]; then - echo "Releasing artifact for $APPNAME" - echo -e "travis_fold:start:Releasing-$APPNAME" - .travis/release.sh - rc=$? - echo -e "travis_fold:end:Releasing-$APPNAME" - - # If the release failed, return a non-zero exit status - if [[ $rc != 0 ]]; then - exit $rc - fi - - fi - - cd ../.. -else - echo "No changes for $APPNAME"; -fi diff --git a/.travis/ci-service-account.json.enc b/.travis/ci-service-account.json.enc deleted file mode 100644 index ca116f1..0000000 Binary files a/.travis/ci-service-account.json.enc and /dev/null differ diff --git a/charts/.travis/build.sh b/charts/.travis/build.sh deleted file mode 100755 index a6cc8f8..0000000 --- a/charts/.travis/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -$BUILD_SCRIPTS_DIR/helm/tag.sh -source $BUILD_SCRIPTS_DIR/helm/add_repos.sh -$BUILD_SCRIPTS_DIR/helm/build.sh - -if [[ $SHOULD_RELEASE ]]; then - $BUILD_SCRIPTS_DIR/helm/release.sh -fi diff --git a/charts/.travis/install.sh b/charts/.travis/install.sh deleted file mode 100755 index c07d7dd..0000000 --- a/charts/.travis/install.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# shellcheck disable=SC1090 -source "$BUILD_SCRIPTS_DIR/helm/install_helm.sh" - -if [[ $SHOULD_RELEASE ]]; then - "$BUILD_SCRIPTS_DIR/login-provider.sh" - - echo "Adding helm repositories ..." - source "$BUILD_SCRIPTS_DIR/helm/add_repos.sh" - - if [[ $SHOULD_DEPLOY = "true" ]]; then - source "$BUILD_SCRIPTS_DIR/k8s/ics_kubectl.sh" - fi - -fi diff --git a/charts/jupyter/Chart.yaml b/charts/jupyter/Chart.yaml index 5349077..a127eea 100644 --- a/charts/jupyter/Chart.yaml +++ b/charts/jupyter/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 appVersion: "1.0" description: Helm chart to install Jupyter along with a Fairspace workspace -name: jupyter +name: fairspace-jupyter version: 0.0.0-RELEASEVERSION dependencies: diff --git a/charts/jupyter/README.md b/charts/jupyter/README.md index 723ec82..ee5f880 100644 --- a/charts/jupyter/README.md +++ b/charts/jupyter/README.md @@ -7,8 +7,8 @@ The connection to the workspace should be configured in the `values.yaml` file. Install [the Google Cloud SDK](https://cloud.google.com/sdk/install), ensure that your Google account has access to the fairspace-207108 GCP project, -log in using `gcloud auth login`, and configure Docker for access to the GCP -registries using `gcloud auth configure-docker`. +log in using `gcloud auth login`. Make sure you have access to the [docker registry](ghcr.io/thehyve/fairspace-jupyter) +and [Helm Chart repository](ghcr.io/thehyve/fairspace-jupyter/helm-charts). A working instance of a fairspace workspace should be setup. Relevant parameters must be used for configuration of JupyterHub. diff --git a/projects/jupyterhub-hub/.travis/build.sh b/projects/jupyterhub-hub/.travis/build.sh deleted file mode 100755 index e6f0a62..0000000 --- a/projects/jupyterhub-hub/.travis/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -$BUILD_SCRIPTS_DIR/docker/build.sh diff --git a/projects/jupyterhub-hub/.travis/env.sh b/projects/jupyterhub-hub/.travis/env.sh deleted file mode 100755 index 05a7907..0000000 --- a/projects/jupyterhub-hub/.travis/env.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash - diff --git a/projects/jupyterhub-hub/.travis/release.sh b/projects/jupyterhub-hub/.travis/release.sh deleted file mode 100755 index f88d7cd..0000000 --- a/projects/jupyterhub-hub/.travis/release.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -$BUILD_SCRIPTS_DIR/docker/release.sh diff --git a/projects/jupyterhub-hub/VERSION b/projects/jupyterhub-hub/VERSION deleted file mode 100644 index 1c09c74..0000000 --- a/projects/jupyterhub-hub/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.3.3 diff --git a/projects/jupyterhub-singleuser/.travis/build.sh b/projects/jupyterhub-singleuser/.travis/build.sh deleted file mode 100755 index e6f0a62..0000000 --- a/projects/jupyterhub-singleuser/.travis/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -$BUILD_SCRIPTS_DIR/docker/build.sh diff --git a/projects/jupyterhub-singleuser/.travis/env.sh b/projects/jupyterhub-singleuser/.travis/env.sh deleted file mode 100755 index 05a7907..0000000 --- a/projects/jupyterhub-singleuser/.travis/env.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash - diff --git a/projects/jupyterhub-singleuser/.travis/release.sh b/projects/jupyterhub-singleuser/.travis/release.sh deleted file mode 100755 index f88d7cd..0000000 --- a/projects/jupyterhub-singleuser/.travis/release.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -$BUILD_SCRIPTS_DIR/docker/release.sh diff --git a/projects/jupyterhub-singleuser/VERSION b/projects/jupyterhub-singleuser/VERSION deleted file mode 100644 index d15723f..0000000 --- a/projects/jupyterhub-singleuser/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.3.2