stages: - build - upload variables: PIPELINE_WORK_DIR_V1: "./v1" CONTAINER_NAME_V1: "etaapi" PIPELINE_WORK_DIR_V2: "./v2" CONTAINER_NAME_V2: "etaapi" PUBLIC_PORT_V1: 7001 PRIVATE_PORT_V1: 3000 PUBLIC_PORT_V2: 7002 PRIVATE_PORT_V2: 3000 .generic_build_job: &generic_build_job script: - cd $PIPELINE_WORK_DIR - . ./scripts/ci_functions.sh - build_docker $CONTAINER_NAME only: - master .generic_upload_job: &generic_upload_job script: - cd $PIPELINE_WORK_DIR - . ./scripts/ci_functions.sh - upload_image only: - master .generic_deploy_job: &generic_deploy_job script: - cd $PIPELINE_WORK_DIR - . ./scripts/ci_functions.sh - deploy only: - master build-v1-job: stage: build needs: [] variables: PIPELINE_WORK_DIR: "$PIPELINE_WORK_DIR_V1" CONTAINER_NAME: "$CONTAINER_NAME_V1" PUBLIC_PORT: "$PUBLIC_PORT_V1" PRIVATE_PORT: "$PRIVATE_PORT_V1" <<: *generic_build_job upload-v1-job: stage: upload needs: ["build-v1-job"] variables: PIPELINE_WORK_DIR: "$PIPELINE_WORK_DIR_V1" CONTAINER_NAME: "$CONTAINER_NAME_V1" PUBLIC_PORT: "$PUBLIC_PORT_V1" PRIVATE_PORT: "$PRIVATE_PORT_V1" <<: *generic_upload_job