<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spinnaker – Code</title>
    <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/</link>
    <description>Recent content in Code on Spinnaker</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Releasing A Patch</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/releasing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/releasing/</guid>
      <description>
        
        
        &lt;p&gt;Say you&amp;rsquo;ve written a patch, and it&amp;rsquo;s been merged into Spinnaker. First off,
thanks for helping the project! Odds are, you want to deploy this patch to the
Spinnaker you manage. You have a few options available:&lt;/p&gt;
&lt;h1 id=&#34;wait-for-the-non-patch-release&#34;&gt;Wait for the non-patch release&lt;/h1&gt;
&lt;p&gt;Any time we release a new minor version of Spinnaker (e.g. 1.16.0 or 1.17.0), we
include all commits merged into &lt;code&gt;main&lt;/code&gt; for each service. We do this on a quarterly
basis by default.&lt;/p&gt;
&lt;h1 id=&#34;release-branch-patch-criteria&#34;&gt;Release branch patch criteria&lt;/h1&gt;
&lt;p&gt;In order to be considered safe to merge into a release branch, your patch must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix a documented regression in a

&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/releases/versions/#latest-stable&#34;&gt;supported version of Spinnaker&lt;/a&gt;
.
This means that the currently broken functionality must have worked as
expected in a previous version of Spinnaker. If the regression is not already
documented in a GitHub issue, please create one. Describe the difference
between the expected and observed behavior, and include links to the commit
that introduced the regression. Indicate to which releases you would like
your fix to be backported.&lt;/li&gt;
&lt;li&gt;Include tests validating the regression and the fix. The first commit of your
patch pull request should add test coverage that demonstrates the existence
of the bug and exercises all code paths potentially impacted by your fix.
Subsequent commits should fix the bug and update the tests you just added. If
your fix is so complex as to make complete tests coverage impossible, it is
not a good candidate for merging into a release branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These criteria do not apply to security vulnerability patches, which may be
merged into release branches at the discretion of the Security SIG and release
manager.&lt;/p&gt;
&lt;h1 id=&#34;merge-into-the-release-branch&#34;&gt;Merge into the release branch&lt;/h1&gt;
&lt;p&gt;If your patch meets the 
&lt;a href=&#34;#release-branch-patch-criteria&#34;&gt;cherry-pick criteria&lt;/a&gt;
, you can request that your patch
be merged into a release branch. Every minor release of Spinnaker has its own
release branch. For example, all Spinnaker 2026.0.x releases (2026.0.1, 2026.0.2, etc.)
are built from the &lt;code&gt;release-2026.0.x&lt;/code&gt; release branch. To get your patch into 2026.0.x,
it must be cherry-picked onto that release branch.&lt;/p&gt;
&lt;p&gt;After you&amp;rsquo;ve created a pull request for a fix that you want backported to a release
branch, add a comment that includes the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@spinnakerbot add-label backport-candidate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Release managers will audit all PRs with the &lt;code&gt;backport-candidate&lt;/code&gt; label weekly.
Please make sure your pull request description makes it easy for the release
manager to evaluate whether your patch meets the release branch patch criteria.&lt;/p&gt;
&lt;p&gt;Navigate to GitHub, and create a PR as you would normally, but make sure that
your &amp;ldquo;base&amp;rdquo; is set to the release branch in the upstream repository as shown
below:&lt;/p&gt;
&lt;p&gt;{% include figure image_path=&amp;quot;./patch.png&amp;quot; %}&lt;/p&gt;
&lt;p&gt;Once this PR is merged, your patch should be released in the next few days.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Code Languages, Libraries, and Conventions </title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/back-end-code/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/back-end-code/</guid>
      <description>
        
        
        &lt;p&gt;Spinnaker is a collection of microservices built from a common foundation which has evolved over time. You do not need
to know all of the technologies listed to contribute. Please consider these standards and conventions when submitting
pull requests to Spinnaker.&lt;/p&gt;
&lt;h2 id=&#34;languages&#34;&gt;Languages&lt;/h2&gt;
&lt;p&gt;Spinnaker is comprised of JVM backend-services and a frontend application (Deck). See
an 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/architecture/microservices-overview&#34;&gt;overview of the architecture&lt;/a&gt;
 in our reference documentation.&lt;/p&gt;
&lt;p&gt;Use the following languages to fix and extend Spinnaker services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deck
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://www.typescriptlang.org/&#34; target=&#34;_blank&#34;&gt;TypeScript&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Backend Services
&lt;ul&gt;
&lt;li&gt;Java + 
&lt;a href=&#34;https://projectlombok.org/&#34; target=&#34;_blank&#34;&gt;Lombok&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://kotlinlang.org/&#34; target=&#34;_blank&#34;&gt;Kotlin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sub-projects of Spinnaker microservices are called &lt;strong&gt;modules&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Our language of choice is plain java. Groovy in the project is deprecated and no new
groovy code will be accepted. Kotlin is acceptable in most areas of the project.&lt;/p&gt;
&lt;p&gt;NOTE:  There are cross-compilation issues with mixing Groovy and Kotlin in the same
source tree. Adding kotlin to a module without removing all groovy references first
will not be accepted.&lt;/p&gt;
&lt;h3 id=&#34;java&#34;&gt;Java&lt;/h3&gt;
&lt;p&gt;If you are writing new code for an existing module that uses Groovy, please write in Java.&lt;/p&gt;
&lt;p&gt;Spinnaker uses Java 17, and where appropriate, we encourage use of newer features such as
lambdas, the streams API, the &lt;code&gt;java.time&lt;/code&gt; package, and default interface methods.&lt;/p&gt;
&lt;h3 id=&#34;groovy&#34;&gt;Groovy&lt;/h3&gt;
&lt;p&gt;Although much of Spinnaker still has groovy code, we have deprecated 
&lt;a href=&#34;https://groovy-lang.org/&#34; target=&#34;_blank&#34;&gt;Groovy&lt;/a&gt;
. Please avoid
contributing new production code that uses Groovy. Changes to existing Groovy code are acceptable, but new classes
should not be written in Groovy.&lt;/p&gt;
&lt;p&gt;You are welcome to use Groovy with 
&lt;a href=&#34;http://spockframework.org/&#34; target=&#34;_blank&#34;&gt;Spock&lt;/a&gt;
 for writing tests.&lt;/p&gt;
&lt;p&gt;Refactoring is also welcome. If your changes touch Groovy code that you can transform into Java, please feel free to do
so. Interfaces, for example require almost no changes.&lt;/p&gt;
&lt;p&gt;Types from the Groovy runtime libraries should not be exposed in the API of any class.
Since Groovy closures can be automatically type-coerced to
Java 
&lt;a href=&#34;https://dzone.com/articles/java-8-functional-interfaces-sam&#34; target=&#34;_blank&#34;&gt;SAM types&lt;/a&gt;
, please use an appropriate SAM type for
parameters or return types that may be implemented with Groovy closures.&lt;/p&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries&lt;/h2&gt;
&lt;h3 id=&#34;current-third-party-libraries&#34;&gt;Current Third-party Libraries&lt;/h3&gt;
&lt;p&gt;Spinnaker is built on the shoulders of giants.
This is not an exhaustive list of libraries that we use, but the ones we&amp;rsquo;ve identified as having a large presence across
the product.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deck
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://reactjs.org/&#34; target=&#34;_blank&#34;&gt;React&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Backend Services
&lt;ul&gt;
&lt;li&gt;Runtime
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://grpc.io/&#34; target=&#34;_blank&#34;&gt;gRPC&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/FasterXML/jackson&#34; target=&#34;_blank&#34;&gt;Jackson&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/xetorthio/jedis&#34; target=&#34;_blank&#34;&gt;Jedis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://www.jooq.org/&#34; target=&#34;_blank&#34;&gt;jOOQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/spinnaker/keiko&#34; target=&#34;_blank&#34;&gt;Keiko&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;http://micrometer.io/&#34; target=&#34;_blank&#34;&gt;Micrometer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://square.github.io/okhttp/&#34; target=&#34;_blank&#34;&gt;OkHttp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://spring.io/projects/spring-boot&#34; target=&#34;_blank&#34;&gt;Spring Boot 3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://resilience4j.readme.io/&#34; target=&#34;_blank&#34;&gt;Resilience4j&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://square.github.io/retrofit/&#34; target=&#34;_blank&#34;&gt;Retrofit2&lt;/a&gt;
: Where HTTP is required, converging
on 
&lt;a href=&#34;https://spring.io/guides/gs/consuming-rest/&#34; target=&#34;_blank&#34;&gt;Spring RestTemplate&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Testing
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://mockk.io/&#34; target=&#34;_blank&#34;&gt;Mockk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;http://spockframework.org/&#34; target=&#34;_blank&#34;&gt;Spock&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://strikt.io/&#34; target=&#34;_blank&#34;&gt;Strikt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://www.testcontainers.org/&#34; target=&#34;_blank&#34;&gt;Testcontainers&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecated-third-party-libraries&#34;&gt;Deprecated Third-party Libraries&lt;/h3&gt;
&lt;p&gt;Spinnaker is an ever-evolving system, and as such, so are the foundations we&amp;rsquo;ve chosen to build on top of.
These libraries still see extensive use within Spinnaker, however they have been deprecated in favor of another solution
and the spread of their use is discouraged.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deck
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://angularjs.org/&#34; target=&#34;_blank&#34;&gt;Angular&lt;/a&gt;
: Actively migrating to React.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Backend Services
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/Netflix/Hystrix&#34; target=&#34;_blank&#34;&gt;Hystrix&lt;/a&gt;
: Replaced by Resilience4j.&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/Netflix/spectator&#34; target=&#34;_blank&#34;&gt;Spectator&lt;/a&gt;
: Replaced by Micrometer.&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://spekframework.org/&#34; target=&#34;_blank&#34;&gt;Spek&lt;/a&gt;
: Converging on Strikt + Mockk.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conventions&#34;&gt;Conventions&lt;/h2&gt;
&lt;h3 id=&#34;code-formatting&#34;&gt;Code formatting&lt;/h3&gt;
&lt;p&gt;We follow 
&lt;a href=&#34;https://google.github.io/styleguide/javaguide.html&#34; target=&#34;_blank&#34;&gt;Google&amp;amp;rsquo;s Java Style Guide&lt;/a&gt;
 for Java.
We follow 
&lt;a href=&#34;https://ktlint.github.io/&#34; target=&#34;_blank&#34;&gt;ktlint&lt;/a&gt;
 for Kotlin.&lt;/p&gt;
&lt;p&gt;For Groovy and miscellaneous files, please use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 space indents.&lt;/li&gt;
&lt;li&gt;No more than 1 consecutive line of whitespace.&lt;/li&gt;
&lt;li&gt;Line breaks rather than overly long lines (limit to 120 column width if possible).&lt;/li&gt;
&lt;li&gt;Camel case conventions as per Java.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Code formatting is applied automatically with a git pre-commit hook, but if you need to check or apply code formatting
outside of this process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Format code: &lt;code&gt;./gradlew spotlessApply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check code: &lt;code&gt;./gradlew spotlessCheck&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;package-structure&#34;&gt;Package structure&lt;/h3&gt;
&lt;p&gt;Spinnaker microservices automatically component-scan for &lt;code&gt;@Configuration&lt;/code&gt; classes in the &lt;code&gt;com.netflix.spinnaker.config&lt;/code&gt;
package. Other classes should be placed in &lt;code&gt;com.netflix.spinnaker.&amp;lt;service&amp;gt;.&amp;lt;feature&amp;gt;&lt;/code&gt; where &lt;code&gt;&amp;lt;service&amp;gt;&lt;/code&gt; is the
microservice name, for example &lt;code&gt;orca&lt;/code&gt; or &lt;code&gt;clouddriver&lt;/code&gt; and &lt;code&gt;&amp;lt;feature&amp;gt;&lt;/code&gt; is something descriptive of the feature being
implemented.&lt;/p&gt;
&lt;p&gt;Please do not separate classes into different packages according to &lt;em&gt;what&lt;/em&gt; they are.
Packages should represent the group of classes that implement a particular piece of functionality not all components of
a particular type.&lt;/p&gt;
&lt;h3 id=&#34;naming-things&#34;&gt;Naming things&lt;/h3&gt;
&lt;p&gt;Please use descriptive but concise names for variables, classes, properties, methods, and so on.
Longer names are good when they add clarity.
Shorter names are good when they reduce redundancy.&lt;/p&gt;
&lt;h4 id=&#34;representing-units&#34;&gt;Representing units&lt;/h4&gt;
&lt;p&gt;It&amp;rsquo;s preferable to use types that properly represent things like durations, or timestamps (&lt;code&gt;java.time.Duration&lt;/code&gt; and
&lt;code&gt;java.time.Instant&lt;/code&gt; would be ideal in those specific cases).
If that&amp;rsquo;s not practical please include a suffix on the property / variable name that describes the unit.
A property declared as &lt;code&gt;public long getTimeout()&lt;/code&gt; is ambiguous and can easily lead to errors when developers using your
code assume what the units are.&lt;/p&gt;
&lt;p&gt;For example, these names are much less likely to result in errors:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;getTimeoutMillis&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;getTimeoutSeconds&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;nullability&#34;&gt;Nullability&lt;/h3&gt;
&lt;p&gt;When writing Java code, please use &lt;code&gt;@jakarta.annotation.Nullable&lt;/code&gt; and &lt;code&gt;@jakarta.annotation.Nonnull&lt;/code&gt; annotations on
return types and parameters of public methods. This lets the Kotlin compiler make better decisions about the
interactions between Kotlin and Java code.&lt;/p&gt;
&lt;h3 id=&#34;date-and-time-values&#34;&gt;Date and time values&lt;/h3&gt;
&lt;p&gt;Please use classes from &lt;code&gt;java.time&lt;/code&gt; and not &lt;code&gt;java.util.Date&lt;/code&gt; or &lt;code&gt;java.util.Calendar&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;exceptions&#34;&gt;Exceptions&lt;/h3&gt;
&lt;p&gt;Please select, or create, appropriate exception types rather than throwing overly general things such as
&lt;code&gt;RuntimeException&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Exception types you create should extend &lt;code&gt;RuntimeException&lt;/code&gt; (directly or indirectly).
Please try to include descriptive information in exception messages, especially for errors that will be surfaced to the
user.&lt;/p&gt;
&lt;p&gt;The package &lt;code&gt;kork-exceptions&lt;/code&gt; includes some standard base exception types that you are encouraged to use directly or
extend as needed.&lt;/p&gt;
&lt;h3 id=&#34;deprecations&#34;&gt;Deprecations&lt;/h3&gt;
&lt;p&gt;Deprecating old, unused or high-debt code is highly encouraged!
When deprecating code, you MUST include the &lt;code&gt;@Deprecation&lt;/code&gt; annotation, &lt;em&gt;along with supporting documentation&lt;/em&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why is this code deprecated? This should be a link to a Github Issue with the &lt;code&gt;no-lifecycle&lt;/code&gt; label.&lt;/li&gt;
&lt;li&gt;What is this code being replaced by?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not annotate code as deprecated without additional context. Deprecations without sufficient context will be rejected.&lt;/p&gt;
&lt;h3 id=&#34;ambiguous-types&#34;&gt;Ambiguous Types&lt;/h3&gt;
&lt;p&gt;Refrain from using open-ended, ambiguous types, such as &lt;code&gt;Map&amp;lt;String, Object&amp;gt;&lt;/code&gt;.
These types, while flexible, make APIs unobvious, difficult to integrate with and test.
Instead, use well-defined types, or if a &lt;code&gt;Map&lt;/code&gt; type is truly needed, use the most constrictive contract as possible,
such as &lt;code&gt;Map&amp;lt;String, String&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;testing&#34;&gt;Testing&lt;/h3&gt;
&lt;p&gt;We really appreciate contributions that include tests.
Thorough testing at the unit level with maybe an integration test to validate how components tie together is ideal.&lt;/p&gt;
&lt;h4 id=&#34;testing-tools&#34;&gt;Testing tools&lt;/h4&gt;
&lt;p&gt;Spinnaker uses 
&lt;a href=&#34;http://spockframework.org/&#34; target=&#34;_blank&#34;&gt;Spock&lt;/a&gt;
 for testing Java and Groovy code.&lt;/p&gt;
&lt;p&gt;For Kotlin we are still pinning down specific best practices but currently recommend JUnit tests (written in Kotlin)
using 
&lt;a href=&#34;https://joel-costigliola.github.io/assertj/&#34; target=&#34;_blank&#34;&gt;AssertJ&lt;/a&gt;
 and 
&lt;a href=&#34;http://site.mockito.org/&#34; target=&#34;_blank&#34;&gt;Mockito&lt;/a&gt;

via 
&lt;a href=&#34;https://github.com/nhaarman/mockito-kotlin&#34; target=&#34;_blank&#34;&gt;mockito-kotlin&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Developer How Tos</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/developer-guides/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/developer-guides/</guid>
      <description>
        
        
        
      </description>
    </item>
    
    <item>
      <title>Docs: Managing Deprecations</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/managing-deprecations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/managing-deprecations/</guid>
      <description>
        
        
        &lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;The best way to propose a deprecation is to first 
&lt;a href=&#34;https://github.com/spinnaker/spinnaker/issues/new&#34; target=&#34;_blank&#34;&gt;open an issue&lt;/a&gt;
, ping the 
&lt;a href=&#34;https://spinnakerteam.slack.com/messages/C0DPVDMQE/&#34; target=&#34;_blank&#34;&gt;#dev channel&lt;/a&gt;
 in Slack, and discuss your deprecation before taking action.&lt;/p&gt;
&lt;p&gt;Often times, you will need the following information:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;An overview of what the functionality does or intended to do.&lt;/li&gt;
&lt;li&gt;A description of why this functionality should be deprecated and, eventually, removed.&lt;/li&gt;
&lt;li&gt;A description of the replacement functionality, if any, or information about why this functionality will not need a replacement.&lt;/li&gt;
&lt;li&gt;The scope of impact on the codebase: What services will be affected?&lt;/li&gt;
&lt;li&gt;How will users migrate off this functionality?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;deprecation-approval&#34;&gt;Deprecation approval&lt;/h2&gt;
&lt;p&gt;Before a deprecation cycle starts, it must be approved by either the SIG owning the functionality, or by the Technical Oversight Committee.
This approval is noted by labeling the issue as &amp;ldquo;approved&amp;rdquo; or &amp;ldquo;rejected&amp;rdquo;, depending on the decision.&lt;/p&gt;
&lt;h2 id=&#34;deprecation-cycles&#34;&gt;Deprecation cycles&lt;/h2&gt;
&lt;p&gt;A deprecation must be announced at least 1 release cycle in advance of when the functionality will be removed; however, a less aggressive window should generally be used.
Deprecation announcements should be added to the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/community/releases/next-release-preview&#34;&gt;Next Release Preview page&lt;/a&gt;
 with a link to the relevant GitHub issue as well as links to any other supporting documentation, such as configuration or migration docs.&lt;/p&gt;
&lt;p&gt;Once the Spinnaker version with the deprecation announcement gets released, you are encouraged to remove the deprecated code from the codebase as soon as possible. This gives you and others sufficient time to fix edge cases that may arise from the removal before the next Spinnaker release.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Automated migrations are not always possible. In lieu of a migration, documentation must be provided on how to migrate installations.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Pull Requests and Changes</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/submitting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/community/contributing/code/submitting/</guid>
      <description>
        
        
        &lt;h2 id=&#34;change-process&#34;&gt;Change Process&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve implemented a bug fix or feature, it&amp;rsquo;s time to submit a pull request to Spinnaker. We recommend small, well-tested pull requests as a starting point for new technical contributors. For information on the correct fork-and-PR GitHub workflows to follow when contributing, reference the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/community/contributing/local-clone&#34;&gt;local clone&lt;/a&gt;
 guide.&lt;/p&gt;
&lt;p&gt;To work on bigger technical changes, follow the 
&lt;a href=&#34;#feature-proposals&#34;&gt;feature proposal&lt;/a&gt;
 or 
&lt;a href=&#34;#requests-for-change&#34;&gt;RFC&lt;/a&gt;
 processes.&lt;/p&gt;
&lt;h2 id=&#34;pull-request-tips&#34;&gt;Pull Request Tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Check that your title describes your changes and adheres to our 
&lt;a href=&#34;#commit-and-pr-message-conventions&#34;&gt;message conventions&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Add inline code comments to changes that might not be obvious.&lt;/li&gt;
&lt;li&gt;Squash your commits into logically reviewable chunks when you first submit
your PR. Address feedback in follow-up (unsquashed) commits. It&amp;rsquo;s much easier
to review incremental changes to feedback when the commits are kept separate.&lt;/li&gt;
&lt;li&gt;All pull requests should get reviewed by at least one other 
&lt;a href=&#34;https://github.com/orgs/spinnaker/people&#34; target=&#34;_blank&#34;&gt;member of the
Spinnaker organization&lt;/a&gt;
 before
merging. (While some members of the organization have access to merge without
a review, this should &lt;em&gt;only&lt;/em&gt; be done in an emergency or when merging a large
series of dependency bumps across repositories.)&lt;/li&gt;
&lt;li&gt;Squash your commits when merging to the branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;commit-and-pr-message-conventions&#34;&gt;Commit and PR message conventions&lt;/h2&gt;
&lt;p&gt;Please follow conventions below in your git commit messages. Since GitHub auto-fills Pull Request titles from the first commit message of the PR, following these conventions should help to title your PRs according to our community standards.&lt;/p&gt;
&lt;p&gt;Note: In order to track and summarize the changes happening in Spinnaker, we use a changelog automation tool called 
&lt;a href=&#34;https://github.com/clog-tool/clog-cli&#34; target=&#34;_blank&#34;&gt;clog&lt;/a&gt;
 which scrapes information from commit messages, which follow the 
&lt;a href=&#34;https://github.com/conventional-changelog/conventional-changelog/blob/a5505865ff3dd710cf757f50530e73ef0ca641da/conventions/angular.md&#34; target=&#34;_blank&#34;&gt;&amp;amp;lsquo;conventional&amp;amp;rsquo;&lt;/a&gt;
 format.&lt;/p&gt;
&lt;p&gt;To summarize, messages should be formatted as follows:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;
&amp;lt;empty line&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;empty line&amp;gt;
&amp;lt;footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;type&#34;&gt;Type&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;feat&lt;/td&gt;
&lt;td&gt;A new feature. Please also link to the issue (in the body) if applicable. Causes a minor version bump.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fix&lt;/td&gt;
&lt;td&gt;A bug fix. Please also link to the issue (in the body) if applicable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docs&lt;/td&gt;
&lt;td&gt;A documentation change.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;style&lt;/td&gt;
&lt;td&gt;A code change that does not affect the meaning of the code, (e.g. indentation).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refactor&lt;/td&gt;
&lt;td&gt;A code change that neither fixes a bug or add a feature.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;perf&lt;/td&gt;
&lt;td&gt;A code change that improves performance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;Adding missing tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chore&lt;/td&gt;
&lt;td&gt;Changes to build process or auxiliary tools or libraries such as documentation generation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;config&lt;/td&gt;
&lt;td&gt;Changes to configurations that have tangible effects on users, (e.g. renaming properties, changing defaults, etc).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The type of keyword affects the next semantic version bump. The &lt;code&gt;feat&lt;/code&gt; keyword causes a minor version bump, while the rest of the keywords cause a patch version bump. Major version bumps are triggered by the presence of the words &lt;code&gt;BREAKING CHANGE&lt;/code&gt; in the &lt;em&gt;commit message body&lt;/em&gt;. This is covered more in 
&lt;a href=&#34;#body&#34;&gt;Body&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; use one of the previous types (or don&amp;rsquo;t follow the convention), your commit will not be included in the generated changelog. Your change will still affect the next semantic version bump, but it will be considered a patch change, not a major or minor change (even if the change is a breaking change or a feature).&lt;/p&gt;
&lt;p&gt;If you submit a pull request with multiple commits and choose to &lt;em&gt;Squash and Merge&lt;/em&gt; the pull request, the individual commit message &lt;strong&gt;are not&lt;/strong&gt; added to the changelog, &lt;strong&gt;only the pull request message is&lt;/strong&gt;. To include each commit in your pull request in the changelog and next version calculation, &lt;em&gt;merge the changes without squashing&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id=&#34;scope&#34;&gt;Scope&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;scope&lt;/code&gt; of the commit message indicates the area or feature of Spinnaker the commit applies to. For instance, if you were to submit a patch to the Google provider in Clouddriver, your commit message might look something like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;feat(provider/google): Updated forwarding rule schema.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or if you submit a fix pertaining to authentication in Gate:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fix(authN): Fixed session authentication coherence.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;scope&lt;/code&gt; is purposefully left open-ended, but try to group similar changes using the same value. Changes that have the same &lt;code&gt;scope&lt;/code&gt; will be grouped together during changelog generation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some_scope
&lt;ul&gt;
&lt;li&gt;First feature goes here.&lt;/li&gt;
&lt;li&gt;Second feature goes here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;subject&#34;&gt;Subject&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;subject&lt;/code&gt; should be a short summary of the patch.&lt;/p&gt;
&lt;h4 id=&#34;body&#34;&gt;Body&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;body&lt;/code&gt; should include any detailed information about the patch; however, these can also go in the pull request body.&lt;/p&gt;
&lt;h4 id=&#34;footer&#34;&gt;Footer&lt;/h4&gt;
&lt;p&gt;Any information about breaking changes should be present in the footer. To signify a breaking change, add one line at the end of the commit message with &amp;lsquo;BREAKING CHANGE&amp;rsquo; in the line:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;feat(provider/google): Added a very important and breaking feature.

BREAKING CHANGE: More detail here if necessary.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At minimum, &amp;lsquo;BREAKING CHANGE&amp;rsquo; must be specified on the last line. The extra detail is not mandatory.&lt;/p&gt;
&lt;h3 id=&#34;feature-proposals&#34;&gt;Feature Proposals&lt;/h3&gt;
&lt;p&gt;The Spinnaker community has historically avoided accepting
pull requests that add features without prior discussion. If you would like to
propose a feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/spinnaker/spinnaker/issues/new&#34; target=&#34;_blank&#34;&gt;Open an
issue&lt;/a&gt;
 describing the desired functionality.&lt;/li&gt;
&lt;li&gt;Share your issue link in the 
&lt;a href=&#34;https://spinnakerteam.slack.com/messages/C0DPVDMQE/&#34; target=&#34;_blank&#34;&gt;#dev
channel&lt;/a&gt;
 in Slack.&lt;/li&gt;
&lt;li&gt;Consider discussing your ideas with other contributors before implementing them, to avoid rework.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;requests-for-change&#34;&gt;Requests For Change&lt;/h3&gt;
&lt;p&gt;If your change is large or very impactful, we may encourage you to submit an RFC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the 
&lt;a href=&#34;https://github.com/spinnaker/governance/blob/master/rfc/.template.md&#34; target=&#34;_blank&#34;&gt;RFC
template&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Consult several 
&lt;a href=&#34;https://github.com/spinnaker/governance/tree/master/rfc&#34; target=&#34;_blank&#34;&gt;already-submitted RFCs&lt;/a&gt;
 for
reference.&lt;/li&gt;
&lt;li&gt;When your RFC is ready, add it to 
&lt;a href=&#34;https://github.com/spinnaker/governance/tree/master/rfc&#34; target=&#34;_blank&#34;&gt;the &amp;lt;code&amp;gt;spinnaker/governance/rfc&amp;lt;/code&amp;gt;
directory&lt;/a&gt;
 with a
pull request. Approvers will see and review it.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
  </channel>
</rss>
