From 2388090add8c54be075968f8588e0865e347cd54 Mon Sep 17 00:00:00 2001 From: apostolof Date: Sat, 13 Feb 2021 17:02:35 +0200 Subject: [PATCH] feat: add ci-cd configuration --- jenkins/Jenkinsfile | 739 ++++++++++++++++++ jenkins/env/concordia.production.jenkins.env | 16 + jenkins/env/concordia.staging.jenkins.env | 16 + jenkins/env/contracts.production.jenkins.env | 8 + jenkins/env/contracts.provider.production.env | 8 + jenkins/env/contracts.provider.staging.env | 8 + jenkins/env/contracts.staging.jenkins.env | 8 + jenkins/env/contracts.test.jenkins.env | 4 + jenkins/env/ganache.production.jenkins.env | 10 + jenkins/env/ganache.staging.jenkins.env | 10 + jenkins/env/ganache.test.jenkins.env | 6 + jenkins/env/pinner.production.jenkins.env | 20 + jenkins/env/pinner.staging.jenkins.env | 20 + 13 files changed, 873 insertions(+) create mode 100755 jenkins/Jenkinsfile create mode 100755 jenkins/env/concordia.production.jenkins.env create mode 100755 jenkins/env/concordia.staging.jenkins.env create mode 100755 jenkins/env/contracts.production.jenkins.env create mode 100755 jenkins/env/contracts.provider.production.env create mode 100755 jenkins/env/contracts.provider.staging.env create mode 100755 jenkins/env/contracts.staging.jenkins.env create mode 100755 jenkins/env/contracts.test.jenkins.env create mode 100755 jenkins/env/ganache.production.jenkins.env create mode 100755 jenkins/env/ganache.staging.jenkins.env create mode 100755 jenkins/env/ganache.test.jenkins.env create mode 100755 jenkins/env/pinner.production.jenkins.env create mode 100755 jenkins/env/pinner.staging.jenkins.env diff --git a/jenkins/Jenkinsfile b/jenkins/Jenkinsfile new file mode 100755 index 0000000..d6aab72 --- /dev/null +++ b/jenkins/Jenkinsfile @@ -0,0 +1,739 @@ +#!groovy + +def cleanSlateEnabled + +// Package change state +def appPackageChanged +def contractsPackageChanged +def contractsProviderPackageChanged +def pinnerPackageChanged +def sharedPackageChanged + +// Package versions +def appPackageVersion +def contractsPackageVersion +def contractsProviderPackageVersion +def pinnerPackageVersion +def sharedPackageVersion + +// Docker images +def appImage +def appTestsImage +def contractsImage +def contractsTestsImage +def contractsProviderImage +def pinnerImage + +def freshGanacheStagingRunning +def freshGanacheProductionRunning + +pipeline { + agent any + + post { + failure { + updateGitlabCommitStatus name: 'build', state: 'failed' + } + success { + updateGitlabCommitStatus name: 'build', state: 'success' + } + always { + archiveArtifacts artifacts: "reports/${BUILD_NUMBER}/**/* , build/**/*, ganache/*", fingerprint: true + sleep 2 + sh 'docker images | grep -E "ecentrics/concordia.+tests" | tr -s \' \' | cut -d \' \' -f 3 | xargs --no-run-if-empty docker rmi -f || true' + sh 'docker images | grep -E "ecentrics/concordia.+staging" | tr -s \' \' | cut -d \' \' -f 3 | xargs --no-run-if-empty docker rmi -f || true' + sh 'docker system prune -f' + sh 'rm -rf reports' + sh 'rm -rf build' + } + } + options { + gitLabConnection('apella') + } + triggers { + gitlab(triggerOnPush: true, triggerOnMergeRequest: true, branchFilterType: 'All') + } + environment { + DOCKER_BUILDKIT='1' + } + + stages { + stage ('VERSION') { + steps { + script { + cleanSlateEnabled = sh (script: "git log -1 | grep -qE 'ci: force'", returnStatus: true) + + appPackageChanged = sh(script: 'bash ./jenkins/check_package_changed.sh app "$GIT_COMMIT" "$GIT_PREVIOUS_COMMIT"', returnStdout: true).trim() + contractsPackageChanged = sh(script: 'bash ./jenkins/check_package_changed.sh contracts "$GIT_COMMIT" "$GIT_PREVIOUS_COMMIT"', returnStdout: true).trim() + contractsProviderPackageChanged = sh(script: 'bash ./jenkins/check_package_changed.sh concordia-contracts-provider "$GIT_COMMIT" "$GIT_PREVIOUS_COMMIT"', returnStdout: true).trim() + pinnerPackageChanged = sh(script: 'bash ./jenkins/check_package_changed.sh pinner "$GIT_COMMIT" "$GIT_PREVIOUS_COMMIT"', returnStdout: true).trim() + sharedPackageChanged = sh(script: 'bash ./jenkins/check_package_changed.sh shared "$GIT_COMMIT" "$GIT_PREVIOUS_COMMIT"', returnStdout: true).trim() + + appPackageVersion = sh(script: 'grep "\\"version\\":" ./packages/concordia-app/package.json | head -1 | awk -F: \'{ print $2 }\' | sed \'s/[",]//g\' | tr -d \'[[:space:]]\'', returnStdout: true).trim() + contractsPackageVersion = sh(script: 'grep "\\"version\\":" ./packages/concordia-contracts/package.json | head -1 | awk -F: \'{ print $2 }\' | sed \'s/[",]//g\' | tr -d \'[[:space:]]\'', returnStdout: true).trim() + contractsProviderPackageVersion = sh(script: 'grep "\\"version\\":" ./packages/concordia-contracts-provider/package.json | head -1 | awk -F: \'{ print $2 }\' | sed \'s/[",]//g\' | tr -d \'[[:space:]]\'', returnStdout: true).trim() + pinnerPackageVersion = sh(script: 'grep "\\"version\\":" ./packages/concordia-pinner/package.json | head -1 | awk -F: \'{ print $2 }\' | sed \'s/[",]//g\' | tr -d \'[[:space:]]\'', returnStdout: true).trim() + sharedPackageVersion = sh(script: 'grep "\\"version\\":" ./packages/concordia-shared/package.json | head -1 | awk -F: \'{ print $2 }\' | sed \'s/[",]//g\' | tr -d \'[[:space:]]\'', returnStdout: true).trim() + + echo "Package: app, Version: ${appPackageVersion}, Changed: ${appPackageChanged}" + echo "Package: contracts, Version: ${contractsPackageVersion}, Changed: ${contractsPackageChanged}" + echo "Package: contracts-provider, Version: ${contractsProviderPackageVersion}, Changed: ${contractsProviderPackageChanged}" + echo "Package: pinner, Version: ${pinnerPackageVersion}, Changed: ${pinnerPackageChanged}" + echo "Package: shared, Version: ${sharedPackageVersion}, Changed: ${sharedPackageChanged}" + } + } + } + + stage('TEST') { + parallel { + stage('TEST CONTRACTS') { + steps { + script { + try { + echo "${BRANCH_NAME}-${BUILD_NUMBER}" + def ganacheTestPort = sh(script: "bash ./jenkins/hash_build_properties.sh ${BRANCH_NAME} ${BUILD_NUMBER} | xargs bash ./jenkins/map_to_thousand.sh", returnStdout: true).trim() + echo "$ganacheTestPort" + + def ganacheTestImage = docker.build( + "ecentrics/concordia-ganache", + "-f docker/ganache/Dockerfile \ + ./" + ) + + sh 'docker network create --driver bridge concordia_ganache_test_network || true' + + ganacheTestImage.withRun("""-d -p 6${ganacheTestPort}:8546 \ + --env-file=./jenkins/env/ganache.test.jenkins.env \ + --name concordia-ganache-test-6${ganacheTestPort} \ + --net=concordia_ganache_test_network""") { concordiaGanacheTest -> + + contractsTestsImage = docker.build( + "ecentrics/concordia-contracts-tests:v${contractsPackageVersion}-b${BUILD_NUMBER}-tests", + "-f docker/concordia-contracts/Dockerfile \ + ./ \ + --target test \ + --build-arg TZ=Europe/Athens" + ) + + contractsTestsImage.run("""--rm \ + -v ecentrics_janus_common:/mnt/concordia/test-reports/ \ + --env-file=./jenkins/env/contracts.test.jenkins.env \ + -e WEB3_HOST=concordia-ganache-test-6${ganacheTestPort} \ + -e WEB3_PORT=6${ganacheTestPort} \ + --net=concordia_ganache_test_network""") + + sh 'mkdir -p ./reports/${BUILD_NUMBER}/contracts' + sh 'find /mnt/janus/common/ -name "concordia-contracts-*" -exec cp \'{}\' ./reports/${BUILD_NUMBER}/contracts/ \\;' + } + } catch (e) { + error('Some tests failed!') + error('Aborting the build.') + throw e + } + } + } + } + + stage('TEST APP') { + steps { + script { + appTestsImage = docker.build( + "ecentrics/concordia-app:v${appPackageVersion}-b${BUILD_NUMBER}-tests", + "-f docker/concordia-app/Dockerfile \ + ./ \ + --target test \ + --build-arg TZ=Europe/Athens" + ) + + try { + appTestsImage.run('--rm \ + -v ecentrics_janus_common:/mnt/concordia/test-reports/') + + sh 'mkdir -p ./reports/${BUILD_NUMBER}/app' + sh 'find /mnt/janus/common/ -name "concordia-app-*" -exec cp \'{}\' ./reports/${BUILD_NUMBER}/app/ \\;' + } catch (e) { + error('Some tests failed!') + error('Aborting the build.') + throw e + } + } + } + } + } + } + + stage('BUILD FOR PRODUCTION') { + when { + branch 'master' + } + parallel { + stage('BUILD CONTRACTS') { + when { + expression { + return "${contractsPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + contractsImage = docker.build( + "ecentrics/concordia-contracts-migrate:v${contractsPackageVersion}", + "-f docker/concordia-contracts/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + + contractsImage.run('--rm \ + -v ecentrics_janus_common:/mnt/concordia/build \ + --entrypoint=sh', + "-c 'mkdir -p /mnt/concordia/build/contract-artifacts && cp /usr/src/concordia/packages/concordia-contracts/build/* /mnt/concordia/build/contract-artifacts'") + + sh 'mkdir -p ./build/${BUILD_NUMBER}/contracts' + sh 'cp /mnt/janus/common/contract-artifacts/* ./build/${BUILD_NUMBER}/contracts' + } + } + } + + stage('BUILD APP') { + when { + expression { + return "${appPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + appImage = docker.build( + "ecentrics/concordia-app:v${appPackageVersion}", + "-f docker/concordia-app/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + + stage('BUILD CONTRACTS PROVIDER') { + when { + expression { + return "${contractsProviderPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + contractsProviderImage = docker.build( + "ecentrics/concordia-contracts-provider:v${contractsProviderPackageVersion}", + "-f docker/concordia-contracts-provider/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + + stage('BUILD PINNER') { + when { + expression { + return "${pinnerPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + pinnerImage = docker.build( + "ecentrics/concordia-pinner:v${pinnerPackageVersion}", + "-f docker/concordia-pinner/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + } + } + + stage('BUILD FOR STAGING') { + when { + branch 'develop' + } + parallel { + stage('BUILD CONTRACTS') { + when { + expression { + return "${contractsPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + contractsImage = docker.build( + "ecentrics/concordia-contracts-migrate:v${contractsPackageVersion}-staging-b${BUILD_NUMBER}", + "-f docker/concordia-contracts/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + + // Get contract artifacts + contractsImage.run('--rm \ + -v ecentrics_janus_common:/mnt/concordia/build \ + --entrypoint=sh', + "-c 'mkdir -p /mnt/concordia/build/contract-artifacts && cp /usr/src/concordia/packages/concordia-contracts/build/* /mnt/concordia/build/contract-artifacts'") + + sh 'mkdir -p ./build/${BUILD_NUMBER}/contracts' + sh 'cp /mnt/janus/common/contract-artifacts/* ./build/${BUILD_NUMBER}/contracts' + } + } + } + + stage('BUILD APP') { + when { + expression { + return "${appPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + appImage = docker.build( + "ecentrics/concordia-app:v${appPackageVersion}-staging-b${BUILD_NUMBER}", + "-f docker/concordia-app/Dockerfile \ + ./ \ + --target staging \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + + stage('BUILD CONTRACTS PROVIDER') { + when { + expression { + return "${contractsProviderPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + contractsProviderImage = docker.build( + "ecentrics/concordia-contracts-provider:v${contractsProviderPackageVersion}-staging-b${BUILD_NUMBER}", + "-f docker/concordia-contracts-provider/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + + stage('BUILD PINNER') { + when { + expression { + return "${pinnerPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + pinnerImage = docker.build( + "ecentrics/concordia-pinner:v${pinnerPackageVersion}-staging-b${BUILD_NUMBER}", + "-f docker/concordia-pinner/Dockerfile \ + ./ \ + --build-arg TZ=Europe/Athens" + ) + } + } + } + } + } + + stage('PUBLISH') { + when { + branch 'master' + } + parallel { + stage('PUBLISH CONTRACTS') { + when { + expression { + return "${contractsPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + docker.withRegistry('https://registry.hub.docker.com/', 'docker-hub-concordia') { + contractsImage.push() + contractsImage.push('latest') + } + } + } + } + + stage('PUBLISH APP') { + when { + expression { + return "${appPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + docker.withRegistry('https://registry.hub.docker.com/', 'docker-hub-concordia') { + appImage.push() + appImage.push('latest') + } + } + } + } + + stage('PUBLISH CONTRACTS PROVIDER') { + when { + expression { + return "${contractsProviderPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + docker.withRegistry('https://registry.hub.docker.com/', 'docker-hub-concordia') { + contractsProviderImage.push() + contractsProviderImage.push('latest') + } + } + } + } + + stage('PUBLISH PINNER') { + when { + expression { + return "${pinnerPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + docker.withRegistry('https://registry.hub.docker.com/', 'docker-hub-concordia') { + pinnerImage.push() + pinnerImage.push('latest') + } + } + } + } + } + } + + stage('DEPLOY STAGING') { + when { + branch 'develop' + } + stages { + stage('STAGING DEPLOY PREPARATION') { + steps { + script { + sh 'docker network create --driver bridge ecentrics_concordia_staging_network || true' + + def rendezvousServerRunning = sh (script: 'docker ps -f name=concordia-rendezvous | \ + grep -qE concordia-rendezvous', returnStatus: true) + + if ("$rendezvousServerRunning" == '1') { + sh 'docker run \ + -d \ + -p 9090:9090 \ + --name concordia-rendezvous \ + --net=ecentrics_concordia_staging_network \ + libp2p/js-libp2p-webrtc-star:version-0.20.5' + } else { + sh 'docker network connect ecentrics_concordia_staging_network concordia-rendezvous || true' + } + } + } + } + + stage('DEPLOY CONTRACTS PROVIDER') { + when { + expression { + def contractsProviderStagingRunning = sh (script: 'docker ps -f name=concordia-contracts-provider-staging | \ + grep -qE concordia-contracts-provider-staging', returnStatus: true) + return "${contractsProviderPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "$contractsProviderStagingRunning" == '1' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh 'docker stop concordia-contracts-provider-staging || true \ + && docker rm concordia-contracts-provider-staging || true' + + sh 'if [ "$cleanSlateEnabled" -eq "0" ]; then \ + docker volume rm concordia-contracts-provider-staging || true; \ + fi' + + sh (script: """docker run \ + -d \ + -v concordia-contracts-provider-staging:/mnt/concordia/contracts \ + --env-file=./jenkins/env/contracts.provider.staging.env \ + -p 8450:8450 \ + --name concordia-contracts-provider-staging \ + --net=ecentrics_concordia_staging_network \ + ecentrics/concordia-contracts-provider:v${contractsProviderPackageVersion}-staging-b${BUILD_NUMBER}""") + } + } + } + + stage('RECREATE GANACHE') { + when { + expression { + def ganacheStagingRunning = sh (script: 'docker ps -f name=concordia-ganache-staging | \ + grep -qE concordia-ganache-staging', returnStatus: true) + return "$cleanSlateEnabled" == '0' || "$ganacheStagingRunning" == '1'; + } + } + steps { + script { + sh 'docker stop concordia-ganache-staging || true \ + && docker rm concordia-ganache-staging || true' + + sh 'docker volume rm concordia-ganache-staging || true' + + sh (script: 'docker run \ + -d \ + -v concordia-ganache-staging:/mnt/concordia/ganache_keys \ + -p 8555:8555 \ + --env-file=./jenkins/env/ganache.staging.jenkins.env \ + --name concordia-ganache-staging \ + --net=ecentrics_concordia_staging_network \ + ecentrics/concordia-ganache:latest') + + // Ganache image might take a while to come alive + sleep 10 + + sh 'mkdir -p ./ganache/ && docker cp concordia-ganache-staging:/mnt/concordia/ganache_keys/keys.json ./ganache/' + freshGanacheStagingRunning = true + } + } + } + + stage('DEPLOY CONTRACTS') { + when { + expression { + return "${contractsPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "$freshGanacheStagingRunning" || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh """docker run \ + --rm \ + --env-file=./jenkins/env/contracts.staging.jenkins.env \ + -e CONTRACTS_VERSION_HASH=${contractsPackageVersion}-dev \ + --net=ecentrics_concordia_staging_network \ + ecentrics/concordia-contracts-migrate:v${contractsPackageVersion}-staging-b${BUILD_NUMBER}""" + } + } + } + + stage('DEPLOY PINNER') { + when { + expression { + def pinnerStagingRunning = sh (script: 'docker ps -f name=concordia-pinner-staging | \ + grep -qE concordia-pinner-staging', returnStatus: true) + return "${pinnerPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "${contractsPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh 'docker stop concordia-pinner-staging || true \ + && docker rm concordia-pinner-staging || true' + + sh 'if [ "$cleanSlateEnabled" -eq "0" ]; then \ + docker volume rm concordia-pinner-staging || true; \ + fi' + + sh """docker run \ + -d \ + -v concordia-pinner-staging:/mnt/concordia/orbitdb \ + -p 5555:5555 \ + --env-file=./jenkins/env/pinner.staging.jenkins.env \ + --name concordia-pinner-staging \ + --net=ecentrics_concordia_staging_network \ + ecentrics/concordia-pinner:v${pinnerPackageVersion}-staging-b${BUILD_NUMBER}""" + } + } + } + + stage('DEPLOY APP') { + when { + expression { + def pinnerStagingRunning = sh (script: 'docker ps -f name=concordia-app-staging | \ + grep -qE concordia-app-staging', returnStatus: true) + return "${appPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "${sharedPackageChanged}" == '0'; + } + } + + steps { + script { + sh 'docker stop concordia-app-staging || true \ + && docker rm concordia-app-staging || true' + + sh """docker run \ + -itd \ + -p 7000:3000 \ + --env-file=./jenkins/env/concordia.staging.jenkins.env \ + --name concordia-app-staging \ + ecentrics/concordia-app:v${appPackageVersion}-staging-b${BUILD_NUMBER}""" + } + } + } + } + } + + stage('DEPLOY PRODUCTION') { + when { + branch 'master' + } + stages { + stage('PRODUCTION DEPLOY PREPARATION') { + steps { + script { + sh 'docker network create --driver bridge ecentrics_concordia_production_network || true' + + def rendezvousServerRunning = sh (script: 'docker ps -f name=concordia-rendezvous | \ + grep -qE concordia-rendezvous', returnStatus: true) + + if ("$rendezvousServerRunning" == '1') { + sh 'docker run \ + -d \ + -p 9090:9090 \ + --name concordia-rendezvous \ + --net=ecentrics_concordia_production_network \ + libp2p/js-libp2p-webrtc-star:version-0.20.5' + } else { + sh 'docker network connect ecentrics_concordia_production_network concordia-rendezvous || true' + } + } + } + } + + stage('DEPLOY CONTRACTS PROVIDER') { + when { + expression { + def contractsProviderProductionRunning = sh (script: 'docker ps -f name=concordia-contracts-provider-production | \ + grep -qE concordia-contracts-provider-production', returnStatus: true) + return "${contractsProviderPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "$contractsProviderProductionRunning" == '1' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh 'docker stop concordia-contracts-provider-production || true \ + && docker rm concordia-contracts-provider-production || true' + + sh 'if [ "$cleanSlateEnabled" -eq "0" ]; then \ + docker volume rm concordia-contracts-provider-production || true; \ + fi' + + sh (script: """docker run \ + -d \ + -v concordia-contracts-provider-production:/mnt/concordia/contracts \ + --env-file=./jenkins/env/contracts.provider.production.env \ + -e NODE_ENV=production \ + -p 8400:8400 \ + --name concordia-contracts-provider-production \ + --net=ecentrics_concordia_production_network \ + ecentrics/concordia-contracts-provider:v${contractsProviderPackageVersion}""") + } + } + } + + stage('RECREATE GANACHE') { + when { + expression { + def ganacheProductionRunning = sh (script: 'docker ps -f name=concordia-ganache-production | \ + grep -qE concordia-ganache-production', returnStatus: true) + return "$cleanSlateEnabled" == '0' || "$ganacheProductionRunning" == '1'; + } + } + steps { + script { + sh 'docker stop concordia-ganache-production || true \ + && docker rm concordia-ganache-production || true' + + sh 'docker volume rm concordia-ganache-production || true' + + sh (script: 'docker run \ + -d \ + -v concordia-ganache-production:/mnt/concordia/ganache_keys \ + -p 8545:8545 \ + --env-file=./jenkins/env/ganache.production.jenkins.env \ + --name concordia-ganache-production \ + --net=ecentrics_concordia_production_network \ + ecentrics/concordia-ganache:latest') + + // Ganache image might take a while to come alive + sleep 10 + + sh 'mkdir -p ./ganache/ && docker cp concordia-ganache-production:/mnt/concordia/ganache_keys/keys.json ./ganache/' + freshGanacheProductionRunning = true + } + } + } + + stage('DEPLOY CONTRACTS') { + when { + expression { + return "${contractsPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "$freshGanacheProductionRunning" || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh """docker run \ + --rm \ + --env-file=./jenkins/env/contracts.production.jenkins.env \ + -e CONTRACTS_VERSION_HASH=${contractsPackageVersion} \ + --net=ecentrics_concordia_production_network \ + ecentrics/concordia-contracts-migrate:v${contractsPackageVersion}""" + } + } + } + + stage('DEPLOY PINNER') { + when { + expression { + def pinnerProductionRunning = sh (script: 'docker ps -f name=concordia-pinner-production | \ + grep -qE concordia-pinner-production', returnStatus: true) + return "${pinnerPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' || "${pinnerProductionRunning}" == '1' || "${contractsPackageChanged}" == '0' || "${sharedPackageChanged}" == '0'; + } + } + steps { + script { + sh 'docker stop concordia-pinner-production || true \ + && docker rm concordia-pinner-production || true' + + sh 'if [ "$cleanSlateEnabled" -eq "0" ]; then \ + docker volume rm concordia-pinner-production || true; \ + fi' + + sh """docker run \ + -d \ + -v concordia-pinner-production:/mnt/concordia/orbitdb \ + -p 4444:4444 \ + -e NODE_ENV=production \ + --env-file=./jenkins/env/pinner.production.jenkins.env \ + --name concordia-pinner-production \ + --net=ecentrics_concordia_production_network \ + ecentrics/concordia-pinner:v${pinnerPackageVersion}""" + } + } + } + + stage('DEPLOY APP') { + when { + expression { + def appProductionRunning = sh (script: 'docker ps -f name=concordia-app-production | \ + grep -qE concordia-app-production', returnStatus: true) + return "${appPackageChanged}" == '0' || "$cleanSlateEnabled" == '0' ||"${appProductionRunning}" == '1' || "${sharedPackageChanged}" == '0'; + } + } + + steps { + script { + sh 'docker stop concordia-app-production || true \ + && docker rm concordia-app-production || true' + + sh """docker run \ + -d \ + -p 7777:80 \ + --env-file=./jenkins/env/concordia.production.jenkins.env \ + --name concordia-app-production \ + ecentrics/concordia-app:v${appPackageVersion}""" + } + } + } + } + } + } +} + diff --git a/jenkins/env/concordia.production.jenkins.env b/jenkins/env/concordia.production.jenkins.env new file mode 100755 index 0000000..9dc3550 --- /dev/null +++ b/jenkins/env/concordia.production.jenkins.env @@ -0,0 +1,16 @@ +VIRTUAL_HOST=concordia.ecentrics.net +VIRTUAL_PORT=7777 +LETSENCRYPT_HOST=concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +# Variables needed in runtime (in browser) +REACT_APP_CONCORDIA_HOST=concordia.ecentrics.net +REACT_APP_CONCORDIA_PORT=7777 + +REACT_APP_RENDEZVOUS_HOST=rendezvous.ecentrics.net +REACT_APP_RENDEZVOUS_PORT=9090 + +REACT_APP_USE_EXTERNAL_CONTRACTS_PROVIDER=true +REACT_APP_CONTRACTS_PROVIDER_HOST=contracts.concordia.ecentrics.net +REACT_APP_CONTRACTS_PROVIDER_PORT=8400 +REACT_APP_CONTRACTS_VERSION_HASH=stable diff --git a/jenkins/env/concordia.staging.jenkins.env b/jenkins/env/concordia.staging.jenkins.env new file mode 100755 index 0000000..49278b2 --- /dev/null +++ b/jenkins/env/concordia.staging.jenkins.env @@ -0,0 +1,16 @@ +VIRTUAL_HOST=staging.concordia.ecentrics.net +VIRTUAL_PORT=7000 +LETSENCRYPT_HOST=staging.concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +# Variables needed in runtime (in browser) +REACT_APP_CONCORDIA_HOST=staging.concordia.ecentrics.net +REACT_APP_CONCORDIA_PORT=7000 + +REACT_APP_RENDEZVOUS_HOST=rendezvous.ecentrics.net +REACT_APP_RENDEZVOUS_PORT=9090 + +REACT_APP_USE_EXTERNAL_CONTRACTS_PROVIDER=true +REACT_APP_CONTRACTS_PROVIDER_HOST=staging.contracts.concordia.ecentrics.net +REACT_APP_CONTRACTS_PROVIDER_PORT=8450 +REACT_APP_CONTRACTS_VERSION_HASH=latest diff --git a/jenkins/env/contracts.production.jenkins.env b/jenkins/env/contracts.production.jenkins.env new file mode 100755 index 0000000..de1fc9d --- /dev/null +++ b/jenkins/env/contracts.production.jenkins.env @@ -0,0 +1,8 @@ +# Variables needed in runtime +MIGRATE_NETWORK=env +WEB3_HOST=concordia-ganache-production +WEB3_PORT=8545 + +CONTRACTS_PROVIDER_HOST=contracts.concordia.ecentrics.net +CONTRACTS_PROVIDER_PORT=8400 +CONTRACTS_VERSION_TAG=stable diff --git a/jenkins/env/contracts.provider.production.env b/jenkins/env/contracts.provider.production.env new file mode 100755 index 0000000..e2b1437 --- /dev/null +++ b/jenkins/env/contracts.provider.production.env @@ -0,0 +1,8 @@ +VIRTUAL_HOST=contracts.concordia.ecentrics.net +VIRTUAL_PORT=8400 +LETSENCRYPT_HOST=contracts.concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +CONTRACTS_PROVIDER_PORT=8400 +UPLOAD_CONTRACTS_DIRECTORY=/mnt/concordia/contracts/ +CORS_ALLOWED_ORIGINS="concordia.ecentrics.net;http://concordia.ecentrics.net;https://concordia.ecentrics.net;concordia.ecentrics.net:7777;http://concordia.ecentrics.net:7777;https://concordia.ecentrics.net:7777;127.0.0.1;http://127.0.0.1;127.0.0.1:7777;http://127.0.0.1" diff --git a/jenkins/env/contracts.provider.staging.env b/jenkins/env/contracts.provider.staging.env new file mode 100755 index 0000000..489ded6 --- /dev/null +++ b/jenkins/env/contracts.provider.staging.env @@ -0,0 +1,8 @@ +VIRTUAL_HOST=staging.contracts.concordia.ecentrics.net +VIRTUAL_PORT=8450 +LETSENCRYPT_HOST=staging.contracts.concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +CONTRACTS_PROVIDER_PORT=8450 +UPLOAD_CONTRACTS_DIRECTORY=/mnt/concordia/contracts/ +#CORS_ALLOWED_ORIGINS="staging.concordia.ecentrics.net;http://staging.concordia.ecentrics.net;https://staging.concordia.ecentrics.net;staging.concordia.ecentrics.net:7000;http://staging.concordia.ecentrics.net:7000;https://staging.concordia.ecentrics.net:7000;172.21.0.4;http://172.21.0.4;127.0.0.1;http://127.0.0.1" diff --git a/jenkins/env/contracts.staging.jenkins.env b/jenkins/env/contracts.staging.jenkins.env new file mode 100755 index 0000000..924f433 --- /dev/null +++ b/jenkins/env/contracts.staging.jenkins.env @@ -0,0 +1,8 @@ +# Variables needed in runtime +MIGRATE_NETWORK=env +WEB3_HOST=concordia-ganache-staging +WEB3_PORT=8555 + +CONTRACTS_PROVIDER_HOST=staging.contracts.concordia.ecentrics.net +CONTRACTS_PROVIDER_PORT=8450 +CONTRACTS_VERSION_TAG=latest diff --git a/jenkins/env/contracts.test.jenkins.env b/jenkins/env/contracts.test.jenkins.env new file mode 100755 index 0000000..8489346 --- /dev/null +++ b/jenkins/env/contracts.test.jenkins.env @@ -0,0 +1,4 @@ +# Variables needed in runtime +MIGRATE_NETWORK=env +WEB3_HOST=concordia-ganache-test +WEB3_PORT=8546 diff --git a/jenkins/env/ganache.production.jenkins.env b/jenkins/env/ganache.production.jenkins.env new file mode 100755 index 0000000..c97e078 --- /dev/null +++ b/jenkins/env/ganache.production.jenkins.env @@ -0,0 +1,10 @@ +VIRTUAL_HOST=ganache.ecentrics.net +VIRTUAL_PORT=8545 +LETSENCRYPT_HOST=ganache.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +ACCOUNTS_NUMBER=1000 +ACCOUNTS_ETHER=100000 +HOST=0.0.0.0 +PORT=8545 +NETWORK_ID=5778 diff --git a/jenkins/env/ganache.staging.jenkins.env b/jenkins/env/ganache.staging.jenkins.env new file mode 100755 index 0000000..ce93acd --- /dev/null +++ b/jenkins/env/ganache.staging.jenkins.env @@ -0,0 +1,10 @@ +VIRTUAL_HOST=staging.ganache.ecentrics.net +VIRTUAL_PORT=8555 +LETSENCRYPT_HOST=staging.ganache.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +ACCOUNTS_NUMBER=100 +ACCOUNTS_ETHER=1000 +HOST=0.0.0.0 +PORT=8555 +NETWORK_ID=5778 diff --git a/jenkins/env/ganache.test.jenkins.env b/jenkins/env/ganache.test.jenkins.env new file mode 100755 index 0000000..479da1f --- /dev/null +++ b/jenkins/env/ganache.test.jenkins.env @@ -0,0 +1,6 @@ +ACCOUNTS_NUMBER=5 +ACCOUNTS_ETHER=1 +MNEMONIC="myth like bonus scare over problem client lizard pioneer submit female collect" +HOST=0.0.0.0 +PORT=8546 +NETWORK_ID=5778 diff --git a/jenkins/env/pinner.production.jenkins.env b/jenkins/env/pinner.production.jenkins.env new file mode 100755 index 0000000..5558f2c --- /dev/null +++ b/jenkins/env/pinner.production.jenkins.env @@ -0,0 +1,20 @@ +VIRTUAL_HOST=pinner.concordia.ecentrics.net +VIRTUAL_PORT=4444 +LETSENCRYPT_HOST=pinner.concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +USE_EXTERNAL_CONTRACTS_PROVIDER=true +ORBIT_DIRECTORY=/mnt/concordia/orbitdb + +CONTRACTS_PROVIDER_HOST=contracts.concordia.ecentrics.net +CONTRACTS_PROVIDER_PORT=8400 +CONTRACTS_VERSION_HASH=stable + +PINNER_API_HOST=127.0.0.1 +PINNER_API_PORT=4444 + +RENDEZVOUS_HOST=rendezvous.ecentrics.net +RENDEZVOUS_PORT=9090 + +WEB3_HOST=ganache.ecentrics.net +WEB3_PORT=8545 diff --git a/jenkins/env/pinner.staging.jenkins.env b/jenkins/env/pinner.staging.jenkins.env new file mode 100755 index 0000000..d4998d2 --- /dev/null +++ b/jenkins/env/pinner.staging.jenkins.env @@ -0,0 +1,20 @@ +VIRTUAL_HOST=staging.pinner.concordia.ecentrics.net +VIRTUAL_PORT=5555 +LETSENCRYPT_HOST=staging.pinner.concordia.ecentrics.net +LETSENCRYPT_EMAIL=ecentricsgr@gmail.com + +USE_EXTERNAL_CONTRACTS_PROVIDER=true +ORBIT_DIRECTORY=/mnt/concordia/orbitdb + +CONTRACTS_PROVIDER_HOST=staging.contracts.concordia.ecentrics.net +CONTRACTS_PROVIDER_PORT=8450 +CONTRACTS_VERSION_HASH=latest + +PINNER_API_HOST=127.0.0.1 +PINNER_API_PORT=5555 + +RENDEZVOUS_HOST=rendezvous.ecentrics.net +RENDEZVOUS_PORT=9090 + +WEB3_HOST=staging.ganache.ecentrics.net +WEB3_PORT=8555