mirror of
https://github.com/Blockstream/satellite-api.git
synced 2025-02-22 05:41:37 +01:00
268 lines
9.8 KiB
YAML
268 lines
9.8 KiB
YAML
variables:
|
|
GIT_SUBMODULE_STRATEGY: none
|
|
CI_DISPOSABLE_ENVIRONMENT: "true"
|
|
|
|
image: blockstream/gcloud-docker@sha256:f8d3e996349c973c85c92cc990adf25c04c6dd7d4a5c839308a13c2772f15151
|
|
stages:
|
|
- build
|
|
- plan
|
|
- deploy
|
|
|
|
before_script:
|
|
- TMPF=$(mktemp) || exit 1
|
|
- echo $GCLOUD_KEY > $TMPF
|
|
- export GOOGLE_APPLICATION_CREDENTIALS=$TMPF
|
|
- gcloud auth activate-service-account --key-file=$TMPF
|
|
- gcloud auth list
|
|
- gcloud --version
|
|
|
|
# Run tests
|
|
test_build:
|
|
stage: build
|
|
image: blockstream/satapi-builder@sha256:a3a137b80a08325bdd50a7c59ae0429b933e7a36db0d74f6ae34af067dfdee2d
|
|
only:
|
|
- branches@satellite/ionosphere
|
|
except:
|
|
- master@satellite/ionosphere
|
|
- cleanup_staging@satellite/ionosphere
|
|
before_script:
|
|
- export CHARGE_ROOT=$CHARGE_ROOT_CI
|
|
- export REDIS_URI=$REDIS_URI_CI
|
|
script:
|
|
- bundle exec rake db:create && bundle exec rake db:schema:load && bundle exec rake db:migrate
|
|
- bundle exec ruby tests/tests.rb || { echo -e "Tests failed..\n Sleeping for an hour to debug."; sleep 3600; exit 1; }
|
|
- echo "Tests passed!"
|
|
|
|
# Run tests and build docker images
|
|
build:
|
|
stage: build
|
|
image: blockstream/satapi-builder@sha256:a3a137b80a08325bdd50a7c59ae0429b933e7a36db0d74f6ae34af067dfdee2d
|
|
only:
|
|
- master@satellite/ionosphere
|
|
before_script:
|
|
- export CHARGE_ROOT=$CHARGE_ROOT_CI
|
|
- export REDIS_URI=$REDIS_URI_CI
|
|
script:
|
|
- bundle exec rake db:create && bundle exec rake db:schema:load && bundle exec rake db:migrate
|
|
- bundle exec ruby tests/tests.rb || { echo "Tests failed.."; exit 1; }
|
|
- echo $DOCKERHUB_PW | docker login -u $DOCKERHUB_USER --password-stdin
|
|
- docker pull blockstream/satellite-api:latest
|
|
- docker pull blockstream/satellite-api-sse:latest
|
|
- docker build --cache-from blockstream/satellite-api:latest -f Dockerfile -t blockstream/satellite-api:latest -t blockstream/satellite-api:$CI_COMMIT_SHA .
|
|
- docker push blockstream/satellite-api:latest
|
|
- docker push blockstream/satellite-api:$CI_COMMIT_SHA
|
|
- echo "Building Satellite API SSE image"
|
|
- docker build --cache-from blockstream/satellite-api-sse:latest -f Dockerfile.sse -t blockstream/satellite-api-sse:latest -t blockstream/satellite-api-sse:$CI_COMMIT_SHA sse/
|
|
- docker push blockstream/satellite-api-sse:$CI_COMMIT_SHA
|
|
- docker push blockstream/satellite-api-sse:latest
|
|
|
|
# Any newly-pushed, WIP branch will be ran through plan (keep in mind docker images are using the latest tag, which may be an older one since the current commit may not match an available image)
|
|
plan_satapi:
|
|
stage: plan
|
|
only:
|
|
- branches@satellite/ionosphere
|
|
except:
|
|
- cleanup_staging@satellite/ionosphere
|
|
- /^staging_.*/
|
|
- /^prod_.*/
|
|
- /^misc_.*/
|
|
script:
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select staging
|
|
&& terraform plan
|
|
-var "ionosphere_docker=blockstream/satellite-api:latest"
|
|
-var "ionosphere_sse_docker=blockstream/satellite-api-sse:latest"
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "host=$HOST_STAGING"
|
|
-var "timeout=$TIMEOUT"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "rpcuser=$RPCUSER"
|
|
-var "rpcpass=$RPCPASS"
|
|
-var "public_bucket_url=$PUBLIC_BUCKET_URL"
|
|
-var "letsencrypt_email=$LE_EMAIL"
|
|
-var "lb_svc_acct=$LB_SA_STAGING"
|
|
-var "pguser=$PGUSER"
|
|
-var "pgpass=$PGPASS"
|
|
-input=false)
|
|
|
|
# This plan gets triggered only for miscellaneous branches/tags (i.e. tor, prometheus, etc), so make sure the branch/tag name starts with misc_
|
|
plan_misc:
|
|
stage: plan
|
|
only:
|
|
- /^misc_.*/
|
|
except:
|
|
- /^misc_v.*/
|
|
script:
|
|
- (echo -n "$V3_PK" > terraform/modules/tor/v3.pk)
|
|
- (echo -n "$V3_PUBK" > terraform/modules/tor/v3.pubk)
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select misc
|
|
&& terraform plan
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "onion_host=$ONION_HOST"
|
|
-var "prom_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "satellite_lb=$SATELLITE_LB"
|
|
-var "satellite_api_lb=$SATELLITE_API_LB"
|
|
-var "satellite_api_lb_staging=$SATELLITE_API_LB_STAGING"
|
|
-input=false)
|
|
|
|
# This deploys only tags/branches starting with misc_v.* (i.e. tor, prometheus, etc)
|
|
deploy_misc:
|
|
stage: deploy
|
|
only:
|
|
- /^misc_v.*/
|
|
script:
|
|
- (echo -n "$V3_PK" > terraform/modules/tor/v3.pk)
|
|
- (echo -n "$V3_PUBK" > terraform/modules/tor/v3.pubk)
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select misc
|
|
&& terraform apply
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "onion_host=$ONION_HOST"
|
|
-var "prom_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "satellite_lb=$SATELLITE_LB"
|
|
-var "satellite_api_lb=$SATELLITE_API_LB"
|
|
-var "satellite_api_lb_staging=$SATELLITE_API_LB_STAGING"
|
|
-input=false -auto-approve)
|
|
|
|
# Tag with staging_v.* to deploy mainnet staging (e.g. staging_v0.1.1)
|
|
deploy_staging:
|
|
stage: deploy
|
|
only:
|
|
- /^staging_v.*/
|
|
script:
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select staging
|
|
&& terraform apply
|
|
-var "ionosphere_docker=blockstream/satellite-api:$CI_COMMIT_SHA"
|
|
-var "ionosphere_sse_docker=blockstream/satellite-api-sse:$CI_COMMIT_SHA"
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "host=$HOST_STAGING"
|
|
-var "timeout=$TIMEOUT"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "rpcuser=$RPCUSER"
|
|
-var "rpcpass=$RPCPASS"
|
|
-var "public_bucket_url=$PUBLIC_BUCKET_URL"
|
|
-var "letsencrypt_email=$LE_EMAIL"
|
|
-var "pguser=$PGUSER"
|
|
-var "pgpass=$PGPASS"
|
|
-input=false -auto-approve)
|
|
|
|
# Tag with production_v.* to deploy mainnet production (e.g. prod_v0.1.1)
|
|
deploy_production:
|
|
stage: deploy
|
|
only:
|
|
- /^prod_v.*/
|
|
script:
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select prod
|
|
&& terraform apply
|
|
-var "ionosphere_docker=blockstream/satellite-api:$CI_COMMIT_SHA"
|
|
-var "ionosphere_sse_docker=blockstream/satellite-api-sse:$CI_COMMIT_SHA"
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "host=$HOST"
|
|
-var "timeout=$TIMEOUT"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "rpcuser=$RPCUSER"
|
|
-var "rpcpass=$RPCPASS"
|
|
-var "public_bucket_url=$PUBLIC_BUCKET_URL"
|
|
-var "letsencrypt_email=$LE_EMAIL"
|
|
-var "pguser=$PGUSER"
|
|
-var "pgpass=$PGPASS"
|
|
-input=false -auto-approve)
|
|
|
|
# Tag with testnet_staging_v.* to deploy testnet staging (e.g. testnet_staging_v0.1.1)
|
|
deploy_staging_testnet:
|
|
stage: deploy
|
|
only:
|
|
- /^testnet_staging_v.*/
|
|
script:
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select testnet-staging
|
|
&& terraform apply
|
|
-var "ionosphere_docker=blockstream/satellite-api:$CI_COMMIT_SHA"
|
|
-var "ionosphere_sse_docker=blockstream/satellite-api-sse:$CI_COMMIT_SHA"
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "host=$HOST_STAGING"
|
|
-var "timeout=$TIMEOUT"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "rpcuser=$RPCUSER"
|
|
-var "rpcpass=$RPCPASS"
|
|
-var "public_bucket_url=$PUBLIC_BUCKET_URL"
|
|
-var "letsencrypt_email=$LE_EMAIL"
|
|
-var "lb_svc_acct=$LB_SA_STAGING"
|
|
-var "pguser=$PGUSER"
|
|
-var "pgpass=$PGPASS"
|
|
-input=false -auto-approve)
|
|
|
|
# Tag with production_v.* to deploy testnet production (e.g. testnet_prod_v0.1.1)
|
|
deploy_production_testnet:
|
|
stage: deploy
|
|
only:
|
|
- /^testnet_prod_v.*/
|
|
script:
|
|
- (cd terraform
|
|
&& terraform init -input=false
|
|
&& terraform workspace select testnet-prod
|
|
&& terraform apply
|
|
-var "ionosphere_docker=blockstream/satellite-api:$CI_COMMIT_SHA"
|
|
-var "ionosphere_sse_docker=blockstream/satellite-api-sse:$CI_COMMIT_SHA"
|
|
-var "region=$REGION"
|
|
-var "zone=$ZONE"
|
|
-var "instance_type=$INSTANCE_TYPE"
|
|
-var "host=$HOST_STAGING"
|
|
-var "timeout=$TIMEOUT"
|
|
-var "prom_service_acct=$PROM_SA"
|
|
-var "opsgenie_key=$OPSGENIE_KEY"
|
|
-var "rpcuser=$RPCUSER"
|
|
-var "rpcpass=$RPCPASS"
|
|
-var "public_bucket_url=$PUBLIC_BUCKET_URL"
|
|
-var "letsencrypt_email=$LE_EMAIL"
|
|
-var "lb_svc_acct=$LB_SA"
|
|
-var "pguser=$PGUSER"
|
|
-var "pgpass=$PGPASS"
|
|
-input=false -auto-approve)
|
|
|
|
# Pushing to this branch destroys the staging infrastructure
|
|
cleanup_staging:
|
|
stage: deploy
|
|
only:
|
|
- cleanup_staging@satellite/ionosphere
|
|
script:
|
|
- (cd terraform && terraform init -input=false &&
|
|
terraform workspace select staging &&
|
|
terraform destroy
|
|
-target module.blc.google_compute_instance_group_manager.blc
|
|
-target module.lb.google_compute_region_instance_group_manager.satapi-lb
|
|
-auto-approve)
|
|
- (cd terraform && terraform init -input=false &&
|
|
terraform workspace select testnet-staging &&
|
|
terraform destroy
|
|
-target module.blc.google_compute_instance_group_manager.blc
|
|
-auto-approve)
|