<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>lihsmi.ch</title>
    <description>Blog on (PHP) programming, Vagrant, Chef, Solr, TYPO3 and some other stuff.
</description>
    <link>http://michaellihs.github.io/</link>
    <atom:link href="http://michaellihs.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 10 Oct 2025 06:31:23 +0000</pubDate>
    <lastBuildDate>Fri, 10 Oct 2025 06:31:23 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Meetup: CI/CD for relational databases</title>
        <description>&lt;p&gt;These are my notes from the &lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart/&quot;&gt;DevOps Stuttgart Meetup&lt;/a&gt;: CI/CD for relational databases with &lt;a href=&quot;https://www.linkedin.com/in/jasminfluri/&quot;&gt;Jasmin Fluri&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The slides for this talk can be &lt;a href=&quot;https://de.slideshare.net/JasminFluri/relational-database-cicd&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;a-short-story-about-a-db-change&quot;&gt;A short story about a DB Change&lt;/h2&gt;

&lt;p&gt;A team with&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1 DB engineer&lt;/li&gt;
  &lt;li&gt;rest: application engineer / developer&lt;/li&gt;
  &lt;li&gt;lots of turnover in the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech stack:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Spring boot app / relational DB&lt;/li&gt;
  &lt;li&gt;CI/CD in place for the app, but not for the DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;avoid DB changes whenever possible&lt;/li&gt;
  &lt;li&gt;if totally can’t avoid, someone needs to write a migration script, send to DBA via mail, executed manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problems:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;scripts were not in VCS&lt;/li&gt;
  &lt;li&gt;it was never clear, when the DBA applies the change&lt;/li&gt;
  &lt;li&gt;no automated (regression) testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-happens-if-db-changes-are-avoided&quot;&gt;What happens if DB changes are avoided&lt;/h2&gt;

&lt;p&gt;see &lt;a href=&quot;https://ieeexplore.ieee.org/document/7840584&quot;&gt;Database decay and how to avoid it&lt;/a&gt; (Stonebraker et al 2016 )&lt;/p&gt;

&lt;h2 id=&quot;what-we-know-about-releasing-sw&quot;&gt;What we know about releasing SW&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/products/devops-sre/dora-2022-accelerate-state-of-devops-report-now-out&quot;&gt;DORA report&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;CI/CD profits from losely coupled architecture&lt;/li&gt;
  &lt;li&gt;without proper architecture, you don’t benefit from CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-5-key-metrics&quot;&gt;4 (5) key metrics&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;lead for changes (starts with implementing a feature, ends with feature in prod)&lt;/li&gt;
  &lt;li&gt;MTTR (time needed to fix a failure in production)&lt;/li&gt;
  &lt;li&gt;change failure rate (how often does a deployment fail)&lt;/li&gt;
  &lt;li&gt;deployment frequency (the more, the better because features will be slow, low risk)&lt;/li&gt;
  &lt;li&gt;deployment reliability is opposite of change failure rate (as a corollary to change failure rate)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;high-performing-teams-and-delivery-capabilities&quot;&gt;High performing teams and delivery capabilities&lt;/h2&gt;

&lt;p&gt;High performing teams are able to ship their changes in smaller increments:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;small change, small impact, lower risk, faster feedback&lt;/li&gt;
  &lt;li&gt;small changes, easier to undo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;goal-of-sw-release&quot;&gt;Goal of SW release&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;ship small features continuously&lt;/li&gt;
  &lt;li&gt;but this is not very common in database development&lt;/li&gt;
  &lt;li&gt;DB teams are used to ship large changes, because the automation does not support a process with smaller changes&lt;/li&gt;
  &lt;li&gt;that is where CI/CD comes to help&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;db-development-in-numbers&quot;&gt;DB development in numbers&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;50% of DB applications have no QA for database testing (data quality / application testing)&lt;/li&gt;
  &lt;li&gt;&amp;lt; 50% have no automated development workflows&lt;/li&gt;
  &lt;li&gt;lack of DB automation is one of the most common bottlenecks in releasing changes&lt;/li&gt;
  &lt;li&gt;&amp;lt; 30% of DB dev have automated testing and static code analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cicd-for-apps&quot;&gt;CI/CD for apps&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;dev make change&lt;/li&gt;
  &lt;li&gt;dev pushes to VCS&lt;/li&gt;
  &lt;li&gt;triggers pipeline&lt;/li&gt;
  &lt;li&gt;CI server executes CI pipeline&lt;/li&gt;
  &lt;li&gt;pipeline generates new version, replaces an old version&lt;/li&gt;
  &lt;li&gt;no state in building the application
    &lt;ul&gt;
      &lt;li&gt;it is always build from scratch&lt;/li&gt;
      &lt;li&gt;application deployment is usually immutable&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cicd-for-db&quot;&gt;CI/CD for DB&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;dev makes change in file, generated code (migration script), exported code (diffs, statements…) - many methods to be considered here&lt;/li&gt;
  &lt;li&gt;all the DB changes in VCS have a defined order (in which they later on need to be executed)&lt;/li&gt;
  &lt;li&gt;builds always run against a physical instance of a DB&lt;/li&gt;
  &lt;li&gt;there is usually / always state involved - a lot of state!!!
    &lt;ul&gt;
      &lt;li&gt;you need a database ready with a state to test your changes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;5-pre-conditions-for-db-cicd&quot;&gt;5 pre conditions for DB CI/CD&lt;/h2&gt;

&lt;h3 id=&quot;1-version-control&quot;&gt;1. Version control&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;w/o VCS there is no single source of truth&lt;/li&gt;
  &lt;li&gt;dir structure of repo depends on migration tool used&lt;/li&gt;
  &lt;li&gt;DDLs for “target state structure”&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;usually delta files are used to transition from one DB state to the other&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;how do you keep DDLs and migration scripts in sync?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;liquibase only DDLs?
    &lt;ul&gt;
      &lt;li&gt;renaming is an operation where you need a delta script (renaming can’t be derived from DDL only)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;test code and test data (also belongs in repo)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;but-pure-file-based-dev-is-uncommon-in-db-development&quot;&gt;BUT: pure file-based dev is uncommon in DB development&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;choice of migration tool will affect how you store and order your sourc code&lt;/li&gt;
  &lt;li&gt;“passive version control”: because active part is in the database
    &lt;ul&gt;
      &lt;li&gt;risk to forget exporting things that we changed inside the DB&lt;/li&gt;
      &lt;li&gt;changes made to dev environment are also exported correctly&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;often, scripts for DB changes are generated from changes made manually to the DB&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;repeatability-of-migration-scripts&quot;&gt;Repeatability of migration scripts&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;most of all: atomicity / idempotency of migration scripts&lt;/li&gt;
  &lt;li&gt;if not repeatable: if fails midway, we only want to apply the changes that have not yet been applied before sth failed&lt;/li&gt;
  &lt;li&gt;if it fails, we want no new migration scripts, but want the&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;branching-strategy&quot;&gt;Branching strategy&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;DB changes are related to infra changes, build on each other, only make sense in in sequence&lt;/li&gt;
  &lt;li&gt;testing on feature branches becomes useless
    &lt;ul&gt;
      &lt;li&gt;WHY? because the underlying DB state might long have changed&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;trunk-based development to the rescue
    &lt;ul&gt;
      &lt;li&gt;forces people to do small changes&lt;/li&gt;
      &lt;li&gt;testing on main makes sure people know what happens previously&lt;/li&gt;
      &lt;li&gt;only one path to reach “current state”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;access source code in Delivery pipeline
    &lt;ul&gt;
      &lt;li&gt;breaks (least privilege) single responsibility for CD pipeline&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;code reviews with tbd
    &lt;ul&gt;
      &lt;li&gt;async code review takes lots of time&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;long lead time for merge requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-static-code-analysis&quot;&gt;2. Static code analysis&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;before linting &amp;amp; SCA: you need coding guidelines
    &lt;ul&gt;
      &lt;li&gt;save time discussing coding guidelines in MRs (let the linter do the work)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;not much adoption of linters for SQL / DDL
    &lt;ul&gt;
      &lt;li&gt;assumption: too big of a rule set for linters&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-database-migration-tools&quot;&gt;3. Database migration tools&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;initial state: applying initial DDL&lt;/li&gt;
  &lt;li&gt;after that: applying DDL &amp;amp; DML&lt;/li&gt;
  &lt;li&gt;database schema evolution&lt;/li&gt;
  &lt;li&gt;2 tools: flyway and liquibase&lt;/li&gt;
  &lt;li&gt;don’t write a migration tool yourself&lt;/li&gt;
  &lt;li&gt;if you use Liquibase: don’t use XML (or JSON or YAML)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-automated-db-tests&quot;&gt;4. Automated DB tests&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;projects without automated testing spends 25% of team capacity for manual testing&lt;/li&gt;
  &lt;li&gt;possibility 1: app code for DB testing (junit and dbunit)&lt;/li&gt;
  &lt;li&gt;possibility 2: unit testing in the database (pgTAP, utplsql)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-decoupled-codebase&quot;&gt;5. Decoupled codebase&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;between app and DB&lt;/li&gt;
  &lt;li&gt;coupled code bases require organised releases across teams
    &lt;ul&gt;
      &lt;li&gt;every release becomes a big issue&lt;/li&gt;
      &lt;li&gt;this is not CD!&lt;/li&gt;
      &lt;li&gt;people have to wait for others to release their changes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;why is it important to deploy changes at any time?
    &lt;ul&gt;
      &lt;li&gt;we don’t wanna work outside business hours&lt;/li&gt;
      &lt;li&gt;reduce stress&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;abstraction layer
    &lt;ul&gt;
      &lt;li&gt;between app and DB - DB API&lt;/li&gt;
      &lt;li&gt;needs to be versioned&lt;/li&gt;
      &lt;li&gt;no direct access to a table&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;see DB schema as an API, changes to it can be breaking for consumers
    &lt;ul&gt;
      &lt;li&gt;if DB changes, the app has to adopt the changes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;decoupling means: provide a versioned access layer
    &lt;ul&gt;
      &lt;li&gt;app A can access version 1 of my DB API&lt;/li&gt;
      &lt;li&gt;can switch from version 1 to version 2 of DB API when ready&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;API could be views and procedures that can be versioned&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cicd-pipelines-for-databases&quot;&gt;CI/CD pipelines for databases&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;development environment by the click of a button
    &lt;ul&gt;
      &lt;li&gt;if this deviates a lot from the target, production DB, causes pain –&amp;gt; “DB version drift”&lt;/li&gt;
      &lt;li&gt;no infra resemblance necessary, schem resemblance is sufficient (eg. Docker container)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;check code, before you deploy it
    &lt;ul&gt;
      &lt;li&gt;applies to coding guidelines&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;store artefacts in artefact storage after CI
    &lt;ul&gt;
      &lt;li&gt;no more repo access in CD&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;do a backup of your environment before you deploy a change
    &lt;ul&gt;
      &lt;li&gt;with a DB you can’t “deploy” a previous artefact - your data will be gone without a backup&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;deploy SQL code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;effects-of-cicd-in-database-development&quot;&gt;Effects of CI/CD in database development&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;not automating integration and deployment is a change preventer
    &lt;ul&gt;
      &lt;li&gt;releases tend to get bigger&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;with automation, have independency to deploy changes
    &lt;ul&gt;
      &lt;li&gt;without relying on other people&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;number of deployments increased significantly after introducing automated pipelines
    &lt;ul&gt;
      &lt;li&gt;with more releases, changesets got smaller&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Change failure rate decreased by 75% with automation pipelines&lt;/li&gt;
  &lt;li&gt;Cognitive load of developers decreased with automation pipelines
    &lt;ul&gt;
      &lt;li&gt;interviews&lt;/li&gt;
      &lt;li&gt;less stress&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;questions&quot;&gt;Questions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;code examples for DB tests
    &lt;ul&gt;
      &lt;li&gt;is there a reason to test, if the DB is rather simple?&lt;/li&gt;
      &lt;li&gt;there is more than tables in a DB, that requires testing
        &lt;ul&gt;
          &lt;li&gt;eg. assure that the procedures I write do what I expect&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;indication for DB abstraction layer
    &lt;ul&gt;
      &lt;li&gt;if DB and app have different release cycles&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://martinfowler.com/books/refactoringDatabases.html&quot;&gt;Book “Refactoring databases”&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;differences between nosql vs relational DBs when it comes to CI/CD and migration
    &lt;ul&gt;
      &lt;li&gt;most nosql don’t allow for much functionality to be developed in the DB&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;what is a good boundary between DB config (eg. managed in Terraform) / and DB schema (managed in DDL / SQL)
    &lt;ul&gt;
      &lt;li&gt;TF everything that’s not in the schema eg. users&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Tue, 28 Feb 2023 20:00:00 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2023/02/28/ci-cd-for-relational-databases.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2023/02/28/ci-cd-for-relational-databases.html</guid>
        
        <category>meetup</category>
        
        <category>ci/cd</category>
        
        <category>databases</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>Meetup: Automotive Software Development</title>
        <description>&lt;p&gt;These are my notes from the first &lt;a href=&quot;https://www.meetup.com/de-DE/automotive-software-development/events/289906269/&quot;&gt;“Automotive Software Development Meetup”&lt;/a&gt; with &lt;a href=&quot;https://www.linkedin.com/in/christian-fraas/&quot;&gt;Christian Fraas&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/michael-fait-b2247684/&quot;&gt;Michael Fait&lt;/a&gt; in Stuttgart last week.&lt;/p&gt;

&lt;h1 id=&quot;automotive-meetup&quot;&gt;Automotive meetup&lt;/h1&gt;

&lt;p&gt;On Tuesday, Nov 23rd 2022, we had our very first &lt;a href=&quot;https://www.meetup.com/de-DE/automotive-software-development/&quot;&gt;Automotive Software Development Meetup&lt;/a&gt; in the Thoughtworks office in Stuttgart.&lt;/p&gt;

&lt;p&gt;For this event, we had 2 speakers, Christian Fraas from Microsoft and Michael Fait from Thoughtworks. Unfortunately I only took notes during the talk from Christian. Michael’s talk was about Rust in automotive.&lt;/p&gt;

&lt;h2 id=&quot;christian---automotive-control-plane&quot;&gt;Christian - Automotive Control Plane&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/christian-fraas/&quot;&gt;Christian Fraas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;1.5 years at MS, before 13 years at Daimler&lt;/li&gt;
  &lt;li&gt;MS: “why dont we bring cloud ideas and technology in to the car”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;what-is-a-control-plane&quot;&gt;What is a control plane&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;in the cloud
    &lt;ul&gt;
      &lt;li&gt;eg. the thing that orchestrates your network&lt;/li&gt;
      &lt;li&gt;does the magic in the cloud&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;here: Kubernetes Control Plane
    &lt;ul&gt;
      &lt;li&gt;the thing that controls what’s happening in the K8S cluster&lt;/li&gt;
      &lt;li&gt;“the magic that happens in the background”&lt;/li&gt;
      &lt;li&gt;https://kubernetes.io/docs/concepts/overview/components&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;features-of-k8s&quot;&gt;Features of K8S&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;description of your deployments&lt;/li&gt;
  &lt;li&gt;standardized API&lt;/li&gt;
  &lt;li&gt;workload orchestration&lt;/li&gt;
  &lt;li&gt;inventory of deployed workload&lt;/li&gt;
  &lt;li&gt;extensible (custom resources)&lt;/li&gt;
  &lt;li&gt;giant community and ecosystem&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;motivation&quot;&gt;Motivation&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;it would be great to have all these features above to deploy software to a car&lt;/li&gt;
  &lt;li&gt;can we bring these concepts into a car?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;in-car-architecture&quot;&gt;In-car architecture&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;there are low level ECUs (micro controller) [majority] in a car, mainly running on Autosar classic&lt;/li&gt;
  &lt;li&gt;there are high-performance computers (micro processors) [minority] in a car, eg. head unit, telematics unit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;automotive-control-plane&quot;&gt;Automotive Control Plane&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;multiple runtime technologies in a car (from low level ECUs to Docker containers)&lt;/li&gt;
  &lt;li&gt;each of the workloads that go on such a device are deployed in a different way
    &lt;ul&gt;
      &lt;li&gt;it depends on the technology how you can update the software in the car&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;this variety can lead to a big mess
    &lt;ul&gt;
      &lt;li&gt;eg. resolved by a variety of “How Tos” that explain how to flash a car&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;it would be nice to have a technology-agnostic way to deploy SW to a car
    &lt;ul&gt;
      &lt;li&gt;extensible for different SW deployment technologies (eg. replace the container runtime at a later time)&lt;/li&gt;
      &lt;li&gt;unified configuration of different technologies&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;expected capabilities
    &lt;ul&gt;
      &lt;li&gt;update&lt;/li&gt;
      &lt;li&gt;rollback&lt;/li&gt;
      &lt;li&gt;monitoring&lt;/li&gt;
      &lt;li&gt;delta update&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;you need to be able to do that in an environment where you don’t have any connectivity
    &lt;ul&gt;
      &lt;li&gt;eg. during the car being parked in a connection-less parking lot&lt;/li&gt;
      &lt;li&gt;crucial requirement&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Possible architecture: an update manager on top of an K3S control plane
    &lt;ul&gt;
      &lt;li&gt;reason: K8S has no dependency management for deployment procedures&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Use K3S instead of K8S to get a smaller footprint (spoiler: it’s still too big)&lt;/li&gt;
  &lt;li&gt;Interesting part: how to bring the technology in the systems that are not native K8S (custom resources vs. virtual kubelet)
    &lt;ul&gt;
      &lt;li&gt;possible solution: &lt;a href=&quot;https://virtual-kubelet.io/&quot;&gt;virtual kubelet&lt;/a&gt; makes a facade for the API of your target device (eg. Autosar Classic / Adaptive)&lt;/li&gt;
      &lt;li&gt;node (ECU) then acts like a K8S node&lt;/li&gt;
      &lt;li&gt;a virtual kubelet allows you to update an Autosar ECU just like a Docker container&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;eclipse-leda&quot;&gt;Eclipse Leda&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;all this is “&lt;a href=&quot;https://projects.eclipse.org/projects/automotive.leda&quot;&gt;Eclipse Leda&lt;/a&gt;”&lt;/li&gt;
  &lt;li&gt;allows for developers to run their application in a virtualised environment&lt;/li&gt;
  &lt;li&gt;comes with a vehicle update manager&lt;/li&gt;
  &lt;li&gt;self-update agent for FOTA&lt;/li&gt;
  &lt;li&gt;collects metrics and logs and ships them back to the cloud with open telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;demo&quot;&gt;Demo&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Leda is very basic operating system
    &lt;ul&gt;
      &lt;li&gt;Container runtime&lt;/li&gt;
      &lt;li&gt;DNS&lt;/li&gt;
      &lt;li&gt;CAN drivers&lt;/li&gt;
      &lt;li&gt;connectivity&lt;/li&gt;
      &lt;li&gt;everything is running in Docker containers&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;using a virtual machine running in the cloud to emulate an ECU with QEMU
    &lt;ul&gt;
      &lt;li&gt;within this double-virtualised machine, an automotive control plane is running&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;all tools that work with K8S could now “work in the car”
    &lt;ul&gt;
      &lt;li&gt;example: show all software running in a car with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;k9s&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;deployment yaml looks exactly the same for in-vehicle software as for cloud deployments&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://projects.eclipse.org/projects/automotive.velocitas&quot;&gt;Eclipse Velocitas&lt;/a&gt; as and end2end development toolchain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;challenges-for-an-automotive-control-plane-based-on-k3s&quot;&gt;Challenges for an automotive control plane based on K3S&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;resource footprint is too big for in-vehicle computers&lt;/li&gt;
  &lt;li&gt;boot time for K3S is too long for a car&lt;/li&gt;
  &lt;li&gt;offline update doesn’t work out of the box&lt;/li&gt;
  &lt;li&gt;self-update doesn’t work out of the box&lt;/li&gt;
  &lt;li&gt;workload distribution in a car is really static
    &lt;ul&gt;
      &lt;li&gt;K8S features for this is not required&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;questions&quot;&gt;Questions&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;how does “developer first” fits into the “embedded developer world”
    &lt;ul&gt;
      &lt;li&gt;do embedded developers really want to deal with Kubernetes?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;will the concept of embedded developers and cloud developers will merge?
    &lt;ul&gt;
      &lt;li&gt;group of developers will further differentiate&lt;/li&gt;
      &lt;li&gt;K8S might not be the tool a embedded developer has in mind right now&lt;/li&gt;
      &lt;li&gt;but anyway it will help them develop their software&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;further-references&quot;&gt;Further references&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://sdv.eclipse.org/&quot;&gt;Software defined vehicle - Eclipse Foundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 29 Nov 2022 20:00:00 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2022/11/29/automotive-software-development-meetup.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2022/11/29/automotive-software-development-meetup.html</guid>
        
        <category>meetup</category>
        
        <category>automotive</category>
        
        <category>kubernetes</category>
        
        <category>rust</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>Meetup: Why you should avoid platform monoliths</title>
        <description>&lt;p&gt;These are my notes from the &lt;a href=&quot;https://www.thoughtworks.com/about-us/events/avoid-platform-monoliths&quot;&gt;Thoughtworks meetup on Nov 23rd 2022 (link contains recording)&lt;/a&gt; with &lt;a href=&quot;https://www.linkedin.com/in/marion-bruns-673282/&quot;&gt;Marion Bruns&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/punjabirahul/&quot;&gt;Rahul Punjabi&lt;/a&gt; about platform monoliths and why you should avoid them.&lt;/p&gt;

&lt;h1 id=&quot;why-you-should-avoid-platform-monoliths&quot;&gt;Why you should avoid platform monoliths&lt;/h1&gt;

&lt;h2 id=&quot;some-background&quot;&gt;Some background&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;platform as enabler for enterprises to deliver customer value quickly
    &lt;ul&gt;
      &lt;li&gt;in this talk, focus on developer platform&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;why invest?
    &lt;ul&gt;
      &lt;li&gt;t2market, cost efficiency, reliabilit, security&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;reality check for dev platforms&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;“have you faced one or more of these challenges?”&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;ul&gt;
      &lt;li&gt;platform becomes a bottleneck&lt;/li&gt;
      &lt;li&gt;low adoption rate amongst developers&lt;/li&gt;
      &lt;li&gt;insufficient performance&lt;/li&gt;
      &lt;li&gt;new features take long time to be implemented&lt;/li&gt;
      &lt;li&gt;costs are rising&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;online poll reveals: “some of the points above applied to 57% of the audience”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;why-do-platforms-fail&quot;&gt;Why do platforms fail?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;treating the cloud like on-prem DCs
    &lt;ul&gt;
      &lt;li&gt;delegated to a team that previously maintained the on-prem DC&lt;/li&gt;
      &lt;li&gt;ticket-based&lt;/li&gt;
      &lt;li&gt;silos&lt;/li&gt;
      &lt;li&gt;no interaction with outer world&lt;/li&gt;
      &lt;li&gt;no product thinking&lt;/li&gt;
      &lt;li&gt;“it takes more to enable autonomous teams and the business value you want to achieve”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;not planning for right scale
    &lt;ul&gt;
      &lt;li&gt;scaling up AND scaling down (starting with tons of resources, not really required)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;assuming what platform customers want
    &lt;ul&gt;
      &lt;li&gt;“we wil build something and they will come” -&amp;gt; does not really happen&lt;/li&gt;
      &lt;li&gt;lack of collaboration with future customers&lt;/li&gt;
      &lt;li&gt;lack of product thinking&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;unbalanced capabilities across teams
    &lt;ul&gt;
      &lt;li&gt;things get developed in isolation&lt;/li&gt;
      &lt;li&gt;when times come, devs need to be onboarded without proper capabilities&lt;/li&gt;
      &lt;li&gt;platform tends to be too complex&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;traditional-drivers-monolithic-platform-formula&quot;&gt;Traditional drivers: monolithic platform formula&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;seen by a lot of clients, when first approaching TW)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;what do we mean by that?
    &lt;ul&gt;
      &lt;li&gt;“platform team box in the cloud”
        &lt;ul&gt;
          &lt;li&gt;users and access key, IAM, CI/CD, networking, logging, monitoring&lt;/li&gt;
          &lt;li&gt;compute orchestrator (K8S or EC2 instances)&lt;/li&gt;
          &lt;li&gt;“if you want DevOps, Jenkins is probably the first step”&lt;/li&gt;
          &lt;li&gt;underlaying: runtime cluster of nodes&lt;/li&gt;
          &lt;li&gt;service mesh in the middle between cluster and customer workload… service discovery, circuit breaking, service2service comm…&lt;/li&gt;
          &lt;li&gt;client workload running on top, eventually “soft” isolation of workloads&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;issue with service mesh - ask: do you really need that? only makes sense with micro services at scale
        &lt;ul&gt;
          &lt;li&gt;often get implemented without actual need, very complex&lt;/li&gt;
          &lt;li&gt;service meshes can slow down entire architecture&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;last but not least: data as the most sensitive asset of your company
        &lt;ul&gt;
          &lt;li&gt;data is part of the “platform box” - data is sitting there… customer data, product data, potentially highly confidential&lt;/li&gt;
          &lt;li&gt;sits in the same box that is accessible by everybody&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;there are some use cases where this box-approach can work
    &lt;ul&gt;
      &lt;li&gt;but many times, this approach does not work&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;centralized platform IS NOT a sensible default
    &lt;ul&gt;
      &lt;li&gt;security&lt;/li&gt;
      &lt;li&gt;reliability&lt;/li&gt;
      &lt;li&gt;maintainability&lt;/li&gt;
      &lt;li&gt;performance&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;why-is-the-this-monolithic-platform-formula-not-a-sensible-default&quot;&gt;Why is the this monolithic platform formula NOT a sensible default&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;security incidents
    &lt;ul&gt;
      &lt;li&gt;ask: “when and how they might happen” not “if they may happen”&lt;/li&gt;
      &lt;li&gt;think about the attack surface, how might an attacker attack the platform&lt;/li&gt;
      &lt;li&gt;what permissions do your roles allow?&lt;/li&gt;
      &lt;li&gt;how and where is your data stored - how granular are permissions to data…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;share multi-purpose platform
    &lt;ul&gt;
      &lt;li&gt;one container orchestrator vs. workloads of varying characteristics that should run on the platform
        &lt;ul&gt;
          &lt;li&gt;example: one CI/CD system for all customers, but runners might have completely different characteristics in terms of platform requirements&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;capacity management
        &lt;ul&gt;
          &lt;li&gt;despite automated measures in the container orchestrators, you will be flooded with requests for fixing resource issues&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;you lose the capabilities of modern cloud in terms of scalability…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Cluster administration with an enormous failure radius
    &lt;ul&gt;
      &lt;li&gt;how much effort do you have to put into patching and upgrading&lt;/li&gt;
      &lt;li&gt;what about the likelihood that an individual workload can block your cluster from udpating appropriately&lt;/li&gt;
      &lt;li&gt;what about your confidence in recovering from cluster-wider failures?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Multi-tenancy limitations
    &lt;ul&gt;
      &lt;li&gt;maintaining multi-tenancy on compute, storage and network is complex&lt;/li&gt;
      &lt;li&gt;there are a lot of measures that can be taken &amp;amp; provided by cloud provider, but implementing them can become very tedious&lt;/li&gt;
      &lt;li&gt;you easily run into an amount of policies that are hard to maintain on a platform level&lt;/li&gt;
      &lt;li&gt;limitations in network resources (IPv4 addresses, ports…)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-are-the-solutions-at-hand&quot;&gt;What are the solutions at hand?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;What can we learn from Microservices, Data Mesh &amp;amp; Evolutionary Architecture (applied to developer platforms)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Architectural Quantum
    &lt;ul&gt;
      &lt;li&gt;independently deployable component with high functional cohesion, required by system to function properly&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;formula-for-the-design-of-a-decentralized-platform&quot;&gt;Formula for the design of a decentralized platform&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Dedicated architectural quantum for each customer
    &lt;ul&gt;
      &lt;li&gt;Azure: one subscription for each customer&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;what’s inside
    &lt;ul&gt;
      &lt;li&gt;compute&lt;/li&gt;
      &lt;li&gt;network integration&lt;/li&gt;
      &lt;li&gt;observability tooling&lt;/li&gt;
      &lt;li&gt;…&lt;/li&gt;
      &lt;li&gt;IMPORTANT: capabilities depend on your use case&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;how is this benefitial
    &lt;ul&gt;
      &lt;li&gt;security incident: fix it for one affected customer&lt;/li&gt;
      &lt;li&gt;setup auto-scaling suitable for the one workload / use case of customer&lt;/li&gt;
      &lt;li&gt;you won’t run out of resources for an individual customer (as long as cloud provider can offer more)&lt;/li&gt;
      &lt;li&gt;you can apply horizontal scaling (if needed)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;shared services in platform
    &lt;ul&gt;
      &lt;li&gt;hybrid networking&lt;/li&gt;
      &lt;li&gt;inter-quantum networking&lt;/li&gt;
      &lt;li&gt;internet connectivity&lt;/li&gt;
      &lt;li&gt;DNS and service discovery&lt;/li&gt;
      &lt;li&gt;compliance automation (making sure, users follows policies)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;platform services (will vary from context to context - this is just a spectrum)
    &lt;ul&gt;
      &lt;li&gt;IaC and pipelines for infrastructure management&lt;/li&gt;
      &lt;li&gt;compliance and government policies&lt;/li&gt;
      &lt;li&gt;developer portal&lt;/li&gt;
      &lt;li&gt;community forum&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;we encourage to put as many capabilities as possible in the quantum, since it is still managed by the platform team&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Outcomes of running decentralized platforms at scale
    &lt;ul&gt;
      &lt;li&gt;applied to multiple public cloud providers - approach worked for multiple clouds&lt;/li&gt;
      &lt;li&gt;how long does it take: productive customers within the year of inception&lt;/li&gt;
      &lt;li&gt;allows for self-service for the teams&lt;/li&gt;
      &lt;li&gt;allows for security guard rails&lt;/li&gt;
      &lt;li&gt;increased cost-transparency&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;core-capabilities-and-practices-for-successful-platform-strategies&quot;&gt;Core capabilities and practices for successful platform strategies&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;it’s more than just implementation - eg. balance capabilities across teams - how do I approach in a way that everyone can benefit from it&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Product Thinking
    &lt;ul&gt;
      &lt;li&gt;do user research, get requirements from your customers, do enough research to get those requirements&lt;/li&gt;
      &lt;li&gt;Define measures of success - you have to do this right from the start - are you helping your customers or are you getting in their way?&lt;/li&gt;
      &lt;li&gt;product strategy - product owner who can aling with business objectives - have a platform to serve the business objectives&lt;/li&gt;
      &lt;li&gt;establish and communicate service level objectives&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;shared responsibility
    &lt;ul&gt;
      &lt;li&gt;mapping technical capabilities and interfaces (interfaces in terms of “how do you collaborate”)&lt;/li&gt;
      &lt;li&gt;what does it mean to define technical capabilities
        &lt;ul&gt;
          &lt;li&gt;define collboratively the needed tech capabilities&lt;/li&gt;
          &lt;li&gt;define model on how you offer capabilities (just documentation, code snippets, …)&lt;/li&gt;
          &lt;li&gt;define the interaction model with the development teams (self-service, developer portal, …) - but even close collaboration with the dev team&lt;/li&gt;
          &lt;li&gt;how do you want to onboard? you might even need to go into the team(s) and help them with onboarding&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;self-service
    &lt;ul&gt;
      &lt;li&gt;invest in a developer portal (eg. Backstage)
        &lt;ul&gt;
          &lt;li&gt;step-by-step guide in how developers can make use of services&lt;/li&gt;
          &lt;li&gt;there should be no need for devs to write tickets to get something (onboarding new user, new VM…)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;build automated, dev friendly interfaces&lt;/li&gt;
      &lt;li&gt;provide paved paths for frequent user journeys&lt;/li&gt;
      &lt;li&gt;build in quality gates and guardrails&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Lightweight governance
    &lt;ul&gt;
      &lt;li&gt;enable autonomous teams!&lt;/li&gt;
      &lt;li&gt;treat principles and guardrails as living artifacts&lt;/li&gt;
      &lt;li&gt;use compliance as code and automation to enforce them&lt;/li&gt;
      &lt;li&gt;continuously collaboration on those principles - allow for users to work and aling on these principles - collaboration is key&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;some-of-the-challenges&quot;&gt;Some of the challenges&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Isn’t this more expensive?
    &lt;ul&gt;
      &lt;li&gt;return question: how are you looking at costs?&lt;/li&gt;
      &lt;li&gt;consider hollistic view of costs over local optimization&lt;/li&gt;
      &lt;li&gt;when slowing down customers with monolithic platform eg., experimentation, platform reduces competitive advantages of your dev teams&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Orchestration of dependencies across platform infrastructure&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Balancing infra capabilities across platform and customer teams (especially when starting with the platform)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;monolithic platforms can restrict its own evolution and restric the customers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;references--resources&quot;&gt;References &amp;amp; resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/content/dam/thoughtworks/documents/e-book/tw_ebook_infrastructure_as_product_max_griffiths_2021.pdf&quot;&gt;Infrastructure as product - Max Griffiths&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/en-de/radar/techniques/incremental-developer-platform&quot;&gt;Incremental developer platform on Thoughtworks Technology Radar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/en-de/insights/blog/art-platform-thinking&quot;&gt;The art of platform thinking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/content/dam/thoughtworks/documents/guide/tw_guide_enterprise_guide_to_platform_thinking.pdf&quot;&gt;The enterprise guide of platform thinking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/en-de/insights/blog/why-you-should-invest-good-developer-experience-today&quot;&gt;Why you should invest in good Developer Experience today&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/insights/blog/experience-design/approaches-for-a-better-developer-experience&quot;&gt;Five proven approaches for a better Developer Experience in your organisation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 23 Nov 2022 20:00:00 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2022/11/23/avoid-platform-monolith.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2022/11/23/avoid-platform-monolith.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>platform</category>
        
        <category>developer experience</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>Curated Q&amp;As from &apos;Trunk-based development Meetup&apos;</title>
        <description>&lt;p&gt;Last week, I had the pleasure to speak about &lt;em&gt;Trunk-Based Development&lt;/em&gt; together with ThoughtWorks’ &lt;a href=&quot;https://twitter.com/ctford&quot;&gt;Chris Ford&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/kief&quot;&gt;Kief Morris&lt;/a&gt;. This blog post contains a curated list of questions and answers from the discussions we had during the meetup.&lt;/p&gt;

&lt;p&gt;For those of you who missed the talk, here are &lt;a href=&quot;https://github.com/michaellihs/presentations/blob/master/trunk-based-development/2021-01-21-meetup-trunk-based-development.pdf&quot;&gt;the slides from the presentation&lt;/a&gt;. The recording of the talk is currently in review, I will link it as soon as it’s available.&lt;/p&gt;

&lt;h3 id=&quot;but-we-do-trunk-based-development-with-pull-requests&quot;&gt;But we do trunk-based development with pull requests&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;There was some irritation around “my definition” of trunk-based development&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;But we do trunk-based development with pull requests!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The short answer maybe is, that even if there are trunk-based development approaches where you have pull-requests in place, we generally try to avoid this for the sake of faster feedback and fully automated continuous integration workflows.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I disagree with the definition. You can do trunk based with pull requests… my definition:&lt;/p&gt;

  &lt;p&gt;A source-control branching model, where developers collaborate on code in a single branch called ‘trunk’ *, resist any pressure to create other long-lived development branches by employing documented techniques. They therefore avoid merge hell, do not break the build, and live happily ever after&lt;/p&gt;

  &lt;p&gt;Does not mean you should not do pull requests&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;cicd-with-feature-branches&quot;&gt;CI/CD with feature branches&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;On the topic of how feature branches complicate your CI pipelines&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Regularly rebasing the feature branch from the main branch would avoid this late feedback problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer given in the chat / shown on the slides: No, as soon as you have 2 (or more) feature branches, you don’t have continuous integration (because you don’t have the changes of the other feature branches in your branch).&lt;/p&gt;

&lt;h3 id=&quot;team-size--experience-and-trunk-based-development&quot;&gt;Team size &amp;amp; experience and trunk-based development&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;How do you integrate less experienced developers in the team who might not yet be familiar with producing good quality code?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some of the answers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We use pair programming for knowledge-sharing and supporting our junior team members&lt;/li&gt;
  &lt;li&gt;We generally provide a safe space to make mistakes and strive for a blame free environment&lt;/li&gt;
  &lt;li&gt;Don’t misinterpret “pair programming” with “not letting them work on their own” though!&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is a size of the typical team and what is an average experience level (Seniors vs Mids vs Juniors)? Thx.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;We have teams of about 8 people with about 4 developers&lt;/li&gt;
  &lt;li&gt;We always look for a good mix of senior and junior developers - as well as gender and diversity in general&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;code-reviews-with-trunk-based-development&quot;&gt;Code Reviews with trunk-based development&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;You probably will go into how to do effective reviews using trunk based dev, if you don’t have the luxury to pair program all the time, right?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;we actually do pair programming all the time, it is an essential part of our development workflow&lt;/li&gt;
  &lt;li&gt;other than that, we have tech huddles or sessions where we only talk about crucial parts of our code&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;I believe that the PR with code reviews brought a huge quality improve. It gives the team (not only to your pair) the option get to know (and agree on) a feature implementation? Having a code review at the end would remove an easy option to agree/disagree on how a feature is implemented (as you might have commits from multiple features).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I think the problem lies in the “at the end” here - PRs move the feedback to a very late point in your development workflow - we try to enable this feedback earlier with the tools mentioned in the presentation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;Do you have experience with good methods to do reviews more asynchronously together with TBD? I am thinking especially if the team members are remote and potentially in different time zones and pair programming is not as simple from a logistic point of view.&lt;/li&gt;
    &lt;li&gt;Do you have more examples of code reviews in TBD outside of pair or mob programming?&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I think Kief mentioned a few approaches, e.g. make them part of the review or have dedicated sessions for review.&lt;/li&gt;
  &lt;li&gt;With crucial code, we sometimes make it part of our daily tech huddles&lt;/li&gt;
  &lt;li&gt;(from a participant) we are using both approaches in our company. The same people commit and push code more often when working with feature branches. Code review is actually a huge problem for us when doing TBD; no context switch for code author, but reviewers have to stop their work&lt;/li&gt;
  &lt;li&gt;(from a participant) I remember reading (I think on Peter Seibel’s Twitter?) about how in one team they would review code &lt;em&gt;after&lt;/em&gt; it got merged to the main branch.  Note that this kind of review emphasizes knowledge sharing as opposed to preventing errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;feature-toggles&quot;&gt;Feature Toggles&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do you always work with feature toggles when you commit directly into the mainline?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I would say, it depends, e.g. on the maturity of the project. At the beginning of a project - without any production users around - you probably don’t use feature toggles. Later on you might consider them to guarantee a stable prod environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hm, so does it mean that with TBD I have less than a day to implement a feature for the customer? But with, say Git Flow, I can work on the feature for longer period of time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;The short answer is people usually have a “feature toggle” that can turn the feature off until it is all done.&lt;/li&gt;
  &lt;li&gt;You can still have multiple days/weeks to develop a feature - feature toggles for the win&lt;/li&gt;
  &lt;li&gt;The value of TBD and toggles for work that takes longer is that it forces you to have discipline to keep the code clean and working. If I take days to work on something without committing, my code tends to get very messy&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Feature toggle are good and valid solution. But also, here you can get into a similar hell like with the branch-hell! Not every time the features are completely independent, so you need test different combinations of the feature-toggle-states. Managing these could very complex☹.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;As with anything, good design, good discipline is essential&lt;/li&gt;
  &lt;li&gt;For further details on how to avoid feature toggle hell, refer to this &lt;a href=&quot;https://www.thoughtworks.com/insights/blog/managing-feature-toggles-teams&quot;&gt;blog post by my dear colleagues Paul and Steve&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;I think my biggest issue with TBD is that it forces you to use feature-toggles. Using them leads to tech debt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I wouldn’t say it forces you to do features toggles. It is just that they make a lot of sense with TBD.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you want to commit often you will come into the situation where you need FTs, so it forces you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Depends on how you plan your feature road map, imho&lt;/li&gt;
  &lt;li&gt;Not every commit introduces a new feature, even in the most aggressive greenfield project, I suppose?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;trunk-based-development-and-very-large-teams&quot;&gt;Trunk-based development and very large teams&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Have you ever tried this with 600 developers pushing to master?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I think if you have 600 developers working on a single codebase you have a problem!&lt;/li&gt;
  &lt;li&gt;Google does trunk base development with a lot moe programmers ;)&lt;/li&gt;
  &lt;li&gt;Unless you are google or Facebook, which do this, but they have sophisticated tooling&lt;/li&gt;
  &lt;li&gt;In most organisations with 600 developers, the software is architected so not all 600 are editing the same parts of the codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;mixing-trunk-based-development-with-pull-request-workflow&quot;&gt;Mixing trunk-based development with pull request workflow&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do you have experience with a mixed model, where you do mostly trunk-based development, but sporadically accept pull requests from “untrusted developers”?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;we do that in our project, which consists of multiple squads. Whenever we make changes in other squad’s repos, we send them a pull request and ask for review, since we are not 100% familiar with their code&lt;/li&gt;
  &lt;li&gt;still, within a squad, we work trunk-based, since the committers are “trusted” team members&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;life-span-of-feature-branches&quot;&gt;Life span of feature branches&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;I would say, it all comes down to the question: how &lt;em&gt;long&lt;/em&gt; does your branch (change set, PR) live. If it is more than a couple of days, the more you diverge from trunk (and also the change set becomes larger and larger) – therefore you should aim for small and short lived PR&lt;/li&gt;
    &lt;li&gt;But the time is not the factor. It’s the amount of changed code that matters&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I agree to the short-living branches&lt;/li&gt;
  &lt;li&gt;I partially agree on the dependency on the size of the change, but at the end, the time is more crucial, since the more time passes the less the chance that the developer still knows what she did many days ago and hence there is a bigger effort to make the required changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;shifting-to-trunk-based-development&quot;&gt;Shifting to trunk-based development&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do you have a theory of why most people get so defensive about the feature-branch-based workflow (at least that’s my impression)? It seems to me that the benefits of trunk-based development have been very well-stated for long time, and well-suited for most (at least closed-source) situations already, but it is much less widespread than PRs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I think people are familiar with how they’ve learned to work. It’s very hard to change, especially when you see, as Michael is saying, there is so much other things you need to change in how you work. So it seems impossible, or silly, or unrealistic to many people. I remember before working in a team that really understood how to do TDD, I found it too hard to do. And I wasn’t sure if it was something people did in real life, or just a nice idea. Then I joined TW, and saw teams doing it for real, and it was mind-blowing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;trunk-based-development-and-qa&quot;&gt;Trunk-based development and QA&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Does manual QA have a place in this approach?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Yes, we have the role of a QA that does exploratory testing on the running software&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;How do you handle legal/industry regulations that require a formal review (more formal than PairProgramming) before comitting to main?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;we did not talk about this, but I would say that it often breaks down to traceability, i.e. connect a SW change to a requirement and provide test information and formal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;database-migrations-and-feature-toggles&quot;&gt;Database migrations and feature toggles&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;How would you handle database-migrations with feature-toggles? Especially when there are data-migrations wich can’t be reverted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;You need to split the DB-Change into 2 compatible DB-changes. First only add Elements and after feature toggle is changed in prod. 2 DB Change removing the not anymore used old elements. Typ-changes -&amp;gt; introduce new column in step 1 and trigger updating the new column. And in step 2 remove the old column and the trigger&lt;/li&gt;
  &lt;li&gt;generally you have to plan ahead for non-breaking changes, e.g. provide old features in parallel and phase them out after new features have been successfully introduced&lt;/li&gt;
  &lt;li&gt;The mind change for DB-developer is huge. As the goal for a for DB-developer was to have only a clean DB structure in Production. And the solution is here to  provide this intermediate DB-structure in Production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;kent-becks-test--commit--revert&quot;&gt;Kent Beck’s “test &amp;amp;&amp;amp; commit || revert”&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Another, maybe somewhat related, more extreme workflow - have you heard about &lt;a href=&quot;https://medium.com/@kentbeck_7670/test-commit-revert-870bbd756864&quot;&gt;Kent Beck’s “test &amp;amp;&amp;amp; commit || revert”&lt;/a&gt;
If yes, do you have any thoughts about it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;I personally didn’t know it, but thought, I’d link it here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;team-situations-around-trunk-based-development&quot;&gt;Team situations around trunk-based development&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;How would you handle the situation when you have head of dev who draws part of his identity from being a hard and pain in the a** reviewer and therefore hates TBD? Any idea of opening up someone like that to the idea?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;if someone draws their identity from being a pain ita, it might be really hard&lt;/li&gt;
  &lt;li&gt;someone recommended to better run&lt;/li&gt;
  &lt;li&gt;Trust is important. If your lead doesn’t trust the team that’s an issue :-/&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pair-programming-and-trunk-based-development&quot;&gt;Pair programming and trunk-based development&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pair programming is not an argument for tbd. You can do pair programming also on features. Reality is often more than one dev works on a feature branch&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;it’s the other way round - I would argue that pair programming is a prerequisite for TBD or at least makes it much easier / facilitates it. You can easily do pair programming with Merge Requests…&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Doesn’t convince me. From experience people are different, some like pp some not. With this you’re forcing people into one way of producing good code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;might also be a question of how you approach people in pair programming. I worked with many different “personalities” in a pair programming way and it requires some communication skills and lots of empathy to make everyone comfortable with it…&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;trunk-based-development-and-code-history&quot;&gt;Trunk-based development and code history&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;How its source code history affected with TBD in your experience? (rolling-back features, understanding an implementation without documentation, etc)&lt;/li&gt;
    &lt;li&gt;What would you say about the fact that the source control history gets scattered. Especially if you have serveral people working on different features on the same code base and commiting several times a day. Looking at the history you see a lot of commits. not necessarily connected to each other.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Is this just a question of tooling? Do you see that as an issue that it is harder to grasp the context of changes; does traceability suffer?&lt;/li&gt;
  &lt;li&gt;During the meetup we talked about how proper tooling makes it easier to group changes in your repository and link it to the underlying story.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;references-and-resources-mentioned-in-the-meetup&quot;&gt;References and resources mentioned in the meetup&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/michaellihs/presentations/blob/master/trunk-based-development/2021-01-21-meetup-trunk-based-development.pdf&quot;&gt;Slides from the meetup presentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://trunkbaseddevelopment.com/&quot;&gt;Trunk-based Development Website&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://infrastructure-as-code.com/book/2021/01/02/pull-requests.html&quot;&gt;Kief’s Blog Post on Pull Requests&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://martinfowler.com/bliki/DarkLaunching.html&quot;&gt;Martin Fowler on Dark Launching&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@kentbeck_7670/test-commit-revert-870bbd756864&quot;&gt;Kent Beck’s “test &amp;amp;&amp;amp; commit || revert”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://itrevolution.com/book/accelerate/&quot;&gt;Book “Accelerate”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 21 Jan 2021 21:55:29 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2021/01/21/q-and-a-trunk-based-development.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2021/01/21/q-and-a-trunk-based-development.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>git</category>
        
        <category>pipelines</category>
        
        <category>continuous integration</category>
        
        <category>continuous delivery</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>Curated Q&amp;As from &apos;Getting Started with Terraform Pipelines&apos;</title>
        <description>&lt;p&gt;Today, I had the pleasure of being the speaker for my very first ThoughtWorks meetup. The topic was “&lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart/events/270362303/&quot;&gt;Getting started with Terraform Pipelines&lt;/a&gt;” and due to the current (Corona) situation it was an online-only event. You can find the slides here: &lt;a href=&quot;https://github.com/michaellihs/meetup-2020-05-07-terraform-pipelines/blob/master/presentation.pdf&quot;&gt;https://github.com/michaellihs/meetup-2020-05-07-terraform-pipelines/blob/master/presentation.pdf&lt;/a&gt;. You can find a recording of the meetup in &lt;a href=&quot;https://thoughtworks.zoom.us/rec/play/uJJ-Ieiurjs3Et2R5QSDAKN5W421e6is03BKr_QLmBvmUHAKNAWgb7sUNOVa83V6iBUB9uQGKTwrSlvD?startTime=1588871295000&amp;amp;_x_zm_rtaid=Pjc_wM21RLaU-gQTQT2URA.1589190706190.7f88aeedbc3076729df9999c66bc8301&amp;amp;_x_zm_rhtaid=581&quot;&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post is a (curated) summary of the questions and answers that were written in the chat, since I think they contain a lot of things to be learned about Terraform and infrastructure as code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will you be doomed if state gets somehow lost? Can you recover from a state loss?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;you should store your state in a high durability place, such as S3&lt;/li&gt;
  &lt;li&gt;you are not exactly doomed, but close enough - &lt;a href=&quot;https://www.terraform.io/docs/import/index.html&quot;&gt;terraform import&lt;/a&gt; can help
    &lt;ul&gt;
      &lt;li&gt;Terraform gives the possibility to import existing ressources into a state&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;But there is no way to import all resources yet, it is per resource (at least last I checked)&lt;/li&gt;
  &lt;li&gt;not every resource can be imported&lt;/li&gt;
  &lt;li&gt;You should take care of import. If the provider is implemented badly it won’t help you very much&lt;/li&gt;
  &lt;li&gt;you can import existing infrastructure into a state&lt;/li&gt;
  &lt;li&gt;You should backup your state file aswell :-) maybe work with snapshots before/after apply&lt;/li&gt;
  &lt;li&gt;the &lt;a href=&quot;https://thorsten-hans.com/terraform-state-demystified&quot;&gt;state in the end is a JSON File&lt;/a&gt;. If everything else fails, things can fixed by editing the file and reuploading it, although this is a recipe for pain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does terraform give a graphical representation of the infra getting created like for e.g cloud formation designer provides?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;This &lt;a href=&quot;https://thorsten-hans.com/terraform-state-demystified&quot;&gt;blog post&lt;/a&gt; contains a tool that generates a graph from your Terraform infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What happens if resorces were changed outside terraform?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Terraform will change them back to what is described in the configuration
    &lt;ul&gt;
      &lt;li&gt;Sometimes this means destroying and re-creating a resource&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Followup question: What if your state loss happens because a state apply failed and you have an intermediate state? When a state apply fails because AWS rejects the request?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;terraform usually stores backup file while apply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do you persist the state then?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the state needs to be persisted in any case. Because if you don’t two different people applying terraform code would recreate resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On which service does terraform run on?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Important to mention it doesn’t run all the time - it’s not a service or something. It is a simple binary that can be run on any command line, e.g. run in a pipeline, makes changes and exits&lt;/li&gt;
  &lt;li&gt;like this, you can easily run it in any pipeline on any CI/CD server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is there a possibility to snapshot tf-state in a storage-account?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;for Azure: generally yes, see this &lt;a href=&quot;https://docs.microsoft.com/en-us/rest/api/storageservices/creating-a-snapshot-of-a-blob&quot;&gt;documentation&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;for Azure, there seems to be an &lt;a href=&quot;https://github.com/hashicorp/terraform/issues/18284&quot;&gt;open GitHub issue&lt;/a&gt; for this&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Recommendation for state version is to enable it on the remote storage, e.g. S3 supports versioning of files&lt;/li&gt;
  &lt;li&gt;terraform cloud is free for state storage as well&lt;/li&gt;
  &lt;li&gt;usage of Terraform cloud might be dependent on the privacy policies of your company / client though&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do changes to resources, which were triggered manually, affect the terraform state?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;if the resource was manually created, it is not represented in the Terraform state at all&lt;/li&gt;
  &lt;li&gt;if it was created by Terraform and then manually changed, the next Terraform apply will bring it back to the automatically created state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Which systems (providers) are supported by Terraform&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;These are the supported systems that Terraform can configure: https://www.terraform.io/docs/providers/index.html&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;tdd is kinda impossible with terraform&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://terratest.gruntwork.io/&quot;&gt;terratest&lt;/a&gt; is ok to use, but doesn’t help much in tdd&lt;/li&gt;
  &lt;li&gt;It depends on how you consider TDD, my team have written tests and then written the terraform to deploy working code to make the tests go green - this is out of scope of this talk but we have run talks on infra testing before and will again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Terraform vs. Pulumi - which is gaining more traction these days?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;terraform has a bigger offering of providers, pulumi is in very active development as well&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.pulumi.com/&quot;&gt;pulumi&lt;/a&gt; is gaining traction&lt;/li&gt;
  &lt;li&gt;if you are starting from scratch I would encourage to check both and see which one fits your use case better&lt;/li&gt;
  &lt;li&gt;My team have focused on Terraform as it’s a common language and tool set to work with Github, K8S and AWS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What does “Go for immutable infra” mean exactly? Other than a DB&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;a DB is the opposite of an immutable piece of infrastructure, since it mutates over time&lt;/li&gt;
  &lt;li&gt;immutable infra would be deploying infrastructure that is not changed until the next deployment. For instance, all the networking is based on the TF code reflecting the end state.&lt;/li&gt;
  &lt;li&gt;another example would be a serverless function or a container. You don’t update or patch it in place, you just replace it every time with a completely new instance when it gets deployed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What does it mean to split state? Is this an outcome of infra modularity?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;splitting state means that you have different state files for different parts of your infrastructure
    &lt;ul&gt;
      &lt;li&gt;e.g. this can mean that you have a different state file for each environment (DEV, TEST, PROD) or even for each service’s infrastructure&lt;/li&gt;
      &lt;li&gt;messing up state in a DEV environment does not effect PROD&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;should we split state for each environment?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;YES&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where do you run terraform code, in azure devops, azure container or azure shell, or local laptop?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;basically you can run it from every place that can run a go binary&lt;/li&gt;
  &lt;li&gt;For my team we run all terraform code in pipeline only, we do not run terraform locally at all and have not creds to do so. My team make an active choice to do this. Our CI is GoCD running in K8S containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is the concept of pipelines and stages applicable with other tools than Terraforn? E.g. with Ansible?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;yes, though the declarative nature of terraform tends to make describing the end state a bit easier&lt;/li&gt;
  &lt;li&gt;Ansible makes much more use of patching resources or configuration in place&lt;/li&gt;
  &lt;li&gt;This makes staging in general rather hard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It looks like your terraform code for many services is all in a single “infra” repo - was there any intentional decision to do this instead of putting the terraform scripts alongside the service code inside each services repository? What drove that decision?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;we had infrastructure in place that we needed to preserve. Starting with what we had and refactoring in small steps seemed like a good approach.&lt;/li&gt;
  &lt;li&gt;Generally you should split your infrastructure in smaller junks and test and apply them seperately&lt;/li&gt;
  &lt;li&gt;Still seperation can raise new issues, like dependencies and remote references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;do you use &lt;a href=&quot;https://www.runatlantis.io/&quot;&gt;atlantis&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We’ve just started using Atlantis - it’s nice :D&lt;/li&gt;
  &lt;li&gt;Not yet, we are considering it in the future&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do you use HachiCorp Vault for secrets or some parts of CI server for secrets?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Currently we are using K8S “secrets” we will be moving to AWS secrets store “soon” and then in a while we will be standing up vault&lt;/li&gt;
  &lt;li&gt;We are using the Azure keyvaults, but only use it for deployments, not for runtime, since it seems to be too slow for “real time access”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What’s the best place to version control infrastructure code, in repo with application code or in separate repo?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I think the answer is “it depends” and it also depends how tightly linked your code and infra are&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Did you discuss splitting state even more, e.g. one statefile per service? Why did you decide against it?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;we considered to do so, but agreed against as a first step, mainly to keep things simple and to have an easy orchestration of our bootstrapping process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;monorepo vs micro repos with code?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;see above: it depends on the use case&lt;/li&gt;
  &lt;li&gt;as a rule of thumb: smaller is better&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do you use tools like test &lt;a href=&quot;https://github.com/gruntwork-io/terratest&quot;&gt;terratest&lt;/a&gt;, &lt;a href=&quot;https://newcontext-oss.github.io/kitchen-terraform/&quot;&gt;kitchen-terraform&lt;/a&gt;, &lt;a href=&quot;https://www.terraform.io/docs/commands/validate.html&quot;&gt;validate&lt;/a&gt;? or some part of GoCD can help with testing?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;My team currently tests with &lt;a href=&quot;https://github.com/terraform-linters/tflint&quot;&gt;tflint&lt;/a&gt; and terraform validate, we have additional in pipeline tests to ensure resources are available and configured correctly.&lt;/li&gt;
  &lt;li&gt;We are also looking at &lt;a href=&quot;https://github.com/k1LoW/awspec&quot;&gt;awsspec&lt;/a&gt; for testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is there anyone who experienced with Jenkins for CI pipeline? How good is Jenkins about Terraform CI pipelining?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;works good&lt;/li&gt;
  &lt;li&gt;any CI tool can be used to be honest, though I’ve seen many centralized jenkins instances that are exceedingly hard to use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I see a lot of azure specific configuration? I was expecting something more platform independent so you can describe the state independent of where it is applied (Azure, AWS, etc)?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the examples were taken from Azure, since I am currently working with it&lt;/li&gt;
  &lt;li&gt;you cannot use Terraform to abstract the cloud provider API and it would make no sense, since the cloud resources strongly vary from provider to provider&lt;/li&gt;
  &lt;li&gt;Terraform scripts are always cloud specific&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have you looked at &lt;a href=&quot;https://github.com/gruntwork-io/terragrunt&quot;&gt;terragrunt&lt;/a&gt; at all? It can handle splitting and templating of environments. Well worth a look if it fits your needs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;+1 to terragrunt, can be used effectively to address some terraform pain points&lt;/li&gt;
  &lt;li&gt;Terragrunt is something that we are looking at next week to fix some of the pain of copy pasted variables&lt;/li&gt;
  &lt;li&gt;I think terragrunt will be obsolete in some time as tf adds those teatures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why not to split states down to each independent servece?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Why not split to each service: There are tons of interdependencies you can create between services and passing variables back and fourth becomes a PITA&lt;/li&gt;
  &lt;li&gt;My team uses both terraform data calls and terraform remote_state as data sources to pass information between small pieces of terraform code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;how “cloud specific” is the resulting terraform code? I’m asking since my team might have to e.g. provision k8s and other services on multiple cloud service providers.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;very specific, since resources change by clouds&lt;/li&gt;
  &lt;li&gt;The k8s terraform will apply to most versions of k8s, but different cloud providers provide different resources as Ashish says&lt;/li&gt;
  &lt;li&gt;The concepts however are always the same, resources / data objects same templating engine etc&lt;/li&gt;
  &lt;li&gt;If you want to create a kubernetes cluster, just take a look at the differences between the terraform resource “azurerm_kubenretes_cluster” and “google_container_cluster” … you have to handle ALL those differences yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;did you setup the pipeline(s) for terraform right away or after your infra reached a certain state?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;My team went straight to pipeline never ran it locally. But we where starting with a Greenfield setup and we had the opportunity to make a clear choice of pipelines only&lt;/li&gt;
  &lt;li&gt;We have sometimes needed to do interactive terraform but only a few times in the last 6 months. We do this from the CI/CDs agents&lt;/li&gt;
  &lt;li&gt;We actually tag all our infra with the unique pipeline ID as well so we can trace AWS -&amp;gt; pipeline -&amp;gt; code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where/how do you publish the various terraform packages?  Is it just pushing a docker image to a registry every time?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;For modules, you can run a &lt;a href=&quot;https://www.hashicorp.com/blog/hashicorp-terraform-module-registry/&quot;&gt;terraform registry&lt;/a&gt; or just use git but we are not at this stage yet&lt;/li&gt;
  &lt;li&gt;when it comes to the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/?view=azure-devops&quot;&gt;Azure DevOps pipelines&lt;/a&gt;, you can use the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&amp;amp;tabs=yaml&quot;&gt;pipeline artifacts&lt;/a&gt; to store the packages. But those are not (only) modules, but also binaries, scripts and Terraform plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do you build the pipeline itself? Also with terraform?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We actually use yaml to define them in git and then have good sutopull them&lt;/li&gt;
  &lt;li&gt;There is a &lt;a href=&quot;https://github.com/beamly/terraform-provider-gocd&quot;&gt;GoCD terraform provider&lt;/a&gt; but it’s a little trickier to automate for us&lt;/li&gt;
  &lt;li&gt;We’ve actually created AWS CodePipelines with Terraform, which then later runs Terraform.. works&lt;/li&gt;
  &lt;li&gt;we build pipelines with terraform using &lt;a href=&quot;https://aws.amazon.com/codepipeline/&quot;&gt;aws codepipeline&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/codebuild/&quot;&gt;codebuild&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Currently the &lt;a href=&quot;https://github.com/microsoft/terraform-provider-azuredevops&quot;&gt;Azure DevOps Terraform provider&lt;/a&gt; is being developed. So for the moment it is not stable and a lot of resources within Azure DevOps unfortunately can’t be terraformed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Can we elaborate more on why “the download terraform package” is needed in every stage?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;In &lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;Gitlab CI/CD&lt;/a&gt; you can use &lt;a href=&quot;https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html&quot;&gt;“artifacts”&lt;/a&gt; to store the package…&lt;/li&gt;
  &lt;li&gt;we do this, since many modern CI servers have stateless stages. This means that if you want to pass anything in between stages, you have to persist it to some external storage on the producing stage and then restore it again on the consuming stage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What if the “test” stage in prod fails?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;That’s an interesting question Steffen, and your team should decide if it’s an alert etc&lt;/li&gt;
  &lt;li&gt;we don’t have any automated rollback in place and it might be hard to achieve with infrastructure code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When automating terraform plan/apply in a pipeline (no manual approval), do you put any restrictions on? (i.e. don’t automatically apply if there are any destroy’s in the plan)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;since we went with a gated approach, we don’t do this&lt;/li&gt;
  &lt;li&gt;using locks might be a step in this direction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Are you running the pipeline from non-master branches? If, what happens there?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We always run from master&lt;/li&gt;
  &lt;li&gt;At ThoughtWorks, we have a strong opinion on branches and mostly go for trunk-based development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;do you run azure rm templates from teraform/terragrunt?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;sorry, I have no ideas what this is&lt;/li&gt;
  &lt;li&gt;so there is a way to provision resources via powershell modules/integration with UI via Azure resource templates (similar to cloudformation on AWS), when you develope infrastrcuture with teraform you are not always have chnages from Azure in modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do you know which version or git commit of the terraform scripts was used to build the current prod?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We tag things with the pipeline ID which is made up of the git short hash + pipeline run count&lt;/li&gt;
  &lt;li&gt;We also do some AWS tricks to have the pipeline ID embedded in the AWS role assume process that we use&lt;/li&gt;
  &lt;li&gt;Most CI systems provide the commit hash of the repository for the current build. I.e. you can just tag a revision with the date and environment it’s been deployed to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For “proper” unit testing with all dependencies in memory, it’s looking compelling on prem by combining Terraform with the golang vCenter &lt;a href=&quot;https://github.com/vmware/govmomi/tree/master/vcsim&quot;&gt;vcsim&lt;/a&gt; tool where you can replicate a vCenter set of resources locally. Is anyone aware of such simulation tools for any of the public clouds?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;There are some AWS stub tools, I’ve never looked at them&lt;/li&gt;
  &lt;li&gt;take a look at &lt;a href=&quot;https://github.com/localstack/localstack&quot;&gt;localstack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What exactly caused your complete infra outage?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Basically applying a new resource against a new (wrong) terraform state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How are you guys managing state migrations? For example, I want to rename a module? I want to rename a module &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;module.x.something&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;module.y.something&lt;/code&gt;. We’ve always had to do this “by hand” before our pipeline runs with terraform state mv. Any hints on how to get this in a pipeline in a “migrations”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.terraform.io/docs/commands/state/mv.html&quot;&gt;tf state mv&lt;/a&gt; works well&lt;/li&gt;
  &lt;li&gt;terraform state mv works fine, but its always outside of our pipeline. We are adding it to our PRs right now to say “Hey, before we merge this PR into environment, do these state moves”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But how to “terraform state..” when you don’t have access to the state / infra, because only your CI has&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;i did it manually, not in ci&lt;/li&gt;
  &lt;li&gt;that then, of course, breaks the concept of only CI has access&lt;/li&gt;
  &lt;li&gt;use a temporary one-off pipeline to do such renaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;what about rollbacks with terraform?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;no answers provided&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 07 May 2020 21:55:29 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2020/05/07/q-and-a-terraform-pipelines.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2020/05/07/q-and-a-terraform-pipelines.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>terraform</category>
        
        <category>pipelines</category>
        
        <category>continuous integration</category>
        
        <category>continuous delivery</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>Lessons learned from 2 Remote Meetups</title>
        <description>&lt;p&gt;During the last 3 weeks, we had 2 remote meetups from our &lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart&quot;&gt;DevOps Stuttgart meetup group&lt;/a&gt;. I admit that this doesn’t make us experts for this format (yet), but still there were some learnings, I want to share with you.&lt;/p&gt;

&lt;h3 id=&quot;keep-it-interactive&quot;&gt;Keep it interactive&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;use the chat (Zoom has one, YouTube has one, Google Meet has one)&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ask questions to be answered by the audience via chat&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;start with the question where your audience comes from&lt;/li&gt;
      &lt;li&gt;prepare some quick polls on the topic of your presentation&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;have some “virtual social time” after the presentation&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;many people might leave the call after the presentation ends, but it’s worth having a discussion / some social time with those who stay&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;if the presenter answers a question, ask the questioner whether his question has been answered (via chat)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;ask for feedback and improvement towards the end of your meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;keep-it-simple&quot;&gt;Keep it simple&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;do not use multiple chat channels within the same meetup&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;at the beginning, we had YouTube, Meet and Slack - that was to much to keep track of&lt;/li&gt;
      &lt;li&gt;use a single chat channel (e.g. Zoom chat or whatever is closest to your conferencing tool)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dedicated-moderator&quot;&gt;Dedicated Moderator&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;help the presenter to focus on the presentation and the talk&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;collect questions that come up on the chat&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;write them down on a document and try to cluster / order them before asking the presenter&lt;/li&gt;
      &lt;li&gt;use questions every now and then to make the presentation more interactive&lt;/li&gt;
      &lt;li&gt;answer the people asking questions that you got their question and they’ll have a chance to ask it later on&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;if your meeting is hi-jacked, remove unwanted people from the call&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;avoid-zoom-bombing&quot;&gt;Avoid Zoom Bombing&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;unless you want unpleasant interruptions during your presenation, don’t publicly share your Zoom links&lt;/li&gt;
  &lt;li&gt;use passwords for your Zoom sessions and share them via meetup messages sent to your participants&lt;/li&gt;
  &lt;li&gt;as a host: start sharing your screen the moment you start the zoom call to avoid others share unwanted content&lt;/li&gt;
  &lt;li&gt;make at least one other participant a (co) host of the meeting, to enable others to handle “unwanted guests” and mute / unmute others&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dont-be-afraid-of-virtual-discussions&quot;&gt;Don’t be afraid of virtual Discussions&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;at the beginning we were afraid of too many unmuted people joining the discussion&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;experience shows: there is no need to be afraid, fewer people will talk / ask questions then during usual meetups&lt;/li&gt;
      &lt;li&gt;embrace participation and questions from your audience&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;do-it---its-a-great-experience&quot;&gt;Do it - it’s a great Experience!&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Even though we ran into some issues, the overall experience of doing remote meetups was great!&lt;/li&gt;
  &lt;li&gt;Don’t hesitate to bring your meetups online - there are new learning opportunities!&lt;/li&gt;
  &lt;li&gt;The overall perception of the audience was quite positive and we had a better now-show rate than with our last “real meetup”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope this helps to get you started and motivates you to start your own virtual meetups!&lt;/p&gt;

&lt;p&gt;Please share feedback and your own lessons learned :)&lt;/p&gt;
</description>
        <pubDate>Mon, 06 Apr 2020 21:55:29 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2020/04/06/remote-meetups-lessons-learned.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2020/04/06/remote-meetups-lessons-learned.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>remote</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>DevOps Meetup Stuttgart: Remote Working</title>
        <description>&lt;p&gt;This is a short summary of our &lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart/events/269405432/&quot;&gt;DevOps Stuttgart Meetup from March 19th&lt;/a&gt; about remote working. This time we had several speakers presenting in small slots of about 10 - 15 minutes each. For the first time, we streamed the meetup via YouTube while organizing it in Google Meet.&lt;/p&gt;

&lt;p&gt;We started with &lt;a href=&quot;https://twitter.com/derBroBro&quot;&gt;Malte&lt;/a&gt; talking about how ZOI became a cloud-first company and how they leverage remote work with using SaaS solutions. Malte also gave a short summary of how ZOI recently helped other companies to move their business operations into the cloud.&lt;/p&gt;

&lt;p&gt;Afterwards, I did a short presentation on pair programming and especially the challenges when doing it remotely. Summary:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;not only applicable for coding&lt;/li&gt;
  &lt;li&gt;see it as a chance&lt;/li&gt;
  &lt;li&gt;be patient&lt;/li&gt;
  &lt;li&gt;think out loud, express your thoughts clearly&lt;/li&gt;
  &lt;li&gt;rotate roles &amp;amp; rotate pairs&lt;/li&gt;
  &lt;li&gt;take breaks&lt;/li&gt;
  &lt;li&gt;do research individually&lt;/li&gt;
  &lt;li&gt;don’t continue working on a pair project after working hours&lt;/li&gt;
  &lt;li&gt;collect feedback and adapt ways of working if necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/lena-konstantynova/&quot;&gt;Lena&lt;/a&gt; from ThoughtWorks was sharing some remote working practices with us. She explained what basic requirements (e.g. on the hardware side) need to be fulfilled to be successful while working remotely. She also presented some team rituals that her team recently introduced:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stand-Up to start the day, Stand-Down to seize the day - especially: no work on the project after Stand-Down&lt;/li&gt;
  &lt;li&gt;Take scheduled breaks, setup an alarm, make sure to drink enough, &lt;a href=&quot;https://en.wikipedia.org/wiki/Pomodoro_Technique&quot;&gt;pomodoro technique&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Take care of mental health of your team members
    &lt;ul&gt;
      &lt;li&gt;regular (virtual) coffee / tea time&lt;/li&gt;
      &lt;li&gt;lunches together online&lt;/li&gt;
      &lt;li&gt;open walk-in room (video conferencing room)&lt;/li&gt;
      &lt;li&gt;regular feedback&lt;/li&gt;
      &lt;li&gt;(online) game playing together&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last prepared part of the meetup was presented by [Marcus}(https://twitter.com/mcasviper). He talked about how &lt;a href=&quot;https://github.com/tmux/tmux/wiki&quot;&gt;tmux&lt;/a&gt;. tmux is a swiss army knife for enhancing your terminal, e.g. by splitting your terminal screen, keeping sessions running while logging off from a server. Or - with connection to our topic - by &lt;a href=&quot;https://www.redhat.com/sysadmin/ssh-tmux-screen-sharing&quot;&gt;sharing terminal sessions&lt;/a&gt; with other people. Quite a while ago, I created a &lt;a href=&quot;https://gist.github.com/michaellihs/b6d46fa460fa5e429ea7ee5ff8794b96&quot;&gt;tmux cheat sheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some of the questions being asked during the meetup:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;whats your opinion on ms 365/teams as a cloud solution&lt;/li&gt;
  &lt;li&gt;​Can you really compensate human work interaction by (online) gaming?&lt;/li&gt;
  &lt;li&gt;Have you established a morning / afternoon routine, to connect to each other?
    &lt;ul&gt;
      &lt;li&gt;Morgenkreis, where you meet with your kids in a video call, before you start your (working) day&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​do you have daily online meeting, like scrum meeting? If yes, how many times do you meeting - once/twice during a day?
    &lt;ul&gt;
      &lt;li&gt;Michael’s team: one standup / daily, 15 min&lt;/li&gt;
      &lt;li&gt;Lena’s team: one Stand-Up and one Stand-down. No work to be done after Stand-down&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​I mean are you only talking about this crisis or about working remote on a regular basis?&lt;/li&gt;
  &lt;li&gt;​Do you use special tools for remote pairing like &lt;a href=&quot;https://floobits.com/&quot;&gt;floobits&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;​can you share some useful tools for working remotely with team?
    &lt;ul&gt;
      &lt;li&gt;see list below&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​Sounds a lot that the The Five Dysfunctions of a Team has to be solved before pair programming.
    &lt;ul&gt;
      &lt;li&gt;This is best done in person, but do you also do this remote.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​Any tips on how to counterbalance uneven power dynamics between pair progr. peers? a shy person might be inclined to give more space to the other person even though he/her has more to contribute.
    &lt;ul&gt;
      &lt;li&gt;I would recommend regular feedback and adapting your ways of working and communication. This might be rather a task for the more extrovert, but make sure to give space ​for the more silent people to express themselves&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​Lena, did you have “stand down” before you started working remotely?
    &lt;ul&gt;
      &lt;li&gt;Nope&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;​How do you handle topic like knowledge base? dedicated application? shared drive?
    &lt;ul&gt;
      &lt;li&gt;Confluence or other wikis, READMEs if it belongs to a code base&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some more facts about the meetup:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;up to 80 people in the stream&lt;/li&gt;
  &lt;li&gt;lively discussion on YouTube, Slack and Google Meet&lt;/li&gt;
  &lt;li&gt;participants from Karlsruhe, Berlin, Reutlingen, Allgaeu, Ludwigsburg, Ehningen, Echterdingen, Oberaichen, Stuttgart, Gerlingen, ​Landau - Pfalz, Degerloch, Texas, ​Kiyv, Deizisau, Moscow, Magstadt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find the &lt;a href=&quot;https://docs.google.com/presentation/d/1mis0n2xcbZG6736drcock18lJ1-hm0bZwQu7z7o_lLo/edit?usp=sharing&quot;&gt;slides to our presentations here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Suggested Tools:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://meet.jit.si&quot;&gt;http://meet.jit.si&lt;/a&gt; - video conferencing&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://awwapp.com/&quot;&gt;https://awwapp.com/&lt;/a&gt; - online whiteboard app&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.atlassian.com&quot;&gt;https://www.atlassian.com&lt;/a&gt; - Atlassian Suite - Agile planning and Wiki&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://trello.com&quot;&gt;https://trello.com&lt;/a&gt; Agile (team) boards&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/services/devops/&quot;&gt;https://azure.microsoft.com/en-us/services/devops/&lt;/a&gt; Azure DevOps - Full-stack toolsuite for agile software development&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.retrium.com&quot;&gt;http://app.retrium.com&lt;/a&gt; - online retrospectives&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://funretro.io/&quot;&gt;https://funretro.io/&lt;/a&gt; - online retrospectives&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://scrumlr.io/&quot;&gt;https://scrumlr.io/&lt;/a&gt; - online retrospectives&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://miro.com/&quot;&gt;https://miro.com/&lt;/a&gt; - online whiteboard&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mural.co/&quot;&gt;https://mural.co/&lt;/a&gt; - online whiteboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Further References:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/remote-work-playbook&quot;&gt;ThoughtWorks Remote Working Handbook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://about.gitlab.com/company/culture/all-remote/guide/&quot;&gt;GitLab Remote Working Guide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackoverflow.blog/2020/03/12/working-from-home-tips-from-our-experienced-remote-employees/&quot;&gt;Stackoverflow on working from home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 19 Mar 2020 21:55:29 +0000</pubDate>
        <link>http://michaellihs.github.io/meetup/2020/03/19/meetup-remote-working.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/meetup/2020/03/19/meetup-remote-working.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>remote working</category>
        
        <category>work from home</category>
        
        
        <category>meetup</category>
        
      </item>
    
      <item>
        <title>DevOps Meetup Stuttgart: Automated Security Testing in Continuous Integration</title>
        <description>&lt;p&gt;This is a short summary of our &lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart/events/268094799/&quot;&gt;DevOps Stuttgart Meetup from March 5th&lt;/a&gt; about automated security testing in Continuous Integration. For the meetup we had &lt;a href=&quot;https://twitter.com/CYxChris&quot;&gt;Christian Kühn&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/indyarni&quot;&gt;Arnold Franke&lt;/a&gt; from &lt;a href=&quot;https://synyx.de/&quot;&gt;Synyx&lt;/a&gt; with us as speakers.&lt;/p&gt;

&lt;p&gt;Chris started the presentation with a question who is currently running security tests in their pipelines and I was surprised by the majority of hands being raised. Also it seems like nowadays more then half of the audience is running production workloads in containers.&lt;/p&gt;

&lt;p&gt;For motivating the topic of security testing, we’ve been introduced to a recent &lt;a href=&quot;https://www.synopsys.com/blogs/software-security/equifax-apache-struts-vulnerability-cve-2017-5638/&quot;&gt;security incident at Euquifax&lt;/a&gt;, where a huge amount of private data (i.e. social security numbers and credit card data) leaked, due to a non-patched Java library. The point is that this incident could have been avoided with proper scanning of dependencies and timely patching.&lt;/p&gt;

&lt;p&gt;Afterwards the presentation mainly covered the following topics:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How security is treated in many software projects, a.k.a. “I am a developer, leave me alone with your security stuff, we have a team / specialists for that”&lt;/li&gt;
  &lt;li&gt;Short introduction to &lt;a href=&quot;https://owasp.org/www-project-top-ten/&quot;&gt;OWASP Top 10&lt;/a&gt; and the &lt;a href=&quot;https://nvd.nist.gov/vuln/full-listing&quot;&gt;CVE database&lt;/a&gt; from NIST
    &lt;ul&gt;
      &lt;li&gt;TOP 9 is &lt;em&gt;Using Components with known vulnerabilities&lt;/em&gt; which we took a closer look at&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dependency scanning&lt;/strong&gt; with a &lt;a href=&quot;https://github.com/cy4n/broken&quot;&gt;“broken” Spring Boot&lt;/a&gt; app as an example
    &lt;ul&gt;
      &lt;li&gt;showing that even the simplest Spring Boot application has &amp;gt; 50 transitive dependencies&lt;/li&gt;
      &lt;li&gt;so a first important learning of the evening was do not only take care of the code you write, but &lt;strong&gt;know your dependencies&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Introduce &lt;strong&gt;security scans in pipelines&lt;/strong&gt; - with an example of how this can look like in Jenkins
    &lt;ul&gt;
      &lt;li&gt;distinguish between broken builds and &lt;strong&gt;unstable builds&lt;/strong&gt;. Reason for this is to still be able to ship your artifacts with having vulnerable dependencies in them - as long as you work around the issue within your code.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Whitelisting depenendencies&lt;/strong&gt; in dependency security scans allows you to mute findings in your dependencies if they do not impact your artifact (e.g. vulnerabilities in a library that only impact your application when you use a certain feature)&lt;/li&gt;
      &lt;li&gt;presented &lt;strong&gt;tool for security scans&lt;/strong&gt; was &lt;a href=&quot;https://owasp.org/www-project-dependency-check/&quot;&gt;OWASP Dependency Check&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;other tools of interest might be &lt;a href=&quot;https://snyk.io/&quot;&gt;snyk&lt;/a&gt;, GitHub offers &lt;a href=&quot;https://help.github.com/en/github/managing-security-vulnerabilities/about-security-alerts-for-vulnerable-dependencies&quot;&gt;security scanning for free&lt;/a&gt; on open source projects&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;What are the security-related issues with using Docker images
    &lt;ul&gt;
      &lt;li&gt;Docker images are often based on other images, hard to track versions, if using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:latest&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;base images are maintained by the community and are usually patched properly&lt;/li&gt;
      &lt;li&gt;custom intermediate images are often problematic since people tend to forget about them&lt;/li&gt;
      &lt;li&gt;widely used anti-pattern: we have nightly builds of our software and application images but forget to patch intermediate images&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Container Scanning&lt;/strong&gt; - scans Docker images for known vulnerabilities
    &lt;ul&gt;
      &lt;li&gt;presented &lt;strong&gt;tool for container / image scanning&lt;/strong&gt; &lt;a href=&quot;https://github.com/quay/clair&quot;&gt;CoreOS Clair&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;there is a Docker image to run clair on demand &lt;a href=&quot;https://github.com/arminc/clair-local-scan&quot;&gt;clair-local-scan&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;it is challenging to figure out, which vulnerabilities are critical for you&lt;/li&gt;
      &lt;li&gt;there is &lt;strong&gt;another tool for scanning images&lt;/strong&gt; &lt;a href=&quot;https://github.com/aquasecurity/trivy&quot;&gt;trivy&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;hint: run tests in multiple vulnerability testing tools and check which findings are relevant for you&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;scan your applications endpoints in an &lt;strong&gt;API Scanner&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;presented tool for automated penetration tests for APIs is &lt;a href=&quot;https://owasp.org/www-project-zap/&quot;&gt;OWASP ZAP&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;how it works is that a spider first of all generates a list of endpoints for your API that is then passed on to a penetration test&lt;/li&gt;
      &lt;li&gt;you can also feed your &lt;strong&gt;Open API definition&lt;/strong&gt; in a &lt;a href=&quot;https://swagger.io/specification/&quot;&gt;Swagger&lt;/a&gt; format to make the tool aware of your actual endpoints&lt;/li&gt;
      &lt;li&gt;by looking at the tests ZAP is running against your app &lt;strong&gt;you can already learn a lot about application security&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So in summary, we learned how to add 3 new stages to our Build Pipeline which are&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Security checking of dependencies&lt;/li&gt;
  &lt;li&gt;Vulnerability scanning for Docker images&lt;/li&gt;
  &lt;li&gt;Penetration testing your (REST) API in the running application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;and about the challenges with properly using the three tools and their findings.&lt;/p&gt;

&lt;p&gt;After the presentation, someone mentioned &lt;a href=&quot;https://owasp.org/www-project-securecodebox/#&quot;&gt;OWASP Secure Codebox&lt;/a&gt; as another tool you might want to take a look at.&lt;/p&gt;

&lt;p&gt;The lively discussion after the presentation showed that it was very well received by the audience. We hope to have further security topics in our &lt;a href=&quot;https://www.meetup.com/de-DE/devops-stuttgart/&quot;&gt;DevOps Stuttgart Meetup&lt;/a&gt; in the near future. If you want to give a talk, feel free to reach out to me any time.&lt;/p&gt;

&lt;p&gt;Here’s the &lt;a href=&quot;https://www.slideshare.net/ChristianKhn8/automated-security-testing-in-continuous-integration&quot;&gt;link to the slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A big Thank You! goes to the team at &lt;a href=&quot;https://www.zoi.de/&quot;&gt;ZOI&lt;/a&gt; and especially &lt;a href=&quot;https://twitter.com/derBroBro&quot;&gt;Malte&lt;/a&gt; who provided a pleasant location and food and drinks.&lt;/p&gt;
</description>
        <pubDate>Thu, 05 Mar 2020 21:55:29 +0000</pubDate>
        <link>http://michaellihs.github.io/continuous/integration/2020/03/05/meetup-security-continuous-integration.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/continuous/integration/2020/03/05/meetup-security-continuous-integration.html</guid>
        
        <category>meetup</category>
        
        <category>devops</category>
        
        <category>continuous integration</category>
        
        <category>security</category>
        
        
        <category>continuous</category>
        
        <category>integration</category>
        
      </item>
    
      <item>
        <title>Set iTerm badges from command line</title>
        <description>&lt;p&gt;When working with multiple terminal windows, it is sometimes useful to have some kind of heading that indicates what each terminal contains. During our last showcase, we used this to let the audience know what each of our three terminal windows is showing.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/iterm/iterm-badges.png&quot; alt=&quot;iterm badges&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is a short tutorial on how to set this up, so that you can set the badge easily from the command line. We assume that you are using &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm&lt;/a&gt; on a Mac.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Install the &lt;a href=&quot;https://iterm2.com/documentation-shell-integration.html&quot;&gt;iTerm shell integration&lt;/a&gt; - if you are using bash, here is all you need to run&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; https://iterm2.com/shell_integration/install_shell_integration.sh | bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;this will add some includes into your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.bash_profile&lt;/code&gt;. The website contains explanations for other shells as well (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zsh&lt;/code&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Add the following function to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.bash_profile&lt;/code&gt; (or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.zshrc&lt;/code&gt;)&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;function &lt;/span&gt;iterm2_print_user_vars&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    iterm2_set_user_var badge &lt;span class=&quot;nv&quot;&gt;$badge&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;thereby you set a iTerm user var &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;badge&lt;/code&gt; that reads the content from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$badge&lt;/code&gt; shell variable.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;reload your shell profile via&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;In your iTerm profile settings, set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\(user.badge)&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/assets/images/iterm/iterm-badge-settings.png&quot; alt=&quot;iTerm profile settings for the badge&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You can now set your badge in your terminal via&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;badge&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;hello badge&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;img src=&quot;/assets/images/iterm/iterm-badge.png&quot; alt=&quot;set badge in terminal&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have fun!&lt;/p&gt;

&lt;h2 id=&quot;further-references&quot;&gt;Further References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;https://technology.customink.com/blog/2016/07/18/how-to-add-badges-to-iterm2/&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 07 Feb 2020 20:00:00 +0000</pubDate>
        <link>http://michaellihs.github.io/iterm/2020/02/07/iterm-badges.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/iterm/2020/02/07/iterm-badges.html</guid>
        
        <category>iterm</category>
        
        <category>mac</category>
        
        <category>shell</category>
        
        
        <category>iterm</category>
        
      </item>
    
      <item>
        <title>Socat and Docker</title>
        <description>&lt;p&gt;Recently, I learned how to use &lt;a href=&quot;https://linux.die.net/man/1/socat&quot;&gt;socat&lt;/a&gt; to monitor the network traffic between the Docker CLI and the Docker host. This works by proxying the communication via socat and sending all traffic to stdout. Here is how it works for either Unix sockets or TCP sockets.&lt;/p&gt;

&lt;h2 id=&quot;installing-socat-on-mac&quot;&gt;Installing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;socat&lt;/code&gt; on Mac&lt;/h2&gt;

&lt;p&gt;If you are running on a Mac, you first need to install &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;socat&lt;/code&gt; - easiest done via Homebrew&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;socat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;monitoring-traffic-with-unix-socket&quot;&gt;Monitoring traffic with Unix socket&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;assuming we have the Docker daemon listening on a Unix socket &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/run/docker.sock&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Open a first terminal and run&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;socat &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; UNIX-LISTEN:/tmp/docker.sock,fork UNIX-CONNECT:/var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;now open a second terminal and run&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; unix:///tmp/docker.sock ps &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You will see all HTTP traffic between the Docker CLI and the daemon in the first terminal.&lt;/p&gt;

&lt;h2 id=&quot;monitoring-traffic-using-tcp-socket&quot;&gt;Monitoring traffic using TCP socket&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;assuming we have the Docker daemon listening on a TCP socket &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;127.0.0.1:1234&lt;/code&gt;&lt;/p&gt;

  &lt;p&gt;if you don’t have the Docker daemon listening to a TCP socket, you can first “simulate” this via&lt;/p&gt;

  &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /var/run/docker.sock:/var/run/docker.sock &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 127.0.0.1:1234:1234 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;

  &lt;p&gt;this will make the Docker daemon listen on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;127.0.0.1:1234&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Open a first terminal and run&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;socat &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; TCP-LISTEN:2345 TCP4:127.0.0.1:1234
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;now open a second terminal and run&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; 127.0.0.1:2345 ps &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again, you will see all traffic between the Docker CLI and the Docker daemon in the first terminal.&lt;/p&gt;

&lt;h2 id=&quot;further-references&quot;&gt;Further References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://linux.die.net/man/1/socat&quot;&gt;socat man page&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@copyconstruct/socat-29453e9fc8a6&quot;&gt;great blog post on socat by Cindy Sridharan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 02 Jan 2020 20:00:00 +0000</pubDate>
        <link>http://michaellihs.github.io/docker/2020/01/02/socat-docker.html</link>
        <guid isPermaLink="true">http://michaellihs.github.io/docker/2020/01/02/socat-docker.html</guid>
        
        <category>docker</category>
        
        <category>linux</category>
        
        
        <category>docker</category>
        
      </item>
    
  </channel>
</rss>
