From ced38f552c5d217bfeb39a3860f53480722a30ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 20:10:15 +0200 Subject: [PATCH 01/12] Trigger publish on push of this branch for testing purposes, for now --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 56df65ea0..da8d006e7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - # - 4451-new-deployment-with-base-and-code # for testing while developing + - 5065-automatic-deployment-to-stage.ocelot.social-on-push-to-master-branch # for testing while developing jobs: ############################################################################## From 485e6986b88a14db5ab75ed12bab5cdc73592ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 19 Jul 2022 08:30:56 +0200 Subject: [PATCH 02/12] Implement DigitalOcean Kubernetes deployment on publishing --- .github/workflows/publish.yml | 59 ++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index da8d006e7..a2e9c84de 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -246,6 +246,63 @@ jobs: - name: Push maintenance run: docker push --all-tags ocelotsocialnetwork/maintenance + ############################################################################## + # JOB: KUBERNETES DEPLOY LATEST VERSION ###################################### + ############################################################################## + kubernetes_deploy: + # see example https://github.com/do-community/example-doctl-action + # see example https://github.com/do-community/example-doctl-action/blob/main/.github/workflows/workflow.yaml + name: Kubernetes deploy of latest version to stage.ocelot.social cluster at DigitalOcean + runs-on: ubuntu-latest + needs: [upload_to_dockerhub] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # SET ENVS ############################################################### + ########################################################################## + - name: ENV - VERSION + run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_VERSION + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + ########################################################################## + # Install DigitalOceans doctl and set kubeconfig ######################### + ########################################################################## + - name: Install doctl + uses: digitalocean/action-doctl@v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + - name: Save DigitalOcean kubeconfig with short-lived credentials + run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 cluster-stage-ocelot-social + ########################################################################## + # Deploy new Docker images to DigitalOcean Kubernetes cluster ############ + ########################################################################## + # - name: Deploy 'latest' to DigitalOcean Kubernetes + # run: | + # kubectl set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest + # kubectl rollout restart deployment/ocelot-webapp + # kubectl set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest + # kubectl rollout restart deployment/ocelot-backend + # kubectl set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest + # kubectl rollout restart deployment/ocelot-backend + # kubectl set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest + # kubectl rollout restart deployment/ocelot-neo4j + - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes + run: | + kubectl set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION + kubectl set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION + kubectl set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION + kubectl set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION + # - name: Verify deployment + # run: | + # kubectl rollout status deployment/ocelot-webapp + # kubectl rollout status deployment/ocelot-backend + # kubectl rollout status deployment/ocelot-backend + # kubectl rollout status deployment/ocelot-neo4j + ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# ############################################################################## @@ -313,4 +370,4 @@ jobs: release_name: ${{ env.VERSION }} body_path: ./CHANGELOG.md draft: false - prerelease: false \ No newline at end of file + prerelease: false From 794b8b29e11a0c4fc1da456ba2823d0ca23e41cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 19 Jul 2022 18:50:42 +0200 Subject: [PATCH 03/12] Add Neo4j db seed to publish.yml --- .github/workflows/publish.yml | 47 +++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a2e9c84de..2720236fe 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -247,7 +247,7 @@ jobs: run: docker push --all-tags ocelotsocialnetwork/maintenance ############################################################################## - # JOB: KUBERNETES DEPLOY LATEST VERSION ###################################### + # JOB: KUBERNETES DEPLOY ACTUAL/LATEST VERSION ###################################### ############################################################################## kubernetes_deploy: # see example https://github.com/do-community/example-doctl-action @@ -282,26 +282,35 @@ jobs: ########################################################################## # - name: Deploy 'latest' to DigitalOcean Kubernetes # run: | - # kubectl set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest - # kubectl rollout restart deployment/ocelot-webapp - # kubectl set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest - # kubectl rollout restart deployment/ocelot-backend - # kubectl set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest - # kubectl rollout restart deployment/ocelot-backend - # kubectl set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest - # kubectl rollout restart deployment/ocelot-neo4j + # kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest + # kubectl -n default rollout restart deployment/ocelot-webapp + # kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest + # kubectl -n default rollout restart deployment/ocelot-backend + # kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest + # kubectl -n default rollout restart deployment/ocelot-maintenance + # kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest + # kubectl -n default rollout restart deployment/ocelot-neo4j - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes run: | - kubectl set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION - kubectl set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION - kubectl set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION - kubectl set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION - # - name: Verify deployment - # run: | - # kubectl rollout status deployment/ocelot-webapp - # kubectl rollout status deployment/ocelot-backend - # kubectl rollout status deployment/ocelot-backend - # kubectl rollout status deployment/ocelot-neo4j + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-webapp + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-backend + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-maintenance + kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-neo4j + - name: Verify deployment + run: | + kubectl -n default rollout status deployment/ocelot-backend --timeout=240s + kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s + kubectl -n default rollout status deployment/ocelot-webapp --timeout=240s + kubectl -n default rollout status deployment/ocelot-maintenance --timeout=240s + - name: Reset and seed Neo4j database via backend for staging + # db cleaning is only possible if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment + run: | + kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/clean.js" + kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/seed.js" ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# From 7c78474cee3e5d55ba42c4c35a9a0b58aa78353e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 19 Jul 2022 18:51:50 +0200 Subject: [PATCH 04/12] Implement backend constant 'PRODUCTION_DB_CLEAN_ALLOW' to enable cleaning of database for staging, a start --- backend/src/db/clean.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/db/clean.js b/backend/src/db/clean.js index db8e8aad6..c55e31443 100644 --- a/backend/src/db/clean.js +++ b/backend/src/db/clean.js @@ -1,7 +1,7 @@ import { cleanDatabase } from '../db/factories' import CONFIG from '../config' -if (CONFIG.PRODUCTION) { +if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { throw new Error(`You cannot clean the database in production environment!`) } From 16812e0966084128e665f53bed281c9c0e562eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 07:56:43 +0200 Subject: [PATCH 05/12] Disallow database seeding in non-staging and real production environments --- backend/src/db/seed.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/db/seed.js b/backend/src/db/seed.js index 7bfd4f159..92d49e98f 100644 --- a/backend/src/db/seed.js +++ b/backend/src/db/seed.js @@ -6,6 +6,10 @@ import Factory from '../db/factories' import { getNeode, getDriver } from '../db/neo4j' import { gql } from '../helpers/jest' +if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { + throw new Error(`You cannot seed the database in a non-staging and real production environment!`) +} + const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] /* eslint-disable no-multi-spaces */ From 089c4ee1bbbcc958e84d84d45b50367a3276a9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 07:57:45 +0200 Subject: [PATCH 06/12] Refine 'publish.yml' --- .github/workflows/publish.yml | 8 ++++---- backend/src/config/index.js | 2 ++ backend/src/db/clean.js | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2720236fe..d2c20e352 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -300,14 +300,14 @@ jobs: kubectl -n default rollout restart deployment/ocelot-maintenance kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-neo4j - - name: Verify deployment + - name: Verify deployment and wait for the pods of each deplyment to get ready for cleaning and seeding of the database run: | - kubectl -n default rollout status deployment/ocelot-backend --timeout=240s - kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s kubectl -n default rollout status deployment/ocelot-webapp --timeout=240s kubectl -n default rollout status deployment/ocelot-maintenance --timeout=240s + kubectl -n default rollout status deployment/ocelot-backend --timeout=240s + kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s - name: Reset and seed Neo4j database via backend for staging - # db cleaning is only possible if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment + # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment run: | kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/clean.js" kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/seed.js" diff --git a/backend/src/config/index.js b/backend/src/config/index.js index d6d8cc166..6ad8c578b 100644 --- a/backend/src/config/index.js +++ b/backend/src/config/index.js @@ -22,6 +22,8 @@ const environment = { DEBUG: env.NODE_ENV !== 'production' && env.DEBUG, TEST: env.NODE_ENV === 'test', PRODUCTION: env.NODE_ENV === 'production', + // used for staging enviroments if 'PRODUCTION=true' and 'PRODUCTION_DB_CLEAN_ALLOW=true' + PRODUCTION_DB_CLEAN_ALLOW: env.PRODUCTION_DB_CLEAN_ALLOW === 'true' || false, // default = false DISABLED_MIDDLEWARES: (env.NODE_ENV !== 'production' && env.DISABLED_MIDDLEWARES) || false, } diff --git a/backend/src/db/clean.js b/backend/src/db/clean.js index c55e31443..db4e10bdf 100644 --- a/backend/src/db/clean.js +++ b/backend/src/db/clean.js @@ -2,7 +2,7 @@ import { cleanDatabase } from '../db/factories' import CONFIG from '../config' if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { - throw new Error(`You cannot clean the database in production environment!`) + throw new Error(`You cannot clean the database in a non-staging and real production environment!`) } ;(async function () { From 2afd0828eb04237e718b9916421e4eaacfb49bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 08:58:23 +0200 Subject: [PATCH 07/12] Fix undefined 'CONFIG' in 'seed.js' --- backend/src/db/clean.js | 2 +- backend/src/db/seed.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/db/clean.js b/backend/src/db/clean.js index db4e10bdf..eac26036c 100644 --- a/backend/src/db/clean.js +++ b/backend/src/db/clean.js @@ -1,5 +1,5 @@ -import { cleanDatabase } from '../db/factories' import CONFIG from '../config' +import { cleanDatabase } from '../db/factories' if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { throw new Error(`You cannot clean the database in a non-staging and real production environment!`) diff --git a/backend/src/db/seed.js b/backend/src/db/seed.js index 92d49e98f..46c5870e0 100644 --- a/backend/src/db/seed.js +++ b/backend/src/db/seed.js @@ -1,5 +1,6 @@ import sample from 'lodash/sample' import { createTestClient } from 'apollo-server-testing' +import CONFIG from '../config' import createServer from '../server' import faker from '@faker-js/faker' import Factory from '../db/factories' From 884f7774605794ee92c67afdac143d518f5dfc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:26:11 +0200 Subject: [PATCH 08/12] Change order of deployments and the timeout to wait for in 'publish.yml' --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d2c20e352..0c2a69f24 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -302,10 +302,10 @@ jobs: kubectl -n default rollout restart deployment/ocelot-neo4j - name: Verify deployment and wait for the pods of each deplyment to get ready for cleaning and seeding of the database run: | - kubectl -n default rollout status deployment/ocelot-webapp --timeout=240s - kubectl -n default rollout status deployment/ocelot-maintenance --timeout=240s - kubectl -n default rollout status deployment/ocelot-backend --timeout=240s - kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s + kubectl -n default rollout status deployment/ocelot-backend --timeout=400s + kubectl -n default rollout status deployment/ocelot-neo4j --timeout=400s + kubectl -n default rollout status deployment/ocelot-maintenance --timeout=400s + kubectl -n default rollout status deployment/ocelot-webapp --timeout=400s - name: Reset and seed Neo4j database via backend for staging # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment run: | From d39f53359a90fa443b57e25c7a543c0faccccd66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:57:02 +0200 Subject: [PATCH 09/12] Change timeout to wait for rollout status to '600s' in 'publish.yml' --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0c2a69f24..3b4913d22 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -302,10 +302,10 @@ jobs: kubectl -n default rollout restart deployment/ocelot-neo4j - name: Verify deployment and wait for the pods of each deplyment to get ready for cleaning and seeding of the database run: | - kubectl -n default rollout status deployment/ocelot-backend --timeout=400s - kubectl -n default rollout status deployment/ocelot-neo4j --timeout=400s - kubectl -n default rollout status deployment/ocelot-maintenance --timeout=400s - kubectl -n default rollout status deployment/ocelot-webapp --timeout=400s + kubectl -n default rollout status deployment/ocelot-backend --timeout=600s + kubectl -n default rollout status deployment/ocelot-neo4j --timeout=600s + kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s + kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s - name: Reset and seed Neo4j database via backend for staging # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment run: | From cb90ceeefc1f6584d9b9bce0ef4d183303097aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 10:29:24 +0200 Subject: [PATCH 10/12] Stop waiting for rollout of 'webapp' and 'maintenance' in 'publish.yml' --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3b4913d22..e4b8b8bb1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -304,8 +304,8 @@ jobs: run: | kubectl -n default rollout status deployment/ocelot-backend --timeout=600s kubectl -n default rollout status deployment/ocelot-neo4j --timeout=600s - kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s - kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s + # kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s + # kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s - name: Reset and seed Neo4j database via backend for staging # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment run: | From e2089f36b5da278bbf31db438e58e6aebf92407b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 12:43:58 +0200 Subject: [PATCH 11/12] Accumulate Neo4j db 'clean.js' and 'seed.js' and make the node calls await with flag '--experimental-repl-await' in 'publish.yml' --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e4b8b8bb1..5d31987d4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -309,8 +309,7 @@ jobs: - name: Reset and seed Neo4j database via backend for staging # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment run: | - kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/clean.js" - kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/seed.js" + kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await dist/db/clean.js && node --experimental-repl-await dist/db/seed.js" ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# From 6c6435266221a9ca4de63112c5549c73fcb54ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 13:53:09 +0200 Subject: [PATCH 12/12] change back to publish just on master branch push --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5d31987d4..ff149b6bc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 5065-automatic-deployment-to-stage.ocelot.social-on-push-to-master-branch # for testing while developing + # - 5065-automatic-deployment-to-stage.ocelot.social-on-push-to-master-branch # for testing while developing jobs: ##############################################################################