Browse code

Add persistent storage jenkins template

Ben Parees authored on 2015/08/18 04:34:29
Showing 4 changed files
... ...
@@ -72,8 +72,9 @@ func TestExampleObjectSchemas(t *testing.T) {
72 72
 			"application-template-pullspecbuild": &templateapi.Template{},
73 73
 		},
74 74
 		"../examples/jenkins": {
75
-			"jenkins-ephemeral-template": &templateapi.Template{},
76
-			"application-template":       &templateapi.Template{},
75
+			"jenkins-ephemeral-template":  &templateapi.Template{},
76
+			"jenkins-persistent-template": &templateapi.Template{},
77
+			"application-template":        &templateapi.Template{},
77 78
 		},
78 79
 		"../examples/image-streams": {
79 80
 			"image-streams-centos7": &imageapi.ImageStreamList{},
... ...
@@ -59,7 +59,7 @@ Steps
59 59
     
60 60
     Note the ip and port of the Jenkins service reported by this command, you will need it later.
61 61
 
62
-    **Note**: This template uses an EmptyDir type volume.  If you want to ensure your jenkins configuration/job information is persisted through pod restarts and deployments, you will want to use a [PersistentVolume](https://docs.openshift.org/latest/admin_guide/persistent_storage_nfs.html) instead.
62
+    **Note**: This template uses an EmptyDir type volume.  If you want to ensure your jenkins configuration/job information is persisted through pod restarts and deployments, you can use the jenkins-persistent-template.json template file which uses a persistent volume but requires additional [PersistentVolume](https://docs.openshift.org/latest/admin_guide/persistent_storage_nfs.html) setup.  
63 63
     
64 64
 5. Create the sample application configuration
65 65
 
... ...
@@ -34,9 +34,6 @@
34 34
         "portalIP": "",
35 35
         "type": "ClusterIP",
36 36
         "sessionAffinity": "None"
37
-      },
38
-      "status": {
39
-        "loadBalancer": {}
40 37
       }
41 38
     },
42 39
     {
... ...
@@ -126,8 +123,7 @@
126 126
             "dnsPolicy": "ClusterFirst"
127 127
           }
128 128
         }
129
-      },
130
-      "status": {}
129
+      }
131 130
     }
132 131
   ],
133 132
   "parameters": [
134 133
new file mode 100644
... ...
@@ -0,0 +1,168 @@
0
+{
1
+  "kind": "Template",
2
+  "apiVersion": "v1",
3
+  "metadata": {
4
+    "name": "jenkins-persistent",
5
+    "creationTimestamp": null,
6
+    "annotations": {
7
+      "description": "Jenkins service, with persistent storage.",
8
+      "iconClass": "icon-jenkins",
9
+      "tags": "database,jenkins"
10
+    }
11
+  },
12
+  "objects": [
13
+    {
14
+      "kind": "Service",
15
+      "apiVersion": "v1",
16
+      "metadata": {
17
+        "name": "${JENKINS_SERVICE_NAME}",
18
+        "creationTimestamp": null
19
+      },
20
+      "spec": {
21
+        "ports": [
22
+          {
23
+            "name": "web",
24
+            "protocol": "TCP",
25
+            "port": 8080,
26
+            "targetPort": 8080,
27
+            "nodePort": 0
28
+          }
29
+        ],
30
+        "selector": {
31
+          "name": "${JENKINS_SERVICE_NAME}"
32
+        },
33
+        "portalIP": "",
34
+        "type": "ClusterIP",
35
+        "sessionAffinity": "None"
36
+      }
37
+    },
38
+    {
39
+      "kind": "Route",
40
+      "apiVersion": "v1",
41
+      "metadata": {
42
+        "name": "jenkins",
43
+        "creationTimestamp": null
44
+      },
45
+      "spec": {
46
+        "to": {
47
+          "kind": "Service",
48
+          "name": "${JENKINS_SERVICE_NAME}"
49
+        },
50
+        "tls": {
51
+          "termination": "edge",
52
+          "certificate": "-----BEGIN CERTIFICATE-----\nMIIDIjCCAgqgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBoTELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAlNDMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl\nZmF1bHQgQ29tcGFueSBMdGQxEDAOBgNVBAsMB1Rlc3QgQ0ExGjAYBgNVBAMMEXd3\ndy5leGFtcGxlY2EuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlQGV4YW1wbGUu\nY29tMB4XDTE1MDExMjE0MTk0MVoXDTE2MDExMjE0MTk0MVowfDEYMBYGA1UEAwwP\nd3d3LmV4YW1wbGUuY29tMQswCQYDVQQIDAJTQzELMAkGA1UEBhMCVVMxIjAgBgkq\nhkiG9w0BCQEWE2V4YW1wbGVAZXhhbXBsZS5jb20xEDAOBgNVBAoMB0V4YW1wbGUx\nEDAOBgNVBAsMB0V4YW1wbGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrv\ngu6ZTTefNN7jjiZbS/xvQjyXjYMN7oVXv76jbX8gjMOmg9m0xoVZZFAE4XyQDuCm\n47VRx5Qrf/YLXmB2VtCFvB0AhXr5zSeWzPwaAPrjA4ebG+LUo24ziS8KqNxrFs1M\nmNrQUgZyQC6XIe1JHXc9t+JlL5UZyZQC1IfaJulDAgMBAAGjDTALMAkGA1UdEwQC\nMAAwDQYJKoZIhvcNAQEFBQADggEBAFCi7ZlkMnESvzlZCvv82Pq6S46AAOTPXdFd\nTMvrh12E1sdVALF1P1oYFJzG1EiZ5ezOx88fEDTW+Lxb9anw5/KJzwtWcfsupf1m\nV7J0D3qKzw5C1wjzYHh9/Pz7B1D0KthQRATQCfNf8s6bbFLaw/dmiIUhHLtIH5Qc\nyfrejTZbOSP77z8NOWir+BWWgIDDB2//3AkDIQvT20vmkZRhkqSdT7et4NmXOX/j\njhPti4b2Fie0LeuvgaOdKjCpQQNrYthZHXeVlOLRhMTSk3qUczenkKTOhvP7IS9q\n+Dzv5hqgSfvMG392KWh5f8xXfJNs4W5KLbZyl901MeReiLrPH3w=\n-----END CERTIFICATE-----",
53
+          "key": "-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMrvgu6ZTTefNN7j\njiZbS/xvQjyXjYMN7oVXv76jbX8gjMOmg9m0xoVZZFAE4XyQDuCm47VRx5Qrf/YL\nXmB2VtCFvB0AhXr5zSeWzPwaAPrjA4ebG+LUo24ziS8KqNxrFs1MmNrQUgZyQC6X\nIe1JHXc9t+JlL5UZyZQC1IfaJulDAgMBAAECgYEAnxOjEj/vrLNLMZE1Q9H7PZVF\nWdP/JQVNvQ7tCpZ3ZdjxHwkvf//aQnuxS5yX2Rnf37BS/TZu+TIkK4373CfHomSx\nUTAn2FsLmOJljupgGcoeLx5K5nu7B7rY5L1NHvdpxZ4YjeISrRtEPvRakllENU5y\ngJE8c2eQOx08ZSRE4TkCQQD7dws2/FldqwdjJucYijsJVuUdoTqxP8gWL6bB251q\nelP2/a6W2elqOcWId28560jG9ZS3cuKvnmu/4LG88vZFAkEAzphrH3673oTsHN+d\nuBd5uyrlnGjWjuiMKv2TPITZcWBjB8nJDSvLneHF59MYwejNNEof2tRjgFSdImFH\nmi995wJBAMtPjW6wiqRz0i41VuT9ZgwACJBzOdvzQJfHgSD9qgFb1CU/J/hpSRIM\nkYvrXK9MbvQFvG6x4VuyT1W8mpe1LK0CQAo8VPpffhFdRpF7psXLK/XQ/0VLkG3O\nKburipLyBg/u9ZkaL0Ley5zL5dFBjTV2Qkx367Ic2b0u9AYTCcgi2DsCQQD3zZ7B\nv7BOm7MkylKokY2MduFFXU0Bxg6pfZ7q3rvg8gqhUFbaMStPRYg6myiDiW/JfLhF\nTcFT4touIo7oriFJ\n-----END PRIVATE KEY-----",
54
+          "caCertificate": "-----BEGIN CERTIFICATE-----\nMIIEFzCCAv+gAwIBAgIJALK1iUpF2VQLMA0GCSqGSIb3DQEBBQUAMIGhMQswCQYD\nVQQGEwJVUzELMAkGA1UECAwCU0MxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoG\nA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEQMA4GA1UECwwHVGVzdCBDQTEaMBgG\nA1UEAwwRd3d3LmV4YW1wbGVjYS5jb20xIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVA\nZXhhbXBsZS5jb20wHhcNMTUwMTEyMTQxNTAxWhcNMjUwMTA5MTQxNTAxWjCBoTEL\nMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlNDMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkx\nHDAaBgNVBAoME0RlZmF1bHQgQ29tcGFueSBMdGQxEDAOBgNVBAsMB1Rlc3QgQ0Ex\nGjAYBgNVBAMMEXd3dy5leGFtcGxlY2EuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFt\ncGxlQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nw2rK1J2NMtQj0KDug7g7HRKl5jbf0QMkMKyTU1fBtZ0cCzvsF4CqV11LK4BSVWaK\nrzkaXe99IVJnH8KdOlDl5Dh/+cJ3xdkClSyeUT4zgb6CCBqg78ePp+nN11JKuJlV\nIG1qdJpB1J5O/kCLsGcTf7RS74MtqMFo96446Zvt7YaBhWPz6gDaO/TUzfrNcGLA\nEfHVXkvVWqb3gqXUztZyVex/gtP9FXQ7gxTvJml7UkmT0VAFjtZnCqmFxpLZFZ15\n+qP9O7Q2MpsGUO/4vDAuYrKBeg1ZdPSi8gwqUP2qWsGd9MIWRv3thI2903BczDc7\nr8WaIbm37vYZAS9G56E4+wIDAQABo1AwTjAdBgNVHQ4EFgQUugLrSJshOBk5TSsU\nANs4+SmJUGwwHwYDVR0jBBgwFoAUugLrSJshOBk5TSsUANs4+SmJUGwwDAYDVR0T\nBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaMJ33zAMV4korHo5aPfayV3uHoYZ\n1ChzP3eSsF+FjoscpoNSKs91ZXZF6LquzoNezbfiihK4PYqgwVD2+O0/Ty7UjN4S\nqzFKVR4OS/6lCJ8YncxoFpTntbvjgojf1DEataKFUN196PAANc3yz8cWHF4uvjPv\nWkgFqbIjb+7D1YgglNyovXkRDlRZl0LD1OQ0ZWhd4Ge1qx8mmmanoBeYZ9+DgpFC\nj9tQAbS867yeOryNe7sEOIpXAAqK/DTu0hB6+ySsDfMo4piXCc2aA/eI2DCuw08e\nw17Dz9WnupZjVdwTKzDhFgJZMLDqn37HQnT6EemLFqbcR0VPEnfyhDtZIQ==\n-----END CERTIFICATE-----"
55
+        }
56
+      }
57
+    },
58
+    {
59
+      "kind": "PersistentVolumeClaim",
60
+      "apiVersion": "v1",
61
+      "metadata": {
62
+        "name": "${JENKINS_SERVICE_NAME}"
63
+      },
64
+      "spec": {
65
+        "accessModes": [
66
+          "ReadWriteOnce"
67
+        ],
68
+        "resources": {
69
+          "requests": {
70
+            "storage": "${VOLUME_CAPACITY}"
71
+          }
72
+        }
73
+      }
74
+    },    
75
+    {
76
+      "kind": "DeploymentConfig",
77
+      "apiVersion": "v1",
78
+      "metadata": {
79
+        "name": "${JENKINS_SERVICE_NAME}",
80
+        "creationTimestamp": null
81
+      },
82
+      "spec": {
83
+        "strategy": {
84
+          "type": "Recreate",
85
+          "resources": {}
86
+        },
87
+        "triggers": [
88
+          {
89
+            "type": "ConfigChange"
90
+          }
91
+        ],
92
+        "replicas": 1,
93
+        "selector": {
94
+          "name": "${JENKINS_SERVICE_NAME}"
95
+        },
96
+        "template": {
97
+          "metadata": {
98
+            "creationTimestamp": null,
99
+            "labels": {
100
+              "name": "${JENKINS_SERVICE_NAME}"
101
+            }
102
+          },
103
+          "spec": {
104
+            "containers": [
105
+              {
106
+                "name": "jenkins",
107
+                "image": "openshift/jenkins-16-centos7",
108
+                "env": [
109
+                  {
110
+                    "name": "JENKINS_PASSWORD",
111
+                    "value": "${JENKINS_PASSWORD}"
112
+                  }
113
+                ],
114
+                "resources": {},
115
+                "volumeMounts": [
116
+                  {
117
+                    "name": "${JENKINS_SERVICE_NAME}-data",
118
+                    "mountPath": "/var/lib/jenkins"
119
+                  }
120
+                ],
121
+                "terminationMessagePath": "/dev/termination-log",
122
+                "imagePullPolicy": "IfNotPresent",
123
+                "capabilities": {},
124
+                "securityContext": {
125
+                  "capabilities": {},
126
+                  "privileged": false
127
+                }
128
+              }
129
+            ],
130
+            "volumes": [
131
+              {
132
+                "name": "${JENKINS_SERVICE_NAME}-data",
133
+                "persistentVolumeClaim": {
134
+                  "claimName": "${JENKINS_SERVICE_NAME}"
135
+                }
136
+              }
137
+            ],
138
+            "restartPolicy": "Always",
139
+            "dnsPolicy": "ClusterFirst"
140
+          }
141
+        }
142
+      }
143
+    }
144
+  ],
145
+  "parameters": [
146
+    {
147
+      "name": "JENKINS_SERVICE_NAME",
148
+      "description": "Jenkins service name",
149
+      "value": "jenkins"
150
+    },
151
+    {
152
+      "name": "JENKINS_PASSWORD",
153
+      "description": "Password for the Jenkins user",
154
+      "generate": "expression",
155
+      "value": "password"
156
+    },
157
+    {
158
+      "name": "VOLUME_CAPACITY",
159
+      "description": "Volume space available for data, e.g. 512Mi, 2Gi",
160
+      "value": "512Mi",
161
+      "required": true
162
+    }
163
+  ],
164
+  "labels": {
165
+    "template": "jenkins-persistent-template"
166
+  }
167
+}