pipeline { agent any environment { EXPORT_TEMPLATE_NAME = 'template-export.yml' EXPORT_TEMPLATE_STAGING_CONFIG = 'staging-config-export.json' EXPORT_TEMPLATE_STAGING_PARAMS = 'staging-params-export.json' EXPORT_TEMPLATE_STAGING_TAGS = 'staging-tags-export.json' EXPORT_TEMPLATE_PROD_CONFIG = 'prod-config-export.json' EXPORT_TEMPLATE_PROD_PARAMS = 'prod-params-export.json' EXPORT_TEMPLATE_PROD_TAGS = 'prod-tags-export.json' ENDPOINT_TYPE = 'async' STACK_NAME_DEPLOY_STAGING = """${sh( returnStdout: true, script: 'echo "sagemaker-${SAGEMAKER_PROJECT_NAME}-${SAGEMAKER_PROJECT_ID}-deploy-staging"' ).trim()}""" STACK_NAME_DEPLOY_PROD = """${sh( returnStdout: true, script: 'echo "sagemaker-${SAGEMAKER_PROJECT_NAME}-${SAGEMAKER_PROJECT_ID}-deploy-prod"' ).trim()}""" EXPORT_TEST_RESULTS = 'test-results.json' } stages { stage('Install') { steps { sh 'pip3 install --upgrade --force-reinstall "botocore>1.21.30" "boto3>1.18.30" "awscli>1.20.30"' } } stage('Build') { steps { withAWS(credentials:"${AWS_CREDENTIAL}",region:"${AWS_REGION}") { sh '''python3 build.py --model-execution-role "$MODEL_EXECUTION_ROLE_ARN" \ --model-package-group-name "$SOURCE_MODEL_PACKAGE_GROUP_NAME" \ --sagemaker-project-id "$SAGEMAKER_PROJECT_ID" \ --sagemaker-project-name "$SAGEMAKER_PROJECT_NAME" \ --sagemaker-project-arn "$SAGEMAKER_PROJECT_ARN" \ --s3-bucket "$ARTIFACT_BUCKET" \ --endpoint-type "$ENDPOINT_TYPE" \ --export-cfn-params-tags "True" ''' sh '''export PATH="$HOME/.local/bin:$PATH" aws cloudformation package --template $ENDPOINT_TYPE-endpoint-config-template.yml \ --s3-bucket $ARTIFACT_BUCKET --output-template $EXPORT_TEMPLATE_NAME ''' sh '''cat $EXPORT_TEMPLATE_STAGING_CONFIG cat $EXPORT_TEMPLATE_PROD_CONFIG ''' } } } stage('Staging Deploy') { steps { withAWS(credentials:"${AWS_CREDENTIAL}",region:"${AWS_REGION}") { cfnUpdate(stack: "${STACK_NAME_DEPLOY_STAGING}", file: "${EXPORT_TEMPLATE_NAME}", paramsFile: "${EXPORT_TEMPLATE_STAGING_PARAMS}", tagsFile: "${EXPORT_TEMPLATE_STAGING_TAGS}", pollInterval: 10000, timeoutInMinutes: 30) } } } stage('Test Staging') { steps { withAWS(credentials:"${AWS_CREDENTIAL}",region:"${AWS_REGION}") { sh '''python3 test/test.py \ --import-build-config $EXPORT_TEMPLATE_STAGING_CONFIG \ --export-test-results $EXPORT_TEST_RESULTS \ --endpoint-type $ENDPOINT_TYPE ''' sh 'cat $EXPORT_TEST_RESULTS' } } } stage('Manual Approval for Production') { steps { input 'Approve this model for Production' } } stage('Prod Deploy') { steps { withAWS(credentials:"${AWS_CREDENTIAL}",region:"${AWS_REGION}") { cfnUpdate(stack: "${STACK_NAME_DEPLOY_PROD}", file: "${EXPORT_TEMPLATE_NAME}", paramsFile: "${EXPORT_TEMPLATE_PROD_PARAMS}", tagsFile: "${EXPORT_TEMPLATE_PROD_TAGS}", pollInterval: 10000, timeoutInMinutes: 30) } } } } }