{"id":15650736,"url":"https://github.com/jgramoll/terraform-provider-spinnaker","last_synced_at":"2025-04-30T18:10:25.603Z","repository":{"id":36296783,"uuid":"161234739","full_name":"jgramoll/terraform-provider-spinnaker","owner":"jgramoll","description":"Terraform Provider to manage spinnaker pipelines","archived":false,"fork":false,"pushed_at":"2022-10-28T03:16:21.000Z","size":651,"stargazers_count":34,"open_issues_count":3,"forks_count":10,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-30T18:43:47.175Z","etag":null,"topics":["cd","cicd","cicd-pipeline","continous-deployment","continuous-delivery","manage-spinnaker-pipelines","spinnaker","terraform","terraform-provider"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jgramoll.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-10T20:50:07.000Z","updated_at":"2023-11-12T17:22:40.000Z","dependencies_parsed_at":"2022-08-30T04:20:53.063Z","dependency_job_id":null,"html_url":"https://github.com/jgramoll/terraform-provider-spinnaker","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgramoll%2Fterraform-provider-spinnaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgramoll%2Fterraform-provider-spinnaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgramoll%2Fterraform-provider-spinnaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgramoll%2Fterraform-provider-spinnaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jgramoll","download_url":"https://codeload.github.com/jgramoll/terraform-provider-spinnaker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251758170,"owners_count":21638989,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cd","cicd","cicd-pipeline","continous-deployment","continuous-delivery","manage-spinnaker-pipelines","spinnaker","terraform","terraform-provider"],"created_at":"2024-10-03T12:35:40.401Z","updated_at":"2025-04-30T18:10:25.584Z","avatar_url":"https://github.com/jgramoll.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# terraform-provider-spinnaker\nTerraform Provider to manage spinnaker pipelines\n\n## Install ##\n\nYou will need to install the binary as a [terraform third party plugin](https://www.terraform.io/docs/configuration/providers.html#third-party-plugins).  Terraform will then pick up the binary from the local filesystem when you run `terraform init`.\n\n```sh\ncurl -s https://raw.githubusercontent.com/jgramoll/terraform-provider-spinnaker/master/install.sh | bash\n```\n\n## Usage ##\n\n### Credentials ###\n\n```sh\nexport SPINNAKER_ADDRESS=https://your.spinnaker.server\nexport SPINNAKER_CERT=/path/to/spinnaker/cert\nexport SPINNAKER_KEY=/path/to/spinnaker/key\nexport SPINNAKER_EMAIL=your@email.org\n```\n\n```terraform\nprovider \"spinnaker\" {\n  address = \"${var.spinnaker_address}\"\n\n  cert_path  = \"${var.cert_path}\"\n  key_path   = \"${var.key_path}\"\n  user_email = \"${var.user_email}\"\n}\n\nresource \"spinnaker_application\" \"application\" {\n  name             = \"myApplication\"\n  email            = \"testo@test.com\"\n  repo_type        = \"github\"\n  repo_project_key = \"http://github.com/user/my-project\"\n  repo_slug        = \"my-project\"\n\n  cloud_providers = [\n    \"aws\",\n  ]\n\n  provider_settings = {\n    aws = {\n      use_ami_block_device_mappings = true\n    }\n  }\n\n  instance_port = 8080\n}\n\nresource \"spinnaker_pipeline\" \"edge\" {\n  application = \"career\"\n  name        = \"My New Pipeline\"\n  index       = 4\n}\n\nresource \"spinnaker_pipeline_docker_trigger\" \"docker\" {\n  pipeline = \"${spinnaker_pipeline.edge.id}\"\n\n  account = \"my-docker-hub\"\n  organization = \"my-org\"\n  repository = \"test\"\n}\n\nresource \"spinnaker_pipeline_jenkins_trigger\" \"jenkins\" {\n  pipeline = \"${spinnaker_pipeline.edge.id}\"\n  job = \"Bridge Career/job/Bridge_nav/job/Bridge_nav_postmerge\"\n  master = \"inst-ci\"\n  property_file = \"build.properties.test\"\n}\n\nresource \"spinnaker_pipeline_pipeline_trigger\" \"pipeline\" {\n  pipeline = spinnaker_pipeline.edge.id\n\n  triggering_application = \"app\"\n  triggering_pipeline = \"my-other-pipeline\"\n  status = [\"successful\"]\n}\n\nresource \"spinnaker_pipeline_webhook_trigger\" \"trigger\" {\n  pipeline = spinnaker_pipeline.edge.id\n\n  source = \"my-app\"\n\n  payload_constraints = {\n    \"foo\" = \"bar\"\n    \"baz\" = \"qux\"\n  }\n}\n\nresource \"spinnaker_pipeline_notification\" \"edge\" {\n  pipeline = \"${spinnaker_pipeline.edge.id}\"\n  address = \"bridge-career-deploys\"\n  message {\n    complete = \"edge is done\"\n    failed = \"edge is failed\"\n    starting = \"edge is starting\"\n  }\n  type = \"slack\"\n  when {\n    complete = true\n    starting = false\n    failed = true\n  }\n}\n\nresource \"spinnaker_pipeline_bake_stage\" \"bake\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Stage Bake\"\n}\n\nresource \"spinnaker_pipeline_jenkins_stage\" \"bake\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Stage Jenkins\"\n\n  requisite_stage_ref_ids = [\"${spinnaker_pipeline_bake_stage.bake.id}\"]\n\n  notification {\n    address = \"#my-slack-channel\"\n    message {\n      failed = \"Jenkins Stage failed\"\n    }\n    type = \"slack\"\n    when {\n      failed = true\n    }\n  }\n}\n\nresource \"spinnaker_pipeline_manual_judgment_stage\" \"main\" {\n  pipeline     = spinnaker_pipeline.test.id\n  name         = \"Judgment\"\n  instructions = \"Manual Judgment Instructions\"\n\n  judgment_inputs = [\n    \"commit\",\n    \"rollback\",\n  ]\n\n  notification {\n    address = \"#my-slack-channel\"\n    message {\n      manual_judgment_continue = \"Manual judgement continue\"\n      manual_judgment_stop = \"Manual judgement stop\"\n    }\n    type = \"slack\"\n    when {\n      manual_judgment = true\n      manual_judgment_continue = true\n      manual_judgment_stop = true\n    }\n  }\n}\n\nresource \"spinnaker_pipeline_deploy_stage\" \"deploy\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Stage Deploy\"\n  restricted_execution_window {\n    days = [1,3]\n    jitter {\n      enabled = true\n      max_delay = 5\n    }\n    whitelist {\n      end_hour = 1\n      end_min = 2\n    }\n    whitelist {\n      end_hour = 3\n      end_min = 4\n    }\n  }\n  cluster {\n    account = \"my-account\"\n    application = \"app\"\n    availability_zones {\n      us_east_1 = [\n        \"us-east-1a\",\n        \"us-east-1b\",\n        \"us-east-1c\"\n      ]\n    }\n    capacity {\n      desired = 2\n    }\n    cloud_provider = \"aws\"\n    health_check_type = \"ELB\"\n    instance_type = \"t2.micro\"\n    key_pair = \"my_key_pair\"\n    provider = \"aws\"\n    strategy = \"redblack\"\n    subnet_type = \"my_subnet\"\n  }\n  cluster {\n    account = \"my-account\"\n    application = \"app\"\n    availability_zones {\n      us_east_2 = [\n        \"us-east-2a\",\n        \"us-east-2b\",\n        \"us-east-2c\"\n      ]\n    }\n    cloud_provider = \"aws\"\n    health_check_type = \"ELB\"\n    instance_type = \"t2.micro\"\n    key_pair = \"my_key_pair\"\n    provider = \"aws\"\n    strategy = \"redblack\"\n    subnet_type = \"my_subnet\"\n  }\n}\n\nresource \"spinnaker_pipeline_rollback_cluster_stage\" \"deploy\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Rollback Cluster\"\n\n  cloud_provider      = \"aws\"\n  cloud_provider_type = \"aws\"\n  cluster             = \"my-cluster\"\n  credentials         = \"my-creds\"\n  moniker {\n    app     = \"my-app\"\n    cluster = \"my-cluster\"\n    detail  = \"api\"\n    stack   = \"edge\"\n  }\n  regions = [\n    \"us-east-2\"\n  ]\n}\n\nresource \"spinnaker_pipeline_destroy_server_group_stage\" \"deploy\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Destroy Server Group\"\n\n  cloud_provider      = \"aws\"\n  cloud_provider_type = \"aws\"\n  cluster             = \"my-cluster\"\n  credentials         = \"my-creds\"\n  moniker {\n    app     = \"my-app\"\n    cluster = \"my-cluster\"\n    detail  = \"api\"\n    stack   = \"edge\"\n  }\n  regions = [\n    \"us-east-2\"\n  ]\n  target = \"oldest_asg_dynamic\"\n}\n\nresource \"spinnaker_pipeline_evaluate_variables_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Evaluate Variables\"\n\n  variables {\n    foo = \"bar\"\n    baz = \"qux\"\n  }\n}\n\nresource \"spinnaker_pipeline_find_artifacts_from_resource_stage\" \"main\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Find Artifacts\"\n\n  account        = \"my-account\"\n  cloud_provider = \"kubernetes\"\n  location       = \"my-ns\"\n  mode           = \"static\"\n  manifest_name  = \"my-manifest\"\n}\n\nresource \"spinnaker_pipeline_find_image_from_tags_stage\" \"main\" {\n  pipeline     = spinnaker_pipeline.test.id\n  name         = \"Find image\"\n\n  package_name        = \"my-package\"\n  cloud_provider      = \"aws\"\n  cloud_provider_type = \"aws\"\n}\n\nresource \"spinnaker_pipeline_resize_server_group_stage\" \"deploy\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Resize Server Group\"\n\n  action              = \"scale_exact\"\n  cloud_provider      = \"aws\"\n  cloud_provider_type = \"aws\"\n  cluster             = \"my-cluster\"\n  credentials         = \"my-creds\"\n  moniker {\n    app     = \"my-app\"\n    cluster = \"my-cluster\"\n    detail  = \"api\"\n    stack   = \"edge\"\n  }\n  regions = [\n    \"us-east-2\"\n  ]\n  resize_type = \"exact\"\n  target = \"oldest_asg_dynamic\"\n}\n\nresource \"spinnaker_pipeline_pipeline_stage\" \"main\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Start prod deploy\"\n\n  application      = \"my-other-app\"\n  target_pipeline  = \"${spinnaker_pipeline.prod.id}\"\n  pipeline_parameters {\n    version = \"my-message\"\n  }\n}\n\nresource \"spinnaker_pipeline_parameter\" \"version\" {\n  pipeline = spinnaker_pipeline.test.id\n  name = \"version\"\n  description = \"deploy version\"\n  default = \"1\"\n  label   = \"numbers\"\n\n  option {\n    value = 1\n  }\n  option {\n    value = \"two\"\n  }\n}\n\nresource \"spinnaker_pipeline_delete_manifest_stage\" \"main\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Delete manifest\"\n  account  = \"account\"\n  app      = \"app\"\n\n  cloud_provider = \"kubernetes\"\n  location       = \"location\"\n  manifest_name  = \"manifest name\"\n  mode           = \"static\"\n}\n\nresource \"spinnaker_pipeline_deploy_manifest_stage\" \"main\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Deploy Manifest\"\n  account  = \"account\"\n\n  cloud_provider            = \"kubernetes\"\n  source                    = \"text\"\n  manifest_artifact_account = \"docker-registry\"\n\n  relationships {}\n  traffic_management {\n    options {}\n  }\n\n  manifests = [\n    \u003c\u003cEOT\nfirst: 1\nEOT\n,\n\u003c\u003cEOT\nsecond: 2\nEOT\n  ]\n}\n\nresource \"spinnaker_pipeline_webhook_stage\" \"main\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Webhook\"\n  url      = \"http://my-webhook.io/\"\n}\n\nresource \"spinnaker_canary_config\" \"test\" {\n  name         = \"%s\"\n  applications = [\"app\"]\n  metric {\n    groups = [\"Group 1\"]\n    name = \"my metric\"\n    query {\n      metric_name = \"avg:aws.ec2.cpucredit_balance\"\n      service_type = \"datadog\"\n      type = \"datadog\"\n    }\n  }\n  classifier {\n    group_weights = {\n      \"Group 1\" = 100\n    }\n  }\n  judge {\n    name = \"NetflixACAJudge-v1.0\"\n  }\n}\n\nresource \"spinnaker_pipeline_canary_analysis_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Canary Analysis\"\n\n  analysis_type  = \"realTimeAutomatic\"\n\n  canary_config {\n    canary_config_id  = \"${spinnaker_canary_config.test.id}\"\n    lifetime_duration = \"PT0H5M\"\n\n    metrics_account_name = \"metrics-account\"\n    storage_account_name = \"storage-account\"\n\n    score_thresholds {\n      marginal = \"1\"\n      pass     = \"2\"\n    }\n  }\n}\n\nresource \"spinnaker_pipeline_scale_manifest_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Stage Scale (Manifest)\"\n\n  account        = \"my-k8s-account\"\n  cloud_provider = \"kubernetes\"\n  mode           = \"static\"\n}\n\nresource \"spinnaker_pipeline_check_preconditions_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Stage Check Preconditions\"\n\n  precondition {\n    type = \"stageStatus\"\n\n    context = {\n      stage_name   = \"my-stage\"\n      stage_status = \"FAILED_CONTINUE\"\n    }\n  }\n  precondition {\n    type = \"expression\"\n\n    context = {\n      expression = \"this is myexp\"\n    }\n  }\n  precondition {\n    type = \"clusterSize\"\n\n    context = {\n      credentials = \"my-cred\"\n      expected = 1\n      regions = \"us-east-1,us-east-2\"\n    }\n  }\n}\n\nresource \"spinnaker_pipeline_run_job_manifest_stage\" \"test\" {\n  pipeline    = spinnaker_pipeline.test.id\n  name        = \"Stage Run Job (Manifest)\"\n  account     = \"my-account\"\n  application = \"my-app\"\n\n  cloud_provider = \"kubernetes\"\n  source         = \"text\"\n\n  manifest = \u003c\u003cEOT\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: mypi\n  namespace: my-namespace\nspec:\n  backoffLimit: 4\n  template:\n    spec:\n      containers:\n        - command:\n            - perl\n            - '-Mbignum=bpi'\n            - '-wle'\n            - print bpi(2000)\n          image: perl\n          name: mypi\n      restartPolicy: Never\nEOT\n}\n\nresource \"spinnaker_pipeline_enable_server_group_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Enable Server Group\"\n\n  cloud_provider      = \"kubernetes\"\n  cloud_provider_type = \"kubernetes\"\n  cluster             = \"my-k8s-account\"\n  credentials         = \"my-k8s-creds\"\n  interesting_health_provider_names = [\n    \"KubernetesService\"\n  ]\n  namespaces = [\n    \"my-k8s-ns\"\n  ]\n  target = \"ancestor_asg_dynamic\"\n}\n\nresource \"spinnaker_pipeline_undo_rollout_manifest_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Undo Rollout (Manifest)\"\n\n  account        = \"my-k8s-account\"\n  cloud_provider = \"kubernetes\"\n  location       = \"my-k8s-ns\"\n  manifest_name  = \"replicatSet my-service\"\n\n  num_revisions_back = 1\n}\n\nresource \"spinnaker_pipeline_disable_manifest_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Disable Manifest\"\n\n  account        = \"my-account\"\n  app            = \"my-app\"\n  cloud_provider = \"kubernetes\"\n  cluster        = \"replicaSet my-service\"\n  criteria       = \"newest\"\n  kind           = \"replicaSet\"\n  location       = \"my-k8s-ns\"\n  mode           = \"dynamic\"\n}\n\nresource \"spinnaker_pipeline_enable_manifest_stage\" \"test\" {\n  pipeline = spinnaker_pipeline.test.id\n  name     = \"Enable Manifest\"\n\n  account        = \"my-account\"\n  app            = \"app\"\n  cloud_provider = \"provider\"\n  cluster        = \"replicaSet my-service\"\n  criteria       = \"oldest\"\n  kind           = \"replicaSet\"\n  location       = \"my-k8s-ns\"\n  mode           = \"dynamic\"\n}\n\nresource \"spinnaker_pipeline_bake_manifest_stage\" \"test\" {\n  pipeline  = spinnaker_pipeline.test.id\n  name      = \"Bake Manifest\"\n\n  template_renderer = \"HELM2\"\n}\n\nresource \"spinnaker_pipeline_patch_manifest_stage\" \"test\" {\n  pipeline  = spinnaker_pipeline.test.id\n  name      = \"Patch Manifest\"\n  account    = \"my-account\"\n\n  options {\n    merge_strategy = \"strategic\"\n  }\n}\n\nresource \"spinnaker_pipeline_deploy_cloudformation_stage\" \"test\" {\n  pipeline  = spinnaker_pipeline.test.id\n  name      = \"Deploy Cloudformation\"\n\n  credentials = \"my-aws-account\"\n  stack_name  = \"my cf stack\"\n  regions = [\n    \"us-east-1\"\n  ]\n  templateBody = \u003c\u003cEOT\nAWSTemplateFormatVersion: 2010-09-09\nDescription: \"Sample\"\nResources:\n  S3Bucket:\n    Type: 'AWS::S3::Bucket'\n    Properties:\n      AccessControl: PublicRead\n      WebsiteConfiguration:\n        IndexDocument: index.html\n        ErrorDocument: error.html\n    DeletionPolicy: Retain\nOutputs:\n  WebsiteURL:\n    Value:\n      GetAtt:\n      - S3Bucket\n      - WebsiteURL\n    Description: URL for website hosted on S3\n  S3BucketSecureURL:\n    Value:\n      Join:\n      - ''\n      - - 'https://'\n        -\n          GetAtt:\n          - S3Bucket\n          - DomainName\n    Description: Name of S3 bucket to hold website content\nEOT\n}\n```\n\n## Local Dev ##\n\n### Depenedencies ###\n\nYou should have a working Go environment setup.  If not check out the Go [getting started](http://golang.org/doc/install) guide.\n\n[Go modules](https://github.com/golang/go/wiki/Modules) are used for dependency management.  To install all dependencies run the following:\n\n```sh\nexport GO111MODULE=on\ngo mod vendor\n```\n\n### Link ###\n\n```sh\nversion=v4.0.0\ngo clean\ngo build\nrm ~/.terraform.d/plugins/$(uname | tr '[:upper:]' '[:lower:]')_amd64/terraform-provider-spinnaker_$version\nln  ./terraform-provider-spinnaker ~/.terraform.d/plugins/$(uname | tr '[:upper:]' '[:lower:]')_amd64/terraform-provider-spinnaker_$version\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgramoll%2Fterraform-provider-spinnaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjgramoll%2Fterraform-provider-spinnaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgramoll%2Fterraform-provider-spinnaker/lists"}