Spinnaker Chart (#377)

* Initial spinnaker

* Jenkins patch

* Fix jenkins job upload

* Add run script

* Fix mail

* Simplify run-script

* Spinnaker cleanup

* Remove kube config from clouddriver

* Make labels release specific

* Delete upload-run-script job

* Add requirements.lock

* Update notes

* Rename registry account

* Pin image versions

* Reference Spinnaker docs where possible

* Fix build image job

* Add more chart metadata

* Pin hook job images

* Add an app label to config maps

* Rename .yml->.yaml

* Add namespace to port-forward commands

* Add note this can take a while to install
This commit is contained in:
Vic Iglesias
2017-01-20 11:57:51 -08:00
committed by GitHub
parent 20990f62b6
commit 63685ae82b
48 changed files with 2148 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj
+11
View File
@@ -0,0 +1,11 @@
apiVersion: v1
description: A Helm chart for Kubernetes
name: spinnaker
version: 0.1.0
home: http://spinnaker.io/
sources:
- https://github.com/spinnaker
- https://github.com/viglesiasce/images
maintainers:
- name: Vic Iglesias
email: viglesias@google.com
+35
View File
@@ -0,0 +1,35 @@
# Spinnaker Chart
[Spinnaker](http://spinnaker.io/) is a resilient service mesh for cloud native apps
## Chart Details
This chart will provision a fully functional and fully featured Spinnaker installation
that can deploy and manage applications in the cluster that it is deployed to.
Redis and Minio are used as the stores for Spinnaker state.
For more information on Spinnaker and its capabilities, see it's [documentation](http://www.spinnaker.io/docs).
## Installing the Chart
To install the chart with the release name `my-release`:
```bash
$ helm install --name my-release stable/spinnaker
```
Note that this chart pulls in many different Docker images so can take a while to fully install.
## Configuration
Configurable values are documented in the `values.yaml`.
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
```bash
$ helm install --name my-release -f values.yaml stable/spinnaker
```
> **Tip**: You can use the default [values.yaml](values.yaml)
+83
View File
@@ -0,0 +1,83 @@
server:
port: ${services.clouddriver.port:7002}
address: ${services.clouddriver.host:localhost}
redis:
connection: ${services.redis.connection:redis://localhost:6379}
udf:
# Controls whether UserDataProviders are used to populate user data of new
# server groups. If false, user data is copied over from ancestor server
# groups on both CopyLastAsgAtomicOperation and
# ModifyAsgLaunchConfigurationOperation (only if no user data is provided
# on the given request).
enabled: ${services.clouddriver.aws.udf.enabled:true}
default:
account:
env: ${providers.aws.primaryCredentials.name}
aws:
# AWS Credentials are passed either as environment variables or through
# a standard AWS file $HOME/.aws/credentials
# See providers.aws.primaryCredentials in spinnaker.yml for more
# info on setting environment variables.
enabled: ${providers.aws.enabled:false}
defaults:
iamRole: ${provider.aws.defaultIAMRole:BaseIAMRole}
defaultRegions:
- name: ${providers.aws.defaultRegion:us-east-1}
defaultFront50Template: ${services.front50.baseUrl}
defaultKeyPairTemplate: ${providers.aws.defaultKeyPairTemplate}
azure:
enabled: ${providers.azure.enabled:false}
accounts:
- name: ${providers.azure.primaryCredentials.name}
clientId: ${providers.azure.primaryCredentials.clientId}
appKey: ${providers.azure.primaryCredentials.appKey}
tenantId: ${providers.azure.primaryCredentials.tenantId}
subscriptionId: ${providers.azure.primaryCredentials.subscriptionId}
google:
enabled: ${providers.google.enabled:false}
accounts:
- name: ${providers.google.primaryCredentials.name}
project: ${providers.google.primaryCredentials.project}
jsonPath: ${providers.google.primaryCredentials.jsonPath}
cf:
enabled: ${providers.cf.enabled:false}
accounts:
- name: ${providers.cf.primaryCredentials.name}
api: ${providers.cf.primaryCredentials.api}
console: ${providers.cf.primaryCredentials.console}
org: ${providers.cf.defaultOrg}
space: ${providers.cf.defaultSpace}
username: ${providers.cf.account.name:}
password: ${providers.cf.account.password:}
kubernetes:
enabled: ${providers.kubernetes.enabled:false}
accounts:
- name: ${providers.kubernetes.primaryCredentials.name}
serviceAccount: true
dockerRegistries:
- accountName: ${providers.kubernetes.primaryCredentials.dockerRegistryAccount}
dockerRegistry:
enabled: ${providers.dockerRegistry.enabled:false}
accounts:
- name: ${providers.dockerRegistry.primaryCredentials.name}
address: ${providers.dockerRegistry.primaryCredentials.address}
username: ${providers.dockerRegistry.primaryCredentials.username:}
passwordFile: ${providers.dockerRegistry.primaryCredentials.passwordFile:}
repositories:
- ${providers.dockerRegistry.primaryCredentials.repository}
credentials:
primaryAccountTypes: ${providers.aws.primaryCredentials.name}, ${providers.google.primaryCredentials.name}, ${providers.cf.primaryCredentials.name}, ${providers.azure.primaryCredentials.name}
challengeDestructiveActionsEnvironments: ${providers.aws.primaryCredentials.name}, ${providers.google.primaryCredentials.name}, ${providers.cf.primaryCredentials.name}, ${providers.azure.primaryCredentials.name}
+62
View File
@@ -0,0 +1,62 @@
server:
port: ${services.echo.port:8089}
address: 0.0.0.0
cassandra:
enabled: false
spinnaker:
inMemory:
enabled: true
cassandra:
enabled: false
front50:
baseUrl: ${services.front50.baseUrl:http://localhost:8080}
orca:
baseUrl: ${services.orca.baseUrl:http://localhost:8083}
endpoints.health.sensitive: false
slack:
enabled: ${services.echo.notifications.slack.enabled:false}
token: ${services.echo.notifications.slack.token}
spring:
mail:
host: ${services.echo.notifications.mail.host}
port: ${services.echo.notifications.mail.port}
username: ${services.echo.notifications.mail.username}
password: ${services.echo.notifications.mail.password}
properties:
mail:
smtp:
auth: ${services.echo.notifications.mail.auth:true}
ssl:
enable: ${services.echo.notifications.mail.ssl:true}
mail:
enabled: ${services.echo.notifications.mail.enabled:false}
host: ${services.echo.notifications.mail.host}
from: ${services.echo.notifications.mail.fromAddress}
hipchat:
enabled: ${services.echo.notifications.hipchat.enabled:false}
baseUrl: ${services.echo.notifications.hipchat.url}
token: ${services.echo.notifications.hipchat.token}
twilio:
enabled: ${services.echo.notifications.sms.enabled:false}
baseUrl: ${services.echo.notifications.sms.url:https://api.twilio.com/}
account: ${services.echo.notifications.sms.account}
token: ${services.echo.notifications.sms.token}
from: ${services.echo.notifications.sms.from}
scheduler:
enabled: ${services.echo.cron.enabled:true}
threadPoolSize: 20
triggeringEnabled: true
pipelineConfigsPoller:
enabled: true
pollingIntervalMs: 30000
+66
View File
@@ -0,0 +1,66 @@
server:
port: ${services.echo.port:8089}
address: 0.0.0.0
cassandra:
enabled: false
embedded: true
host: ${services.cassandra.host:localhost}
spinnaker:
baseUrl: ${services.deck.baseUrl}
cassandra:
enabled: ${services.echo.cassandra.enabled:true}
inMemory:
enabled: ${services.echo.inMemory.enabled:false}
front50:
baseUrl: ${services.front50.baseUrl:http://localhost:8080}
orca:
baseUrl: ${services.orca.baseUrl:http://localhost:8083}
endpoints.health.sensitive: false
slack:
enabled: ${services.echo.notifications.slack.enabled:false}
token: ${services.echo.notifications.slack.token}
spring:
mail:
host: ${services.echo.notifications.mail.host}
port: ${services.echo.notifications.mail.port}
username: ${services.echo.notifications.mail.username}
password: ${services.echo.notifications.mail.password}
properties:
mail:
smtp:
auth: ${services.echo.notifications.mail.auth:true}
ssl:
enable: ${services.echo.notifications.mail.ssl:true}
mail:
enabled: ${services.echo.notifications.mail.enabled:false}
host: ${services.echo.notifications.mail.host}
from: ${services.echo.notifications.mail.fromAddress}
hipchat:
enabled: ${services.echo.notifications.hipchat.enabled:false}
baseUrl: ${services.echo.notifications.hipchat.url}
token: ${services.echo.notifications.hipchat.token}
twilio:
enabled: ${services.echo.notifications.sms.enabled:false}
baseUrl: ${services.echo.notifications.sms.url:https://api.twilio.com/}
account: ${services.echo.notifications.sms.account}
token: ${services.echo.notifications.sms.token}
from: ${services.echo.notifications.sms.from}
scheduler:
enabled: ${services.echo.cron.enabled:true}
threadPoolSize: 20
triggeringEnabled: true
pipelineConfigsPoller:
enabled: true
pollingIntervalMs: 30000
cron:
timezone: ${services.echo.cron.timezone}
+10
View File
@@ -0,0 +1,10 @@
server:
port: ${services.fiat.port:7003}
address: 0.0.0.0
redis:
connection: ${services.redis.connection:redis://localhost:6379}
auth:
getAll:
enabled: false
+27
View File
@@ -0,0 +1,27 @@
server:
port: ${services.front50.port:8080}
address: 0.0.0.0
aws:
simpleDBEnabled: ${providers.aws.simpleDBEnabled:false}
defaultSimpleDBDomain: ${providers.aws.defaultSimpleDBDomain}
cassandra:
enabled: false
spinnaker:
cassandra:
enabled: false
redis:
enabled: false
gcs:
enabled: ${services.front50.gcs.enabled}
project: ${services.front50.gcs.project}
jsonPath: /root/.kube/account.json # Don't change this
rootFolder: ${services.front50.bucket_root}
bucket: ${services.front50.storage_bucket}
s3:
enabled: ${services.front50.s3.enabled}
rootFolder: ${services.front50.bucket_root}
bucket: ${services.front50.storage_bucket}
endpoint: ${services.front50.s3.endpoint}
+39
View File
@@ -0,0 +1,39 @@
server:
port: ${services.front50.port:8080}
address: ${services.front50.host:localhost}
cassandra:
enabled: ${services.front50.cassandra.enabled:true}
embedded: ${services.cassandra.embedded:false}
host: ${services.cassandra.host:localhost}
aws:
simpleDBEnabled: ${providers.aws.simpleDBEnabled:false}
defaultSimpleDBDomain: ${providers.aws.defaultSimpleDBDomain}
spinnaker:
cassandra:
enabled: ${services.front50.cassandra.enabled:true}
host: ${services.cassandra.host:localhost}
port: ${services.cassandra.port:9042}
cluster: ${services.cassandra.cluster:CASS_SPINNAKER}
keyspace: front50
name: global
redis:
enabled: ${services.front50.redis.enabled:false}
gcs:
enabled: ${services.front50.gcs.enabled:false}
bucket: ${services.front50.storage_bucket:}
# See https://cloud.google.com/storage/docs/managing-buckets#manage-class-location
bucketLocation: ${services.front50.bucket_location:}
rootFolder: ${services.front50.bucket_root:front50}
project: ${providers.google.primaryCredentials.project}
jsonPath: ${providers.google.primaryCredentials.jsonPath}
aws:
enabled: ${services.front50.s3.enabled:false}
bucket: ${services.front50.storage_bucket:}
rootFolder: ${services.front50.bucket_root:front50}
endpoint: ${services.front50.s3.endpoint:}
+25
View File
@@ -0,0 +1,25 @@
server:
port: ${services.gate.port:8084}
address: 0.0.0.0
# Circular references since we're already using 'services'
# services:
# clouddriver:
# baseUrl: ${services.clouddriver.baseUrl:localhost:7002}
# orca:
# baseUrl: ${services.orca.baseUrl:localhost:8083}
# front50:
# baseUrl: ${services.front50.baseUrl:localhost:8080}
# #optional services:
# echo:
# enabled: ${services.echo.enabled:true}
# baseUrl: ${services.echo.baseUrl:8089}
# flapjack:
# enabled: ${services.flapjack.enabled:false}
# igor:
# enabled: ${services.igor.enabled:false}
# baseUrl: ${services.igor.baseUrl:8088}
redis:
connection: ${services.redis.connection}
+24
View File
@@ -0,0 +1,24 @@
server:
port: ${services.gate.port:8084}
address: 0.0.0.0
# Circular references since we're already using 'services'
# services:
# clouddriver:
# baseUrl: ${services.clouddriver.baseUrl:localhost:7002}
# orca:
# baseUrl: ${services.orca.baseUrl:localhost:8083}
# front50:
# baseUrl: ${services.front50.baseUrl:localhost:8080}
# #optional services:
# echo:
# enabled: ${services.echo.enabled:true}
# baseUrl: ${services.echo.baseUrl:8089}
# flapjack:
# enabled: ${services.flapjack.enabled:false}
# igor:
# enabled: ${services.igor.enabled:false}
# baseUrl: ${services.igor.baseUrl:8088}
redis:
connection: ${services.redis.connection}
+25
View File
@@ -0,0 +1,25 @@
server:
port: ${services.igor.port:8088}
address: 0.0.0.0
jenkins:
enabled: ${services.jenkins.enabled:false}
masters:
- name: default
address: ${services.jenkins.defaultMaster.baseUrl}
username: ${services.jenkins.defaultMaster.username}
password: ${services.jenkins.defaultMaster.password}
dockerRegistry:
enabled: true
redis:
connection: ${services.redis.connection:redis://localhost:6379}
# Igor depends on Clouddriver and Echo. These are normally configured
# in spinnaker[-local].yml (if present), otherwise, uncomment this.
# services:
# clouddriver:
# baseUrl: ${services.clouddriver.baseUrl}
# echo:
# baseUrl: ${services.echo.baseUrl}
+33
View File
@@ -0,0 +1,33 @@
server:
port: ${services.igor.port:8088}
address: 0.0.0.0
jenkins:
enabled: ${services.jenkins.enabled:false}
masters:
- name: default
address: ${services.jenkins.defaultMaster.baseUrl}
username: ${services.jenkins.defaultMaster.username}
password: ${services.jenkins.defaultMaster.password}
travis:
enabled: ${services.travis.enabled:false}
masters:
- name: ${services.travis.defaultMaster.name}
baseUrl: ${services.travis.defaultMaster.baseUrl}
address: ${services.travis.defaultMaster.address}
githubToken: ${services.travis.defaultMaster.githubToken}
dockerRegistry:
enabled: true
redis:
connection: ${services.redis.connection:redis://localhost:6379}
# Igor depends on Clouddriver and Echo. These are normally configured
# in spinnaker[-local].yml (if present), otherwise, uncomment this.
# services:
# clouddriver:
# baseUrl: ${services.clouddriver.baseUrl}
# echo:
# baseUrl: ${services.echo.baseUrl}
+39
View File
@@ -0,0 +1,39 @@
server:
port: ${services.orca.port:8083}
address: 0.0.0.0
oort:
baseUrl: ${services.oort.baseUrl:localhost:7002}
front50:
baseUrl: ${services.front50.baseUrl:localhost:8080}
mort:
baseUrl: ${services.mort.baseUrl:localhost:7002}
kato:
baseUrl: ${services.kato.baseUrl:localhost:7002}
bakery:
baseUrl: ${services.bakery.baseUrl:localhost:8087}
extractBuildDetails: ${services.bakery.extractBuildDetails:true}
echo:
enabled: ${services.echo.enabled:false}
baseUrl: ${services.echo.baseUrl:8089}
igor:
baseUrl: ${services.igor.baseUrl:8088}
# TODO(duftler): Remove this once flex is conditionally-enabled in orca.
flex:
baseUrl: http://not-a-host
default:
bake:
account: ${providers.aws.primaryCredentials.name}
securityGroups:
vpc:
securityGroups:
redis:
connection: ${services.redis.connection}
script:
master: default # name of Jenkins master in Spinnaker
job: run-script # from Jenkins job configuration
+45
View File
@@ -0,0 +1,45 @@
server:
port: ${services.orca.port:8083}
address: 0.0.0.0
oort:
baseUrl: ${services.oort.baseUrl:localhost:7002}
front50:
baseUrl: ${services.front50.baseUrl:localhost:8080}
mort:
baseUrl: ${services.mort.baseUrl:localhost:7002}
kato:
baseUrl: ${services.kato.baseUrl:localhost:7002}
bakery:
baseUrl: ${services.bakery.baseUrl:localhost:8087}
extractBuildDetails: ${services.bakery.extractBuildDetails:true}
propagateCloudProviderType: ${services.bakery.propagateCloudProviderType:true}
allowMissingPackageInstallation: ${services.bakery.allowMissingPackageInstallation:false}
echo:
enabled: ${services.echo.enabled:false}
baseUrl: ${services.echo.baseUrl:8089}
igor:
baseUrl: ${services.igor.baseUrl:8088}
# TODO(duftler): Remove this once flex is conditionally-enabled in orca.
flex:
baseUrl: http://not-a-host
default:
bake:
account: local
securityGroups:
vpc:
securityGroups:
redis:
connection: ${services.redis.connection}
tasks:
executionWindow:
timezone: ${services.orca.timezone}
script:
master: default # name of Jenkins master in Spinnaker
job: run-script # from Jenkins job configuration
+27
View File
@@ -0,0 +1,27 @@
server:
port: ${services.rosco.port:8087}
address: 0.0.0.0
redis:
connection: ${services.redis.connection:redis://localhost:6379}
aws:
enabled: ${providers.aws.enabled:false}
docker:
enabled: ${services.docker.enabled:false}
bakeryDefaults:
targetRepository: ${services.docker.targetRepository}
google:
enabled: ${providers.google.enabled:false}
accounts:
- name: ${providers.google.primaryCredentials.name}
project: ${providers.google.primaryCredentials.project}
jsonPath: ${providers.google.primaryCredentials.jsonPath}
gce:
bakeryDefaults:
zone: ${providers.google.defaultZone}
rosco:
configDir: ${services.rosco.configDir}
+27
View File
@@ -0,0 +1,27 @@
server:
port: ${services.rosco.port:8087}
address: 0.0.0.0
redis:
connection: ${services.redis.connection:redis://localhost:6379}
aws:
enabled: ${providers.aws.enabled:false}
docker:
enabled: ${services.docker.enabled:false}
bakeryDefaults:
targetRepository: ${services.docker.targetRepository}
google:
enabled: ${providers.google.enabled:false}
accounts:
- name: ${providers.google.primaryCredentials.name}
project: ${providers.google.primaryCredentials.project}
jsonPath: ${providers.google.primaryCredentials.jsonPath}
gce:
bakeryDefaults:
zone: ${providers.google.defaultZone}
rosco:
configDir: ${services.rosco.configDir}
+53
View File
@@ -0,0 +1,53 @@
'use strict';
var feedbackUrl = 'http://localhost';
var gateHost = 'http://localhost:8084';
var bakeryDetailUrl = 'http://localhost:8087';
window.spinnakerSettings = {
defaultProviders: ['kubernetes'],
feedbackUrl: feedbackUrl,
gateUrl: gateHost,
bakeryDetailUrl: bakeryDetailUrl,
pollSchedule: 30000,
defaultTimeZone: 'America/Los_Angeles', // see http://momentjs.com/timezone/docs/#/data-utilities/
providers: {
kubernetes: {
defaults: {
account: 'local',
namespace: 'default'
},
}
},
notifications: {
email: {
enabled: true,
},
hipchat: {
enabled: false,
botName: 'Skynet T-800'
},
sms: {
enabled: false,
},
slack: {
enabled: false,
botName: 'spinnakerbot'
}
},
whatsNew: {
gistId: '32526cd608db3d811b38',
fileName: 'news.md',
},
feature: {
pipelines: true,
jobs: true,
notifications: true,
fastProperty: false,
vpcMigrator: false,
clusterDiff: false,
roscoMode: false,
netflixMode: false,
infrastructureStages: true, // Should 'createLoadBalancer' be a pipeline stage? (no).
},
};
+294
View File
@@ -0,0 +1,294 @@
# This file is intended to serve as a master configuration for a Spinnaker
# deployment. Customizations to the deployment should be made in another file
# named "spinnaker-local.yml". The distribution has a prototype called
# "default-spinnaker-local.yml" which calls out the subset of attributes of
# general interest. It can be copied into a "spinnaker-local.yml" to start
# with. The prototype does not change any of the default values here, it just
# surfaces the more critical attributes.
global:
spinnaker:
environment: test
timezone: 'America/Los_Angeles'
services:
default:
# These defaults can be modified to change all the spinnaker subsystems
# (clouddriver, gate, etc) at once, but not external systems (jenkins, etc).
# Individual systems can still be overridden using their own section entry
# directly under 'services'.
host: localhost
protocol: http
clouddriver:
host: ${services.default.host}
port: 7002
baseUrl: ${services.default.protocol}://${services.clouddriver.host}:${services.clouddriver.port}
aws:
udf:
# Controls whether UserDataProviders are used to populate user data of
# new server groups. If false, user data is copied over from ancestor
# server groups on both CopyLastAsgAtomicOperation and
# ModifyAsgLaunchConfigurationOperation (only if no user data is
# provided on the given request).
enabled: true
echo:
enabled: true
host: ${services.default.host}
port: 8089
baseUrl: ${services.default.protocol}://${services.echo.host}:${services.echo.port}
cron:
# Allow pipeline triggers to run periodically via cron expressions.
enabled: true
timezone: ${global.spinnaker.timezone}
notifications:
# The following blocks can enable Spinnaker to send notifications
# using the corresponding mechanism.
# See http://www.spinnaker.io/docs/notifications-and-events-guide
# for more information.
mail:
enabled: ${services.echo.notifications.mail.enabled:false}
host: ${services.echo.notifications.mail.host}
from: ${services.echo.notifications.mail.fromAddress}
username: ${services.echo.notifications.mail.username}
password: ${services.echo.notifications.mail.password}
port: ${services.echo.notifications.mail.port}
hipchat:
enabled: false
url: # the hipchat server to connect to
token: # the hipchat auth token
botName: # the username of the bot
sms:
enabled: false
account: # twilio account id
token: # twilio auth token
from: # phone number by which sms messages are sent
slack:
enabled: false
token: # the API token for the bot
botName: # the username of the bot
deck:
host: ${services.default.host}
port: 9000
baseUrl: ${services.default.protocol}://${services.deck.host}:${services.deck.port}
gateUrl: ${services.gate.baseUrl}
bakeryUrl: ${services.bakery.baseUrl}
timezone: ${global.spinnaker.timezone}
auth:
enabled: false
fiat:
enabled: false
host: ${services.default.host}
port: 7003
baseUrl: ${services.default.protocol}://${services.fiat.host}:${services.fiat.port}
front50:
host: ${services.default.host}
port: 8080
baseUrl: ${services.default.protocol}://${services.front50.host}:${services.front50.port}
# If using storage bucket persistence (gcs or s3), specify the bucket here
# disable cassandra and enable the storage service below.
storage_bucket: ${services.front50.storage_bucket}
# (GCS Only) Location for bucket.
bucket_location:
bucket_root: front50
cassandra:
enabled: false
redis:
enabled: false
gcs:
enabled: ${services.front50.gcs.enabled} # Enable me
project: ${services.front50.gcs.project}
s3:
enabled: ${services.front50.s3.enabled} # Or me
endpoint: ${services.front50.s3.endpoint}
gate:
host: ${services.default.host}
port: 8084
baseUrl: ${services.default.protocol}://${services.gate.host}:${services.gate.port}
igor:
# If you are integrating Jenkins then you must also enable Spinnaker's
# "igor" subsystem.
enabled: false
host: ${services.default.host}
port: 8088
baseUrl: ${services.default.protocol}://${services.igor.host}:${services.igor.port}
kato:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
mort:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
orca:
host: ${services.default.host}
port: 8083
baseUrl: ${services.default.protocol}://${services.orca.host}:${services.orca.port}
timezone: ${global.spinnaker.timezone}
enabled: true
oort:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
rosco:
host: ${services.default.host}
port: 8087
baseUrl: ${services.default.protocol}://${services.rosco.host}:${services.rosco.port}
# You need to provide the fully-qualified path to the directory containing the packer templates.
# They typically live in rosco's config/packer directory.
configDir: /opt/rosco/config/packer
bakery:
host: ${services.rosco.host}
port: ${services.rosco.port}
baseUrl: ${services.rosco.baseUrl}
extractBuildDetails: true
propagateCloudProviderType: true
allowMissingPackageInstallation: false
docker:
# This target repository is used by the bakery to publish baked docker images.
# Do not include http://.
enabled: ${services.docker.enabled:false}
targetRepository: ${services.docker.targetRepository}
jenkins:
# The "name" entry is used for the display name when selecting
# this server. You must set `enabled` to true when enabling igor.
#
# If you have multiple jenkins servers, you will need to list
# them in an igor-local.yml. See jenkins.masters in config/igor.yml.
#
# Note that jenkins is not installed with Spinnaker so you must obtain this
# on your own if you are interested.
enabled: ${services.igor.enabled:false}
defaultMaster:
name: Jenkins
baseUrl: # Expected in spinnaker-local.yml
username: # Expected in spinnaker-local.yml
password: # Expected in spinnaker-local.yml
redis:
host: ${services.default.host}
port: 6379
connection: redis://${services.redis.host}:${services.redis.port}
cassandra:
# cassandra.enabled is no longer used
# cassandra is enabled or disabled on a per-service basis
# where the alternative persistence mechanism for that service
# can be enabled.
host: ${services.cassandra.host}
port: ${services.cassandra.port}
embedded: ${services.cassandra.embedded}
cluster: ${services.cassandra.cluster}
providers:
aws:
# For more information on configuring Amazon Web Services (aws), see
# http://www.spinnaker.io/v1.0/docs/target-deployment-setup#section-amazon-web-services-setup
enabled: false
simpleDBEnabled: false
defaultRegion: us-east-1
defaultSimpleDBDomain: CLOUD_APPLICATIONS
primaryCredentials:
name: default
# The actual credentials are set using a standard AWS client library mechanism
# http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html
# Typically this is a $HOME/.aws/credentials file (remember, a standard
# spinnaker installation runs as user "spinnaker" whose $HOME is
# /home/spinnaker). The primaryCredentials.name will identify which profile
# to use (for .aws/credentials).
# {{name}} will be interpolated with the aws account name (e.g. "my-aws-account-keypair").
defaultKeyPairTemplate: "{{name}}-keypair"
google:
# For more information on configuring Google Cloud Platform (google), see
# http://www.spinnaker.io/v1.0/docs/target-deployment-setup#section-google-cloud-platform-setup
enabled: false
defaultRegion: us-central1
defaultZone: us-central1-f
primaryCredentials:
name: my-account-name
# The project is the Google Project ID for the project to manage with
# Spinnaker. The jsonPath is a path to the JSON service credentials
# downloaded from the Google Developer's Console.
project:
jsonPath:
cf:
# For more information on configuring Cloud Foundry (cf) support, see
# http://www.spinnaker.io/v1.0/docs/target-deployment-setup#section-cloud-foundry-platform-setup
enabled: false
defaultOrg: spinnaker-cf-org
defaultSpace: spinnaker-cf-space
primaryCredentials:
name: my-cf-account
api: my-cf-api-uri
console: my-cf-console-base-url
# You must also supply cf.account.username and cf.account.password through env properties
azure:
# For more information on configuring Microsoft Azure (azure), see
# http://www.spinnaker.io/v1.0/docs/target-deployment-setup#section-azure-cloud-platform-setup
enabled: false
defaultRegion: westus
primaryCredentials:
name: my-azure-account
# To set Azure credentials, enter your Azure supscription values for:
# clientId, appKey, tenantId, and subscriptionId.
clientId:
appKey:
tenantId:
subscriptionId:
titan:
# If you want to deploy some services to titan,
# set enabled and provide primary credentials for deploying.
# Enabling titan is independent of other providers.
enabled: false
defaultRegion: us-east-1
primaryCredentials:
name: my-titan-account
kubernetes:
# For more information on configuring Kubernetes clusters (kubernetes), see
# http://www.spinnaker.io/v1.0/docs/target-deployment-setup#section-kubernetes-cluster-setup
# NOTE: enabling kubernetes also requires enabling dockerRegistry.
enabled: ${providers.kubernetes.enabled}
primaryCredentials:
name: ${providers.kubernetes.primaryCredentials.name}
namespace: ${providers.kubernetes.primaryCredentials.namespace}
dockerRegistryAccount: ${providers.dockerRegistry.primaryCredentials.name}
dockerRegistry:
# If you want to use a container based provider, you need to configure and
# enable this provider to cache images.
enabled: ${providers.dockerRegistry.enabled}
primaryCredentials:
name: ${providers.dockerRegistry.primaryCredentials.name}
address: ${providers.dockerRegistry.primaryCredentials.address}
repository: ${providers.dockerRegistry.primaryCredentials.repository}
+9
View File
@@ -0,0 +1,9 @@
dependencies:
- name: redis
repository: https://kubernetes-charts.storage.googleapis.com/
version: 0.4.2
- name: minio
repository: https://kubernetes-charts.storage.googleapis.com/
version: 0.0.1
digest: sha256:c80d5e19cfba940133477743a3f5416a526b5942c7689f0589257be042ef0924
generated: 2017-01-06T11:22:49.384880181-08:00
+7
View File
@@ -0,0 +1,7 @@
dependencies:
- name: redis
version: 0.4.2
repository: https://kubernetes-charts.storage.googleapis.com/
- name: minio
version: 0.0.1
repository: https://kubernetes-charts.storage.googleapis.com/
+10
View File
@@ -0,0 +1,10 @@
1. You will need to create 2 port forwarding tunnels in order to access the Spinnaker UI:
export GATE_POD=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "component=gate,app={{ template "fullname" . }}" -o jsonpath="{.items[0].metadata.name}")
export DECK_POD=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "component=deck,app={{ template "fullname" . }}" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward --namespace {{ .Release.Namespace }} $GATE_POD 8084 &
kubectl port-forward --namespace {{ .Release.Namespace }} $DECK_POD 9000 &
2. Visit the Spinnaker UI by opening your browser to: http://127.0.0.1:9000
For more info on the Kubernetes integration for Spinnaker, visit:
http://www.spinnaker.io/docs/kubernetes-source-to-prod
+16
View File
@@ -0,0 +1,16 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 24 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 24 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 24 | trimSuffix "-" -}}
{{- end -}}
@@ -0,0 +1,87 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-jenkins-config
labels:
app: {{ template "fullname" . }}
data:
config.xml: |-
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<disabledAdministrativeMonitors/>
<version>2.7.3</version>
<numExecutors>0</numExecutors>
<mode>NORMAL</mode>
<useSecurity>false</useSecurity>
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
<denyAnonymousReadAccess>false</denyAnonymousReadAccess>
</authorizationStrategy>
<disableRememberMe>false</disableRememberMe>
<projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
<workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULLNAME}</workspaceDir>
<buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
<markupFormatter class="hudson.markup.EscapedMarkupFormatter"/>
<jdks/>
<viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
<myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
<clouds>
<org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud plugin="kubernetes@0.8">
<name>default</name>
<templates>
<org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
<name>jnlp</name>
<image>{{ .Values.jenkins.Agent.Image }}:{{ .Values.jenkins.Agent.ImageTag }}</image>
<privileged>false</privileged>
<alwaysPullImage>false</alwaysPullImage>
<command></command>
<args></args>
<remoteFs>/home/jenkins</remoteFs>
<instanceCap>2147483647</instanceCap>
<label></label>
<nodeSelector></nodeSelector>
<resourceRequestCpu>{{.Values.jenkins.Agent.Cpu}}</resourceRequestCpu>
<resourceRequestMemory>{{.Values.jenkins.Agent.Memory}}</resourceRequestMemory>
<resourceLimitCpu>{{.Values.jenkins.Agent.Cpu}}</resourceLimitCpu>
<resourceLimitMemory>{{.Values.jenkins.Agent.Memory}}</resourceLimitMemory>
<volumes>
<org.csanchez.jenkins.plugins.kubernetes.PodVolumes_-HostPathVolume>
<mountPath>/usr/bin/docker</mountPath>
<hostPath>/usr/bin/docker</hostPath>
</org.csanchez.jenkins.plugins.kubernetes.PodVolumes_-HostPathVolume>
<org.csanchez.jenkins.plugins.kubernetes.PodVolumes_-HostPathVolume>
<mountPath>/var/run/docker.sock</mountPath>
<hostPath>/var/run/docker.sock</hostPath>
</org.csanchez.jenkins.plugins.kubernetes.PodVolumes_-HostPathVolume>
</volumes>
<envVars/>
<annotations/>
<imagePullSecrets/>
</org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
</templates>
<serverUrl>https://kubernetes.default</serverUrl>
<skipTlsVerify>false</skipTlsVerify>
<namespace>{{ .Release.Namespace }}</namespace>
<jenkinsUrl>http://{{ template "fullname" . }}-igor:8080</jenkinsUrl>
<jenkinsTunnel>{{ template "fullname" . }}-igor:50000</jenkinsTunnel>
<containerCap>100</containerCap>
<retentionTimeout>5</retentionTimeout>
</org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud>
</clouds>
<quietPeriod>0</quietPeriod>
<scmCheckoutRetryCount>0</scmCheckoutRetryCount>
<views>
<hudson.model.AllView>
<owner class="hudson" reference="../../.."/>
<name>All</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
</hudson.model.AllView>
</views>
<primaryView>All</primaryView>
<slaveAgentPort>50000</slaveAgentPort>
<label></label>
<nodeProperties/>
<globalNodeProperties/>
<noUsageStatistics>true</noUsageStatistics>
</hudson>
@@ -0,0 +1,139 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-jenkins-jobs
labels:
app: {{ template "fullname" . }}
data:
run-script.xml: |-
<?xml version='1.0' encoding='UTF-8'?>
<project>
<actions/>
<description></description>
<logRotator class="hudson.tasks.LogRotator">
<daysToKeep>10</daysToKeep>
<numToKeep>500</numToKeep>
<artifactDaysToKeep>-1</artifactDaysToKeep>
<artifactNumToKeep>-1</artifactNumToKeep>
</logRotator>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>COMMAND</name>
<description>Executable script and parameters</description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>REPO_URL</name>
<description>git repository url.</description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>BRANCH</name>
<description>Branch or sha to build</description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
</properties>
<scm class="hudson.plugins.git.GitSCM" plugin="git@2.4.0">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<name>apidaemon</name>
<url>$REPO_URL</url>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>master</name>
</hudson.plugins.git.BranchSpec>
</branches>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<submoduleCfg class="list"/>
</scm>
<concurrentBuild>true</concurrentBuild>
<builders>
<hudson.plugins.descriptionsetter.DescriptionSetterBuilder plugin="description-setter@1.10">
<description>${COMMAND}</description>
</hudson.plugins.descriptionsetter.DescriptionSetterBuilder>
<hudson.tasks.Shell>
<command>${COMMAND}</command>
</hudson.tasks.Shell>
</builders>
<publishers>
<hudson.tasks.ArtifactArchiver>
<artifacts>*.properties, *.json, *.yml</artifacts>
<allowEmptyArchive>true</allowEmptyArchive>
<onlyIfSuccessful>false</onlyIfSuccessful>
<fingerprint>false</fingerprint>
<defaultExcludes>true</defaultExcludes>
</hudson.tasks.ArtifactArchiver>
</publishers>
<buildWrappers/>
</project>
build-image.xml: |-
<?xml version='1.0' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@2.9">
<actions/>
<description></description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>REPOSITORY_URL</name>
<description></description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>IMAGE_REPO</name>
<description></description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>IMAGE_TAG</name>
<description></description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>BRANCH</name>
<description></description>
<defaultValue></defaultValue>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
<org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
<triggers/>
</org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
</properties>
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.23">
<script>node {
checkout([$class: &apos;GitSCM&apos;,
branches: [[name: &apos;$BRANCH&apos;]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[url: &apos;$REPOSITORY_URL&apos;]]]
)
stage(&apos;save-env&apos;) {
sh &apos;env &gt; properties&apos;
}
stage(&apos;build-image&apos;) {
sh &apos;docker build -t $IMAGE_REPO:$IMAGE_TAG .&apos;
}
stage(&apos;push-image&apos;) {
sh &apos;gcloud docker -- push $IMAGE_REPO:$IMAGE_TAG&apos;
}
archiveArtifacts &apos;properties&apos;
}
</script>
<sandbox>true</sandbox>
</definition>
<triggers/>
</flow-definition>
@@ -0,0 +1,11 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "fullname" . }}-s3-config
labels:
app: {{template "fullname" .}}
data:
credentials: |
[default]
aws_access_key_id={{ .Values.minio.AccessKey }}
aws_secret_access_key={{ .Values.minio.SecretKey }}
@@ -0,0 +1,247 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "fullname" . }}-spinnaker-config
labels:
app: {{ template "fullname" . }}
data:
clouddriver.yml: |
{{.Files.Get "config/clouddriver.yml" | indent 4}}
echo.yml: |
{{.Files.Get "config/echo.yml" | indent 4}}
echo-local.yml: |
{{.Files.Get "config/echo-local.yml" | indent 4}}
fiat.yml: |
{{.Files.Get "config/fiat.yml" | indent 4}}
fiat.yml-local: |
{{.Files.Get "config/fiat-local.yml" | indent 4}}
front50.yml: |
{{.Files.Get "config/front50.yml" | indent 4}}
front50-local.yml: |
{{.Files.Get "config/front50-local.yml" | indent 4}}
gate.yml: |
{{.Files.Get "config/gate.yml" | indent 4}}
gate-local.yml: |
{{.Files.Get "config/gate-local.yml" | indent 4}}
igor.yml: |
{{.Files.Get "config/igor.yml" | indent 4}}
igor-local.yml: |
{{.Files.Get "config/igor-local.yml" | indent 4}}
orca.yml: |
{{.Files.Get "config/orca.yml" | indent 4}}
orca-local.yml: |
{{.Files.Get "config/orca-local.yml" | indent 4}}
rosco.yml: |
{{.Files.Get "config/rosco.yml" | indent 4}}
rosco-local.yml: |
{{.Files.Get "config/rosco-local.yml" | indent 4}}
settings.js: |
{{.Files.Get "config/settings.js" | indent 4}}
spinnaker.yml: |
{{.Files.Get "config/spinnaker.yml" | indent 4}}
clouddriver-local.yml: |
server:
port: ${services.clouddriver.port:7002}
address: 0.0.0.0
default:
account:
env: ${providers.kubernetes.primaryCredentials.name}
kubernetes:
enabled: true
accounts:
- name: local
dockerRegistries:
{{- range $index, $account := .Values.accounts }}
- accountName: {{ $account.name }}
{{- end }}
dockerRegistry:
enabled: true
accounts:
{{- range $index, $account := .Values.accounts }}
- name: {{ $account.name }}
address: {{ $account.address }}
repositories:
{{- range $index, $repo := $account.repositories }}
- {{ $repo }}
{{- end }}
{{- end }}
credentials:
primaryAccountTypes: ${providers.kubernetes.primaryCredentials.name}
challengeDestructiveActionsEnvironments: ${providers.kubernetes.primaryCredentials.name}
spinnaker-local.yml: |
global:
spinnaker:
environment: test
services:
default:
# These defaults can be modified to change all the spinnaker subsystems
# (clouddriver, gate, etc) at once, but not external systems (jenkins, etc).
# Individual systems can still be overridden using their own section entry
# directly under 'services'.
host: localhost
protocol: http
clouddriver:
host: {{ template "fullname" . }}-clouddriver
port: 7002
baseUrl: ${services.default.protocol}://${services.clouddriver.host}:${services.clouddriver.port}
# Controls whether UserDataProviders are used to populate user data of new server groups.
# If false, user data is copied over from ancestor server groups on both CopyLastAsgAtomicOperation and
# ModifyAsgLaunchConfigurationOperation (only if no user data is provided on the given request).
aws:
udf:
enabled: false
echo:
enabled: true
host: {{ template "fullname" . }}-echo
port: 8089
baseUrl: ${services.default.protocol}://${services.echo.host}:${services.echo.port}
cron:
enabled: true
notifications:
# allow pipeline triggers to run periodically via cron expressions
# If you wish for spinnaker to send notifications, configure the following blocks
mail:
enabled: {{ .Values.mail.enabled }}
host: {{ .Values.mail.host }}
username: {{ .Values.mail.username }}
password: {{ .Values.mail.password }}
fromAddress: {{ .Values.mail.fromAddress }}
port: {{ .Values.mail.port }}
hipchat:
enabled: false
url: # the hipchat server to connect to
token: #the hipchat auth token
sms:
enabled: false
account: # twilio account id
token: # twilio auth token
from: # phone number by which sms messages are sent
slack:
enabled: false
token: # the part after http://hooks.slack.com/services/
deck:
host: {{ template "fullname" . }}-deck
port: 9000
baseUrl: ${services.default.protocol}://${services.deck.host}:${services.deck.port}
gateUrl: ${services.gate.baseUrl}
bakeryUrl: ${services.bakery.baseUrl}
timezone: 'America/New_York'
auth:
enabled: false
front50:
host: {{ template "fullname" . }}-front50
port: 8080
baseUrl: ${services.default.protocol}://${services.front50.host}:${services.front50.port}
# If using storage bucket persistence (gcs or s3), specify the bucket here
# disable cassandra and enable the storage service below.
storage_bucket: {{ .Values.storageBucket }}
bucket_root: front50
cassandra:
enabled: false
redis:
enabled: false
gcs:
enabled: false
project: my-project
s3:
enabled: true
endpoint: http://{{ .Release.Name }}-minio:9000
gate:
host: {{ template "fullname" . }}-gate
port: 8084
baseUrl: ${services.default.protocol}://${services.gate.host}:${services.gate.port}
igor:
# If you are integrating Jenkins then you must also enable Spinnaker's
# "igor" subsystem.
enabled: true
host: {{ template "fullname" . }}-igor
port: 8088
baseUrl: ${services.default.protocol}://${services.igor.host}:${services.igor.port}
kato:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
mort:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
orca:
host: {{ template "fullname" . }}-orca
port: 8083
baseUrl: ${services.default.protocol}://${services.orca.host}:${services.orca.port}
enabled: true
oort:
host: ${services.clouddriver.host}
port: ${services.clouddriver.port}
baseUrl: ${services.clouddriver.baseUrl}
rosco:
host: {{ template "fullname" . }}-rosco
port: 8087
baseUrl: ${services.default.protocol}://${services.rosco.host}:${services.rosco.port}
# You need to provide the fully-qualified path to the directory containing the packer templates.
# They typically live in rosco's config/packer directory.
configDir: /opt/rosco/config/packer
bakery:
host: ${services.rosco.host}
port: ${services.rosco.port}
baseUrl: ${services.rosco.baseUrl}
extractBuildDetails: true
docker:
# This target repository is used by the bakery to publish baked docker images.
# Do not include http://.
enabled: true
targetRepository: viglesiasce/sample-app
jenkins:
# The "name" entry is used for the display name when selecting
# this server. You must set `enabled` to true when enabling igor.
#
# If you have multiple jenkins servers, you will need to list
# them in an igor-local.yml. See jenkins.masters in config/igor.yml.
#
# Note that jenkins is not installed with Spinnaker so you must obtain this
# on your own if you are interested.
enabled: true
defaultMaster:
name: default
baseUrl: http://localhost:8080/
username: admin
password: admin
redis:
host: {{ .Release.Name }}-redis
port: 6379
connection: redis://:{{ .Values.redis.redisPassword }}@${services.redis.host}:${services.redis.port}
providers:
kubernetes:
enabled: true
primaryCredentials:
name: local
namespace: default
dockerRegistryAccount: ${providers.dockerRegistry.primaryCredentials.name}
dockerRegistry:
enabled: true
primaryCredentials:
name: my-docker-account
address: https://index.docker.io/
repository: {{ .Values.repository }}
@@ -0,0 +1,34 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-clouddriver
labels:
app: {{ template "fullname" . }}
component: clouddriver
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: clouddriver
spec:
containers:
- image: {{ .Values.images.clouddriver }}
name: clouddriver
ports:
- containerPort: 7002
name: clouddriver
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
readinessProbe:
httpGet:
path: /credentials
port: 7002
initialDelaySeconds: 20
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,38 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-deck
labels:
app: {{ template "fullname" . }}
component: deck
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: deck
spec:
containers:
- image: {{ .Values.images.deck }}
name: deck
command:
- /bin/bash
- -c
args:
- "cp /opt/spinnaker/config/settings.js .; npm start"
env:
- name: DECK_HOST
value: "0.0.0.0"
- name: DECK_PORT
value: "9000"
ports:
- containerPort: 9000
name: deck
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,34 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-echo
labels:
app: {{ template "fullname" . }}
component: echo
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: echo
spec:
containers:
- image: {{ .Values.images.echo }}
name: echo
ports:
- containerPort: 8089
name: echo
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
readinessProbe:
httpGet:
path: /env
port: 8089
initialDelaySeconds: 20
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,39 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-front50
labels:
app: {{ template "fullname" . }}
component: front50
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: front50
spec:
containers:
- image: {{ .Values.images.front50 }}
name: front50
ports:
- containerPort: 8080
name: front50
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
- mountPath: /root/.aws
name: {{ template "fullname" . }}-s3-config
readinessProbe:
httpGet:
path: /env
port: 8080
initialDelaySeconds: 20
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
- name: {{ template "fullname" . }}-s3-config
configMap:
name: {{ template "fullname" . }}-s3-config
@@ -0,0 +1,34 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-gate
labels:
app: {{ template "fullname" . }}
component: gate
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: gate
spec:
containers:
- image: {{ .Values.images.gate }}
name: gate
ports:
- containerPort: 8084
name: gate
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
livenessProbe:
httpGet:
path: /env
port: 8084
initialDelaySeconds: 30
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,76 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-igor
labels:
app: {{ template "fullname" . }}
component: igor
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: igor
annotations:
pod.alpha.kubernetes.io/init-containers: '[
{
"name": "copy-default-config",
"image": "{{.Values.jenkins.Master.Image}}:{{.Values.jenkins.Master.ImageTag}}",
"command": ["cp", "-n", "/var/jenkins_config/config.xml", "/var/jenkins_home"],
"imagePullPolicy": "IfNotPresent",
"volumeMounts": [
{
"name": "jenkins-config",
"mountPath": "/var/jenkins_config"
},
{
"name": "jenkins-home",
"mountPath": "/var/jenkins_home"
}
]
}
]'
spec:
containers:
- image: {{ .Values.images.igor }}
name: igor
ports:
- containerPort: 8088
name: igor
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
readinessProbe:
httpGet:
path: /env
port: 8088
initialDelaySeconds: 20
timeoutSeconds: 1
- name: jenkins-master
image: "{{.Values.jenkins.Master.Image}}:{{.Values.jenkins.Master.ImageTag}}"
imagePullPolicy: "{{.Values.jenkins.Master.ImagePullPolicy}}"
env:
- name: JAVA_OPTS
value: "{{ default "" .Values.jenkins.Master.JavaOpts}}"
ports:
- containerPort: {{.Values.jenkins.Master.ContainerPort}}
name: http
- containerPort: {{.Values.jenkins.Master.SlaveListenerPort}}
name: slavelistener
resources:
requests:
cpu: "{{.Values.jenkins.Master.Cpu}}"
memory: "{{.Values.jenkins.Master.Memory}}"
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins-home
volumes:
- name: jenkins-config
configMap:
name: {{ .Release.Name }}-jenkins-config
- name: jenkins-home
emptyDir: {}
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,34 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-orca
labels:
app: {{ template "fullname" . }}
component: orca
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: orca
spec:
containers:
- image: {{ .Values.images.orca }}
name: orca
ports:
- containerPort: 8083
name: orca
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
readinessProbe:
httpGet:
path: /env
port: 8083
initialDelaySeconds: 20
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
@@ -0,0 +1,44 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}-rosco
labels:
app: {{ template "fullname" . }}
component: rosco
spec:
replicas: 1
template:
metadata:
labels:
app: {{ template "fullname" . }}
component: rosco
spec:
containers:
- image: {{ .Values.images.rosco }}
name: rosco
ports:
- containerPort: 8087
name: rosco
volumeMounts:
- mountPath: /opt/spinnaker/config
name: {{ template "fullname" . }}-spinnaker-config
- mountPath: /usr/bin/docker
name: docker-bin
- mountPath: /var/run/docker.sock
name: docker-sock
readinessProbe:
httpGet:
path: /env
port: 8087
initialDelaySeconds: 20
timeoutSeconds: 1
volumes:
- name: {{ template "fullname" . }}-spinnaker-config
configMap:
name: {{ template "fullname" . }}-spinnaker-config
- name: docker-bin
hostPath:
path: /usr/bin/docker
- name: docker-sock
hostPath:
path: /var/run/docker.sock
@@ -0,0 +1,27 @@
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}-create-bucket"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
"helm.sh/hook": post-install
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: OnFailure
containers:
- name: post-install-job
image: "viglesiasce/minio-client:v0.4.0"
command:
- sh
- -c
- "mc config host add {{.Release.Name}}-minio http://{{.Release.Name}}-minio:9000 {{ .Values.minio.AccessKey }} {{ .Values.minio.SecretKey }} S3v4 && mc mb {{.Release.Name}}-minio/spinnaker"
@@ -0,0 +1,35 @@
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}-delete-jobs"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
"helm.sh/hook": post-delete
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: OnFailure
volumes:
- name: kubectl
hostPath:
path: /usr/bin/kubectl
containers:
- name: post-install-job
image: "lachlanevenson/k8s-kubectl:v1.4.7"
volumeMounts:
- name: kubectl
mountPath: /kubectl
command:
- sh
- -c
- "kubectl delete job {{.Release.Name}}-create-bucket {{.Release.Name}}-upload-build-image {{.Release.Name}}-delete-jobs {{.Release.Name}}-upload-run-script"
@@ -0,0 +1,45 @@
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}-upload-build-image"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
"helm.sh/hook": post-install
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: OnFailure
volumes:
- name: jenkins-jobs
configMap:
name: {{ .Release.Name }}-jenkins-jobs
containers:
- name: post-install-job
image: "viglesiasce/minio-client:v0.4.0"
command:
- curl
- -X
- POST
- -H
- "Content-Type: application/xml"
- --retry
- "20"
- --retry-delay
- "10"
- --max-time
- "3"
- --data-binary
- "@/jobs/build-image.xml"
- "http://{{ template "fullname" . }}-igor:8080/createItem?name=build-image"
volumeMounts:
- name: jenkins-jobs
mountPath: /jobs
@@ -0,0 +1,45 @@
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}-upload-run-script"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
"helm.sh/hook": post-install
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: OnFailure
volumes:
- name: jenkins-jobs
configMap:
name: {{ .Release.Name }}-jenkins-jobs
containers:
- name: post-install-job
image: "viglesiasce/minio-client:v0.4.0"
command:
- curl
- -X
- POST
- -H
- "Content-Type: application/xml"
- --retry
- "20"
- --retry-delay
- "10"
- --max-time
- "3"
- --data-binary
- "@/jobs/run-script.xml"
- "http://{{ template "fullname" . }}-igor:8080/createItem?name=run-script"
volumeMounts:
- name: jenkins-jobs
mountPath: /jobs
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-clouddriver
labels:
app: {{ template "fullname" . }}
component: clouddriver
spec:
ports:
- port: 7002
selector:
app: {{ template "fullname" . }}
component: clouddriver
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-deck
labels:
app: {{ template "fullname" . }}
component: deck
spec:
ports:
- port: 9000
selector:
app: {{ template "fullname" . }}
component: deck
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-echo
labels:
app: {{ template "fullname" . }}
component: echo
spec:
ports:
- port: 8089
selector:
app: {{ template "fullname" . }}
component: echo
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-front50
labels:
app: {{ template "fullname" . }}
component: front50
spec:
ports:
- port: 8080
selector:
app: {{ template "fullname" . }}
component: front50
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-gate
labels:
app: {{ template "fullname" . }}
component: gate
spec:
ports:
- port: 8084
selector:
app: {{ template "fullname" . }}
component: gate
+18
View File
@@ -0,0 +1,18 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-igor
labels:
app: {{ template "fullname" . }}
component: igor
spec:
ports:
- port: 8088
name: igor
- port: 8080
name: jenkins-master
- port: 50000
name: jenkins-agent
selector:
app: {{ template "fullname" . }}
component: igor
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-orca
labels:
app: {{ template "fullname" . }}
component: orca
spec:
ports:
- port: 8083
selector:
app: {{ template "fullname" . }}
component: orca
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-rosco
labels:
app: {{ template "fullname" . }}
component: rosco
spec:
ports:
- port: 8087
selector:
app: {{ template "fullname" . }}
component: rosco
+82
View File
@@ -0,0 +1,82 @@
# Define which registries and repositories you want available in your
# Spinnaker pipeline definitions
# For more info visit:
# http://www.spinnaker.io/v1.0/docs/target-deployment-configuration#section-docker-registry
accounts:
- name: dockerhub
address: https://index.docker.io
repositories:
- library/alpine
- library/ubuntu
- library/centos
- library/nginx
# Settings for notifications via email
# For more info visit:
# http://www.spinnaker.io/docs/notifications-and-events-guide#section-email
mail:
enabled: false
host: smtp.example.org
username: admin
password: admin
fromAddress: spinnaker@example.org
port: 25
# Images for each component
images:
clouddriver: quay.io/spinnaker/clouddriver:v1.489.0
echo: quay.io/spinnaker/echo:v1.127.0
deck: quay.io/spinnaker/deck:v2.956.0
igor: quay.io/spinnaker/igor:v1.61.0
orca: quay.io/spinnaker/orca:v1.302.0
gate: quay.io/spinnaker/gate:v2.109.0
front50: quay.io/spinnaker/front50:v1.69.0
rosco: quay.io/spinnaker/rosco:v0.78.0
# Bucket to use when storing config data in S3 compatible storage
storageBucket: spinnaker
# Resources to provide to each of
# the Spinnaker components
resources:
limits:
cpu: 1000m
memory: 1280Mi
requests:
cpu: 1000m
memory: 1280Mi
# Redis password to use for the in-cluster redis service
# Redis is not exposed publically
redis:
redisPassword: password
# Minio access/secret keys for the in-cluster S3 usage
# Minio is not exposed publically
minio:
AccessKey: spinnakeradmin
SecretKey: spinnakeradmin
# Configuration for the Jenkins instance that is attached to the
# igor component of Spinnaker. For more info about the Jenkins integration
# with Spinnaker, visit:
# http://www.spinnaker.io/docs/jenkins-script-execution-stage
jenkins:
Master:
Name: jenkins-master
Image: "gcr.io/kubernetes-charts-ci/jenkins-master-k8s"
ImageTag: "v0.6.0"
ImagePullPolicy: "Always"
Component: "jenkins-master"
Cpu: "500m"
Memory: "512Mi"
ServicePort: 8080
ServiceType: ClusterIP
ContainerPort: 8080
SlaveListenerPort: 50000
Agent:
Image: viglesiasce/spinnaker-jenkins-agent
ImageTag: v0.2.0
Cpu: "500m"
Memory: "512Mi"