apiVersion: v1 kind: Template labels: template: application-template-sample-pipeline message: |- A Jenkins server must be instantiated in this project to manage the Pipeline BuildConfig created by this template. You will be able to log in to it using your OpenShift user credentials. metadata: annotations: openshift.io/display-name: Pipeline Build Example description: |- This example showcases the new Jenkins Pipeline integration in OpenShift, which performs continuous integration and deployment right on the platform. The template contains a Jenkinsfile - a definition of a multi-stage CI/CD process - that leverages the underlying OpenShift platform for dynamic and scalable builds. OpenShift integrates the status of your pipeline builds into the web console allowing you to see your entire application lifecycle in a single view. iconClass: icon-jenkins tags: instant-app,jenkins name: jenkins-pipeline-example parameters: - description: The name assigned to all of the frontend objects defined in this template. displayName: Name name: NAME required: true value: nodejs-mongodb-example - description: The exposed hostname that will route to the Node.js service, if left blank a value will be defaulted. displayName: Application Hostname name: APPLICATION_DOMAIN - description: The URL of the repository with your application source code. displayName: Git Repository URL name: SOURCE_REPOSITORY_URL required: true value: https://github.com/openshift/nodejs-ex.git - displayName: Database Name name: DATABASE_NAME required: true value: sampledb - description: Username for MongoDB user that will be used for accessing the database. displayName: MongoDB Username from: user[A-Z0-9]{3} generate: expression name: DATABASE_USER - description: Password for the MongoDB user. displayName: MongoDB Password from: '[a-zA-Z0-9]{16}' generate: expression name: DATABASE_PASSWORD - description: Maximum amount of memory the Node.js container can use. displayName: Memory Limit name: MEMORY_LIMIT required: true value: 512Mi - description: Maximum amount of memory the MongoDB container can use. displayName: Memory Limit (MongoDB) name: MEMORY_MONGODB_LIMIT required: true value: 512Mi - displayName: Database Service Name name: DATABASE_SERVICE_NAME required: true value: mongodb - description: Password for the database admin user. displayName: Database Administrator Password from: '[a-zA-Z0-9]{16}' generate: expression name: DATABASE_ADMIN_PASSWORD - description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. displayName: Git Reference name: SOURCE_REPOSITORY_REF - description: Set this to the relative path to your project if it is not in the root of your repository. displayName: Context Directory name: CONTEXT_DIR - description: Github trigger secret. A difficult to guess string encoded as part of the webhook URL. Not encrypted. displayName: GitHub Webhook Secret from: '[a-zA-Z0-9]{40}' generate: expression name: GITHUB_WEBHOOK_SECRET - description: A secret string used to configure the Generic webhook. displayName: Generic Webhook Secret from: '[a-zA-Z0-9]{40}' generate: expression name: GENERIC_WEBHOOK_SECRET - description: The custom NPM mirror URL displayName: Custom NPM Mirror URL name: NPM_MIRROR - description: The OpenShift Namespace where the NodeJS and MongoDB ImageStreams reside. displayName: Namespace name: NAMESPACE required: true value: openshift - description: Storage class to be used by de PCV displayName: Storage Class name: PVC_STORAGECLASS required: false value: "" - description: Access mode to be used by de PCV displayName: Acces Mode name: PVC_ACCESSMODE required: true value: "ReadWriteOnce" objects: - apiVersion: v1 kind: BuildConfig metadata: annotations: pipeline.alpha.openshift.io/uses: '[{"name": "${NAME}", "namespace": "", "kind": "DeploymentConfig"}]' labels: name: sample-pipeline name: sample-pipeline spec: strategy: jenkinsPipelineStrategy: jenkinsfile: |- try { timeout(time: 20, unit: 'MINUTES') { node('nodejs') { stage('build') { openshift.withCluster() { openshift.withProject() { def bld = openshift.startBuild('${NAME}') bld.untilEach { return it.object().status.phase == "Running" } bld.logs('-f') } } } stage('deploy') { openshift.withCluster() { openshift.withProject() { def dc = openshift.selector('dc', '${NAME}') dc.rollout().latest() } } } } } } catch (err) { echo "in catch block" echo "Caught: ${err}" currentBuild.result = 'FAILURE' throw err } type: JenkinsPipeline triggers: - github: secret: secret101 type: GitHub - generic: secret: secret101 type: Generic - apiVersion: v1 kind: Service metadata: annotations: service.alpha.openshift.io/dependencies: '[{"name": "${DATABASE_SERVICE_NAME}", "namespace": "", "kind": "Service"}]' name: ${NAME} spec: ports: - name: web port: 8080 targetPort: 8080 selector: name: ${NAME} - apiVersion: v1 kind: Route metadata: name: ${NAME} spec: host: ${APPLICATION_DOMAIN} to: kind: Service name: ${NAME} - apiVersion: v1 kind: ImageStream metadata: annotations: description: Keeps track of changes in the application image name: ${NAME} - apiVersion: v1 kind: BuildConfig metadata: annotations: description: Defines how to build the application name: ${NAME} spec: output: to: kind: ImageStreamTag name: ${NAME}:latest postCommit: script: npm test source: contextDir: ${CONTEXT_DIR} git: ref: ${SOURCE_REPOSITORY_REF} uri: ${SOURCE_REPOSITORY_URL} type: Git strategy: sourceStrategy: env: - name: NPM_MIRROR value: ${NPM_MIRROR} from: kind: ImageStreamTag name: nodejs:8 namespace: ${NAMESPACE} type: Source triggers: - github: secret: ${GITHUB_WEBHOOK_SECRET} type: GitHub - generic: secret: ${GENERIC_WEBHOOK_SECRET} type: Generic - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: ${DATABASE_SERVICE_NAME}-data labels: app: ${NAME} spec: accessModes: - ${PVC_ACCESSMODE} storageClassName: ${PVC_STORAGECLASS} resources: requests: storage: 1Gi - apiVersion: v1 kind: DeploymentConfig metadata: annotations: description: Defines how to deploy the application server name: ${NAME} spec: replicas: 1 selector: name: ${NAME} strategy: type: Rolling template: metadata: labels: name: ${NAME} name: ${NAME} spec: containers: - env: - name: DATABASE_SERVICE_NAME value: ${DATABASE_SERVICE_NAME} - name: MONGODB_USER value: ${DATABASE_USER} - name: MONGODB_PASSWORD value: ${DATABASE_PASSWORD} - name: MONGODB_DATABASE value: ${DATABASE_NAME} - name: MONGODB_ADMIN_PASSWORD value: ${DATABASE_ADMIN_PASSWORD} image: ' ' livenessProbe: httpGet: path: /pagecount port: 8080 initialDelaySeconds: 30 timeoutSeconds: 3 name: nodejs-mongodb-example ports: - containerPort: 8080 readinessProbe: httpGet: path: /pagecount port: 8080 initialDelaySeconds: 3 timeoutSeconds: 3 resources: limits: memory: ${MEMORY_LIMIT} triggers: - imageChangeParams: automatic: false containerNames: - nodejs-mongodb-example from: kind: ImageStreamTag name: ${NAME}:latest type: ImageChange - type: ConfigChange - apiVersion: v1 kind: Service metadata: annotations: description: Exposes the database server name: ${DATABASE_SERVICE_NAME} spec: ports: - name: mongodb port: 27017 targetPort: 27017 selector: name: ${DATABASE_SERVICE_NAME} - apiVersion: v1 kind: DeploymentConfig metadata: annotations: description: Defines how to deploy the database name: ${DATABASE_SERVICE_NAME} spec: replicas: 1 selector: name: ${DATABASE_SERVICE_NAME} strategy: type: Recreate template: metadata: labels: name: ${DATABASE_SERVICE_NAME} name: ${DATABASE_SERVICE_NAME} spec: containers: - env: - name: MONGODB_USER value: ${DATABASE_USER} - name: MONGODB_PASSWORD value: ${DATABASE_PASSWORD} - name: MONGODB_DATABASE value: ${DATABASE_NAME} - name: MONGODB_ADMIN_PASSWORD value: ${DATABASE_ADMIN_PASSWORD} image: ' ' livenessProbe: initialDelaySeconds: 30 tcpSocket: port: 27017 timeoutSeconds: 1 name: mongodb ports: - containerPort: 27017 readinessProbe: exec: command: - /bin/sh - -i - -c - mongo 127.0.0.1:27017/$MONGODB_DATABASE -u $MONGODB_USER -p $MONGODB_PASSWORD --eval="quit()" initialDelaySeconds: 3 timeoutSeconds: 1 resources: limits: memory: ${MEMORY_MONGODB_LIMIT} volumeMounts: - mountPath: /var/lib/mongodb/data name: ${DATABASE_SERVICE_NAME}-data volumes: - name: ${DATABASE_SERVICE_NAME}-data persistentVolumeClaim: claimName: ${DATABASE_SERVICE_NAME}-data # volumes: # - emptyDir: # medium: "" # name: ${DATABASE_SERVICE_NAME}-data triggers: - imageChangeParams: automatic: true containerNames: - mongodb from: kind: ImageStreamTag name: mongodb:3.2 namespace: ${NAMESPACE} type: ImageChange - type: ConfigChange