A NodeJS application to use in OpenShift
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

519 lines
13 KiB

apiVersion: v1
kind: Template
labels:
template: openshift-demo-nodejs
message: See https://github.com/nmasse-itix/OpenShift-Demo-NodeJS for more details.
metadata:
annotations:
description: |-
A demo application that exhibits the main features of OpenShift. It is written
in NodeJS and features a CI/CD environment with Blue/Green deployment.
openshift.io/display-name: OpenShift Demo NodeJS
tags: instant-app,nodejs,jenkins
template.openshift.io/documentation-url: https://github.com/nmasse-itix/OpenShift-Demo-NodeJS
template.openshift.io/long-description: A demo using NodeJS and Jenkins, running on OpenShift
template.openshift.io/provider-display-name: Nicolas Massé
template.openshift.io/support-url: https://github.com/nmasse-itix/OpenShift-Demo-NodeJS/issues
name: openshift-demo-nodejs-build
objects:
##
## The ImageStreams for all environments
##
# BUILD Environment
- apiVersion: v1
kind: ImageStream
metadata:
labels:
build: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${BUILD_PROJECT}
# TEST Environment
- apiVersion: v1
kind: ImageStream
metadata:
labels:
build: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${TEST_PROJECT}
# PROD Environment
- apiVersion: v1
kind: ImageStream
metadata:
labels:
build: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${PROD_PROJECT}
##
## Build Objects
##
# The BuildConfig that generates the target image
- apiVersion: v1
kind: BuildConfig
metadata:
name: openshift-demo-nodejs
labels:
build: openshift-demo-nodejs
template: openshift-demo-nodejs
namespace: ${BUILD_PROJECT}
spec:
successfulBuildsHistoryLimit: 1
failedBuildsHistoryLimit: 1
nodeSelector: null
output:
to:
kind: ImageStreamTag
name: openshift-demo-nodejs:latest
postCommit: {}
resources: {}
runPolicy: Serial
source:
git:
uri: ${GIT_REPO}
type: Git
strategy:
sourceStrategy:
from:
kind: ImageStreamTag
name: ${NODEJS_IMAGE_STREAM_TAG}
namespace: ${NODEJS_IMAGE_STREAM_NAMESPACE}
type: Source
triggers:
- type: ConfigChange
- type: ImageChange
# The Jenkins Pipeline
- kind: "BuildConfig"
apiVersion: "v1"
metadata:
name: "openshift-demo-nodejs-pipeline"
namespace: ${BUILD_PROJECT}
labels:
template: openshift-demo-nodejs
spec:
source:
git:
uri: ${GIT_REPO}
strategy:
type: "JenkinsPipeline"
jenkinsPipelineStrategy:
jenkinsfilePath: Jenkinsfile
env:
- name: NPM_CREDENTIALS_ID
value: ${NPM_CREDENTIALS_ID}
- name: OPENSHIFT_IMAGE_STREAM
value: openshift-demo-nodejs
- name: OPENSHIFT_BUILD_CONFIG
value: openshift-demo-nodejs
- name: OPENSHIFT_SERVICE
value: openshift-demo-nodejs
- name: OPENSHIFT_DEPLOYMENT_CONFIG
value: openshift-demo-nodejs
- name: OPENSHIFT_BUILD_PROJECT
value: ${BUILD_PROJECT}
- name: OPENSHIFT_TEST_ENVIRONMENT
value: ${TEST_PROJECT}
- name: OPENSHIFT_PROD_ENVIRONMENT
value: ${PROD_PROJECT}
- name: OPENSHIFT_TEST_URL
value: http://${TEST_ROUTE_HOSTNAME}
##
## Deploy to the TEST environment
##
# DeploymentConfig/TEST
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${TEST_PROJECT}
spec:
replicas: 1
selector:
app: openshift-demo-nodejs
deploymentconfig: openshift-demo-nodejs
strategy:
activeDeadlineSeconds: 21600
resources: {}
type: Recreate
template:
metadata:
creationTimestamp: null
labels:
app: openshift-demo-nodejs
deploymentconfig: openshift-demo-nodejs
template: openshift-demo-nodejs
spec:
containers:
- image: openshift-demo-nodejs:ready-for-testing
imagePullPolicy: IfNotPresent
name: openshift-demo-nodejs
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
test: false
triggers:
- type: ConfigChange
- type: ImageChange
imageChangeParams:
containerNames:
- openshift-demo-nodejs
from:
kind: ImageStreamTag
name: openshift-demo-nodejs:ready-for-testing
namespace: ${TEST_PROJECT}
# Service/TEST
- apiVersion: v1
kind: Service
metadata:
labels:
app: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${TEST_PROJECT}
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: openshift-demo-nodejs
deploymentconfig: openshift-demo-nodejs
sessionAffinity: None
type: ClusterIP
# Route/TEST
- apiVersion: v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/balance: "roundrobin"
haproxy.router.openshift.io/disable_cookies: "true"
labels:
app: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${TEST_PROJECT}
spec:
host: ${TEST_ROUTE_HOSTNAME}
port:
targetPort: 8080-tcp
to:
kind: Service
name: openshift-demo-nodejs
weight: 100
wildcardPolicy: None
##
## RoleBinding
##
# Set RoleBinding for the test environment
- apiVersion: v1
groupNames: null
kind: RoleBinding
metadata:
name: jenkins-is-admin
namespace: ${TEST_PROJECT}
labels:
template: openshift-demo-nodejs
roleRef:
name: admin
subjects:
- kind: ServiceAccount
name: jenkins
namespace: ${BUILD_PROJECT}
userNames:
- system:serviceaccount:${BUILD_PROJECT}:jenkins
# Set RoleBinding for the prod environment
- apiVersion: v1
groupNames: null
kind: RoleBinding
metadata:
name: jenkins-is-admin
namespace: ${PROD_PROJECT}
labels:
template: openshift-demo-nodejs
roleRef:
name: admin
subjects:
- kind: ServiceAccount
name: jenkins
namespace: ${BUILD_PROJECT}
userNames:
- system:serviceaccount:${BUILD_PROJECT}:jenkins
##
## Deploy to the PROD environment
##
# Blue Service
- apiVersion: v1
kind: Service
metadata:
labels:
app: openshift-demo-nodejs-blue
color: blue
template: openshift-demo-nodejs
name: openshift-demo-nodejs-blue
namespace: ${PROD_PROJECT}
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: openshift-demo-nodejs-blue
color: blue
deploymentconfig: openshift-demo-nodejs-blue
sessionAffinity: None
type: ClusterIP
# Green Service
- apiVersion: v1
kind: Service
metadata:
labels:
app: openshift-demo-nodejs-green
color: green
template: openshift-demo-nodejs
name: openshift-demo-nodejs-green
namespace: ${PROD_PROJECT}
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: openshift-demo-nodejs-green
color: green
deploymentconfig: openshift-demo-nodejs-green
sessionAffinity: None
type: ClusterIP
# Either blue or green Service
- apiVersion: v1
kind: Service
metadata:
labels:
app: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${PROD_PROJECT}
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
color: green
sessionAffinity: None
type: ClusterIP
# The route for the "either blue or green" service
- apiVersion: v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/balance: "roundrobin"
haproxy.router.openshift.io/disable_cookies: "true"
labels:
app: openshift-demo-nodejs
template: openshift-demo-nodejs
name: openshift-demo-nodejs
namespace: ${PROD_PROJECT}
spec:
host: ${PROD_ROUTE_HOSTNAME}
port:
targetPort: 8080-tcp
to:
kind: Service
name: openshift-demo-nodejs
weight: 100
wildcardPolicy: None
# The "blue" DeploymentConfig
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: openshift-demo-nodejs-blue
color: blue
template: openshift-demo-nodejs
name: openshift-demo-nodejs-blue
namespace: ${PROD_PROJECT}
spec:
replicas: 1
selector:
app: openshift-demo-nodejs-blue
color: blue
deploymentconfig: openshift-demo-nodejs-blue
strategy:
activeDeadlineSeconds: 21600
resources: {}
type: Recreate
template:
metadata:
creationTimestamp: null
labels:
app: openshift-demo-nodejs-blue
color: blue
deploymentconfig: openshift-demo-nodejs-blue
template: openshift-demo-nodejs
spec:
containers:
- image: openshift-demo-nodejs:ready-for-prod
imagePullPolicy: IfNotPresent
name: openshift-demo-nodejs-blue
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
test: false
triggers:
- type: ConfigChange
- type: ImageChange
imageChangeParams:
containerNames:
- openshift-demo-nodejs-blue
from:
kind: ImageStreamTag
name: openshift-demo-nodejs:ready-for-prod
namespace: ${PROD_PROJECT}
# The "green" DeploymentConfig
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: openshift-demo-nodejs-green
color: green
template: openshift-demo-nodejs
name: openshift-demo-nodejs-green
namespace: ${PROD_PROJECT}
spec:
replicas: 1
selector:
app: openshift-demo-nodejs-green
color: green
deploymentconfig: openshift-demo-nodejs-green
strategy:
activeDeadlineSeconds: 21600
resources: {}
type: Recreate
template:
metadata:
creationTimestamp: null
labels:
app: openshift-demo-nodejs-green
color: green
deploymentconfig: openshift-demo-nodejs-green
template: openshift-demo-nodejs
spec:
containers:
- image: openshift-demo-nodejs:ready-for-prod
imagePullPolicy: IfNotPresent
name: openshift-demo-nodejs-green
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
test: false
triggers:
- type: ConfigChange
- type: ImageChange
imageChangeParams:
containerNames:
- openshift-demo-nodejs-green
from:
kind: ImageStreamTag
name: openshift-demo-nodejs:ready-for-prod
namespace: ${PROD_PROJECT}
##
## Template Parameters
##
parameters:
- description: The name of the OpenShift Project to that holds the dev environment.
displayName: Development Environment
name: DEV_PROJECT
value: demo-dev
- description: The name of the OpenShift Project to that holds the build environment.
displayName: Build Environment
name: BUILD_PROJECT
value: demo-build
- description: The name of the OpenShift Project to that holds the test environment.
displayName: Test Environment
name: TEST_PROJECT
value: demo-test
- description: The name of the OpenShift Project to that holds the prod environment.
displayName: Production Environment
name: PROD_PROJECT
value: demo-prod
- description: The GIT repository to use.
displayName: GIT Repo URL
name: GIT_REPO
value: https://github.com/nmasse-itix/OpenShift-Demo-NodeJS.git
- description: The OpenShift Namespace where the NodeJS ImageStream resides.
displayName: NodeJS ImageStream Namespace
name: NODEJS_IMAGE_STREAM_NAMESPACE
value: openshift
- description: Name of the ImageStreamTag to be used for the NodeJS image.
displayName: NodeJS ImageStreamTag
name: NODEJS_IMAGE_STREAM_TAG
value: nodejs:latest
- description: The Jenkins Credentials ID that holds the token to login on NPM Registry
displayName: Jenkins Credentials ID for NPM Registry
name: NPM_CREDENTIALS_ID
value: npm-secret
- description: The route to create in the TEST environment and which we will use to run the integration tests
displayName: Application Hostname in the TEST environment
name: TEST_ROUTE_HOSTNAME
required: true
- description: The route to create in the PROD environment
displayName: Application Hostname in the PROD environment
name: PROD_ROUTE_HOSTNAME
required: true