1 changed files with 212 additions and 0 deletions
@ -0,0 +1,212 @@ |
|||
#!groovy |
|||
|
|||
library identifier: '3scale-toolbox-jenkins@master', |
|||
retriever: modernSCM([$class: 'GitSCMSource', |
|||
remote: 'https://github.com/rh-integration/3scale-toolbox-jenkins.git', |
|||
traits: [[$class: 'jenkins.plugins.git.traits.BranchDiscoveryTrait']]]) |
|||
|
|||
def service = null |
|||
|
|||
node() { |
|||
stage('Pre-requisites') { |
|||
if (params.OPENAPI_SPECIFICATION_FILE != "openapi-spec-v0.9.yaml" |
|||
&& params.OPENAPI_SPECIFICATION_FILE != "openapi-spec-v1.0.yaml" |
|||
&& params.OPENAPI_SPECIFICATION_FILE != "openapi-spec-v1.1.yaml" |
|||
&& params.OPENAPI_SPECIFICATION_FILE != "openapi-spec-v2.0.yaml") { |
|||
|
|||
echo """ |
|||
Please specify the OpenAPI Specification filename you want to deploy: |
|||
|
|||
Use one of the following provided files: |
|||
- openapi-spec-v0.9.yaml => 2 methods, no security |
|||
- openapi-spec-v1.0.yaml => 2 methods, API Key |
|||
- openapi-spec-v1.1.yaml => 3 methods, API Key |
|||
- openapi-spec-v2.0.yaml => 3 methods, OpenID Connect |
|||
|
|||
Use the OPENAPI_SPECIFICATION_FILE parameter to pass the OpenAPI Specification filename you want to deploy. |
|||
""" |
|||
|
|||
error("Use the OPENAPI_SPECIFICATION_FILE parameter to pass the OpenAPI Specification filename you want to deploy.") |
|||
} |
|||
} |
|||
stage('Checkout Source') { |
|||
checkout scm |
|||
} |
|||
|
|||
stage("Deploy API in Dev") { |
|||
// Prepare |
|||
service = toolbox.prepareThreescaleService( |
|||
openapi: [filename: "testcase-05/" + params.OPENAPI_SPECIFICATION_FILE ], |
|||
environment: [ baseSystemName: "eventapi-05", |
|||
publicBasePath: "/api/", |
|||
environmentName: "dev", |
|||
oidcIssuerEndpoint: params.OIDC_ISSUER_ENDPOINT, |
|||
publicStagingWildcardDomain: params.PUBLIC_STAGING_WILDCARD_DOMAIN != "" ? params.PUBLIC_STAGING_WILDCARD_DOMAIN : null, |
|||
publicProductionWildcardDomain: params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN != "" ? params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN : null, |
|||
privateBaseUrl: params.PRIVATE_BASE_URL ], |
|||
toolbox: [ openshiftProject: params.NAMESPACE, |
|||
destination: params.TARGET_INSTANCE, |
|||
image: "quay.io/redhat/3scale-toolbox:master", // TODO: remove me once the final image is released |
|||
insecure: params.DISABLE_TLS_VALIDATION == "yes", |
|||
secretName: params.SECRET_NAME], |
|||
service: [:], |
|||
applications: [ |
|||
[ name: "my-test-app", description: "This is used for tests", plan: "test", account: params.DEVELOPER_ACCOUNT_ID ] |
|||
], |
|||
applicationPlans: [ |
|||
[ systemName: "test", name: "Test", defaultPlan: true, published: true ] |
|||
] |
|||
) |
|||
|
|||
// Import OpenAPI |
|||
service.importOpenAPI() |
|||
echo "Service with system_name ${service.environment.targetSystemName} created !" |
|||
|
|||
// Create an Application Plan |
|||
service.applyApplicationPlans() |
|||
|
|||
// Create an Application |
|||
service.applyApplication() |
|||
|
|||
// Run integration tests |
|||
runIntegrationTests(service) |
|||
|
|||
// Promote to production |
|||
service.promoteToProduction() |
|||
} |
|||
|
|||
stage("Deploy API in Test") { |
|||
// Prepare |
|||
service = toolbox.prepareThreescaleService( |
|||
openapi: [filename: "testcase-05/" + params.OPENAPI_SPECIFICATION_FILE ], |
|||
environment: [ baseSystemName: "eventapi-05", |
|||
publicBasePath: "/api/", |
|||
environmentName: "test", |
|||
publicStagingWildcardDomain: params.PUBLIC_STAGING_WILDCARD_DOMAIN != "" ? params.PUBLIC_STAGING_WILDCARD_DOMAIN : null, |
|||
publicProductionWildcardDomain: params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN != "" ? params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN : null, |
|||
privateBaseUrl: params.PRIVATE_BASE_URL ], |
|||
toolbox: [ openshiftProject: params.NAMESPACE, |
|||
destination: params.TARGET_INSTANCE, |
|||
image: "quay.io/redhat/3scale-toolbox:master", // TODO: remove me once the final image is released |
|||
insecure: params.DISABLE_TLS_VALIDATION == "yes", |
|||
secretName: params.SECRET_NAME], |
|||
service: [:], |
|||
applications: [ |
|||
[ name: "my-test-app", description: "This is used for tests", plan: "test", account: params.DEVELOPER_ACCOUNT_ID ] |
|||
], |
|||
applicationPlans: [ |
|||
[ systemName: "test", name: "Test", defaultPlan: true, published: true ] |
|||
] |
|||
) |
|||
|
|||
// Import OpenAPI |
|||
service.importOpenAPI() |
|||
echo "Service with system_name ${service.environment.targetSystemName} created !" |
|||
|
|||
// Create an Application Plan |
|||
service.applyApplicationPlans() |
|||
|
|||
// Create an Application |
|||
service.applyApplication() |
|||
|
|||
// Run integration tests |
|||
runIntegrationTests(service) |
|||
|
|||
// Promote to production |
|||
service.promoteToProduction() |
|||
} |
|||
|
|||
stage("Deploy API in Prod") { |
|||
// Prepare |
|||
service = toolbox.prepareThreescaleService( |
|||
openapi: [filename: "testcase-05/" + params.OPENAPI_SPECIFICATION_FILE ], |
|||
environment: [ baseSystemName: "eventapi-05", |
|||
publicBasePath: "/api/", |
|||
environmentName: "prod", |
|||
publicStagingWildcardDomain: params.PUBLIC_STAGING_WILDCARD_DOMAIN != "" ? params.PUBLIC_STAGING_WILDCARD_DOMAIN : null, |
|||
publicProductionWildcardDomain: params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN != "" ? params.PUBLIC_PRODUCTION_WILDCARD_DOMAIN : null, |
|||
privateBaseUrl: params.PRIVATE_BASE_URL ], |
|||
toolbox: [ openshiftProject: params.NAMESPACE, |
|||
destination: params.TARGET_INSTANCE, |
|||
image: "quay.io/redhat/3scale-toolbox:master", // TODO: remove me once the final image is released |
|||
insecure: params.DISABLE_TLS_VALIDATION == "yes", |
|||
secretName: params.SECRET_NAME], |
|||
service: [:], |
|||
applications: [ |
|||
[ name: "my-test-app", description: "This is used for tests", plan: "test", account: params.DEVELOPER_ACCOUNT_ID ] |
|||
], |
|||
applicationPlans: [ |
|||
[ systemName: "test", name: "Test", defaultPlan: true, published: true ] |
|||
] |
|||
) |
|||
|
|||
// Import OpenAPI |
|||
service.importOpenAPI() |
|||
echo "Service with system_name ${service.environment.targetSystemName} created !" |
|||
|
|||
// Create an Application Plan |
|||
service.applyApplicationPlans() |
|||
|
|||
// Create an Application |
|||
service.applyApplication() |
|||
|
|||
// Run integration tests |
|||
runIntegrationTests(service) |
|||
|
|||
// Promote to production |
|||
service.promoteToProduction() |
|||
} |
|||
|
|||
} |
|||
|
|||
def runIntegrationTests(def service) { |
|||
// To run the integration tests when using APIcast SaaS instances, we need |
|||
// to fetch the proxy definition to extract the staging public url |
|||
def proxy = service.readProxy("sandbox") |
|||
|
|||
// The integration tests will be a bit different depending on the security scheme |
|||
// declared in the OpenAPI Specification file |
|||
def getCredentialsCodeSnippet = null |
|||
if (service.openapi.securityScheme.name() == "OPEN") { |
|||
getCredentialsCodeSnippet = """ |
|||
credential_header="x-dummy: dummy" |
|||
echo "no credential will be used" |
|||
""" |
|||
} else if (service.openapi.securityScheme.name() == "APIKEY") { |
|||
def userkey = service.applications[0].userkey |
|||
getCredentialsCodeSnippet = """ |
|||
credential_header="api-key: ${userkey}" |
|||
echo "userkey is ${userkey}" |
|||
""" |
|||
} else if (service.openapi.securityScheme.name() == "OIDC") { |
|||
def tokenEndpoint = getTokenEndpoint(params.OIDC_ISSUER_ENDPOINT) |
|||
def clientId = service.applications[0].clientId |
|||
def clientSecret = service.applications[0].clientSecret |
|||
getCredentialsCodeSnippet = """ |
|||
echo "token endpoint is ${tokenEndpoint}" |
|||
echo "client_id=${clientId}" |
|||
echo "client_secret=${clientSecret}" |
|||
curl -sfk "${tokenEndpoint}" -d client_id="${clientId}" -d client_secret="${clientSecret}" -d scope=openid -d grant_type=client_credentials -o response.json |
|||
curl -sLfk https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -o /tmp/jq |
|||
chmod 755 /tmp/jq |
|||
TOKEN="\$(/tmp/jq -r .access_token response.json)" |
|||
echo "Received access_token '\$TOKEN'" |
|||
credential_header="Authorization: Bearer \$TOKEN" |
|||
""" |
|||
} |
|||
|
|||
// Run the actual tests |
|||
sh """set -e |
|||
echo "Public Staging Base URL is ${proxy.sandbox_endpoint}" |
|||
${getCredentialsCodeSnippet} |
|||
curl -sfk -w "GetLocation: %{http_code}\n" -o /dev/null "${proxy.sandbox_endpoint}/api/location" -H "\$credential_header" |
|||
curl -sfk -w "GetTimeframe: %{http_code}\n" -o /dev/null "${proxy.sandbox_endpoint}/api/timeframe" -H "\$credential_header" |
|||
# This one is only present in v1.1 and onwards |
|||
curl -sk -w "GetParticipants: %{http_code}\n" -o /dev/null "${proxy.sandbox_endpoint}/api/participants" -H "\$credential_header" |
|||
""" |
|||
} |
|||
|
|||
def getTokenEndpoint(String oidcIssuerEndpoint) { |
|||
def m = (oidcIssuerEndpoint =~ /(https?:\/\/)[^:]+:[^@]+@(.*)/) |
|||
return "${m[0][1]}${m[0][2]}/protocol/openid-connect/token" |
|||
} |
|||
Loading…
Reference in new issue