Cloud Native 7 min read

Spinnaker Architecture, CI/CD Practices, and Deployment Guide

This article examines Netflix’s open‑source Spinnaker platform, detailing its microservice architecture, GitHub‑based code management, GitHub Actions continuous‑integration workflow, and Halyard‑driven deployment process, including sample build.yml and version.yaml configurations, offering practical insights for cloud‑native DevOps implementations.

DevOps Cloud Academy
DevOps Cloud Academy
DevOps Cloud Academy
Spinnaker Architecture, CI/CD Practices, and Deployment Guide

Netflix is widely regarded as a benchmark for micro‑service and DevOps organization, contributing many open‑source tools such as Spinnaker for hybrid‑cloud deployment.

The article analyses Spinnaker’s development model, continuous integration, and deployment practices.

Spinnaker consists of multiple micro‑services. Deck provides the UI, Gate is the API gateway, Orca handles orchestration, CloudDriver interacts with cloud providers, Front50 stores metadata, Rosco builds immutable VM images, Igor integrates CI systems, Echo sends notifications, Fiat manages permissions, Kayenta performs canary analysis, and Halyard manages the Spinnaker lifecycle.

Each micro‑service lives in its own GitHub repository with a trunk‑based development model and version branches for releases.

Continuous integration is implemented with GitHub Actions. The workflow .github/workflows/build.yml defines a single job branch‑build that triggers on pushes to master or version‑* tags, sets Gradle options, checks out the code, installs Java 8 and 11, caches Gradle, and runs ./gradlew build :

name: Branch Build

on:
  push:
    branches:
    - master
    - version-*

env:
  GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g

jobs:
  branch-build:
    if: startsWith(github.repository, 'spinnaker/')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: 8
      - uses: actions/setup-java@v1
        with:
          java-version: 11
      - uses: actions/cache@v1
        with:
          path: ~/.gradle
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
      - name: Build
        run: ./gradlew -PenableCrossCompilerPlugin=true build --stacktrace

Spinnaker deployment is performed with Halyard. The version file (YAML) lists the overall Spinnaker version and, for each service, its version and commit hash, as well as required dependencies:

version: 1.19.4
timestamp: '2020-04-03 08:01:05'
services:
  echo:
    version: 2.11.2-20200401121252
    commit: 5e2b673d1d658f88a3ae7741ab99cc0fd4a9df48
  clouddriver:
    version: 6.7.3-20200401190525
    commit: 77c774d185de42bb83dffde1f813f719f712994b
  ...
dependencies:
  redis:
    version: 2:2.8.4-2
  consul:
    version: 0.7.5
  vault:
    version: 0.7.0

The version field determines the Docker image tag that Halyard pulls, e.g., gcr.io/spinnaker-marketplace/echo:2.11.2-20200401121252 . Similar logic applies to other services.

By adopting a similar YAML‑driven versioning approach, other micro‑service projects can achieve one‑click deployment and straightforward rollback using CI pipelines.

The author, a DevOps practitioner, also includes promotional material for training courses.

Cloud NativeCI/CDMicroservicesDeploymentDevOpsSpinnaker
DevOps Cloud Academy
Written by

DevOps Cloud Academy

Exploring industry DevOps practices and technical expertise.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.