<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hendrik Haandrikman 🚀</title>
    <description>The latest articles on DEV Community by Hendrik Haandrikman 🚀 (@hhaandr).</description>
    <link>https://dev.to/hhaandr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F95645%2F9ab08cd1-751d-4e6e-aa1e-0f56d6c3af7a.jpg</url>
      <title>DEV Community: Hendrik Haandrikman 🚀</title>
      <link>https://dev.to/hhaandr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hhaandr"/>
    <language>en</language>
    <item>
      <title>Migrating to Google Play Billing Library 5</title>
      <dc:creator>Hendrik Haandrikman 🚀</dc:creator>
      <pubDate>Fri, 25 Nov 2022 16:06:47 +0000</pubDate>
      <link>https://dev.to/hhaandr/migrating-to-google-play-billing-library-5-1na4</link>
      <guid>https://dev.to/hhaandr/migrating-to-google-play-billing-library-5-1na4</guid>
      <description>&lt;p&gt;At &lt;a href="https://io.google/2022/program/e1fe8007-7338-4e33-814b-ecbfcb706c5e/"&gt;Google I/O 2022&lt;/a&gt;, the Google Play Team presented Google Play Billing Library 5.0 – the newest version of its in-app billing and subscriptions library.&lt;/p&gt;

&lt;p&gt;In this post, we'll go through some of the main steps you need to take to migrate your Android app from Google Play Billing Library 4 to PBL5.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is an excerpt of a post first published on the RevenueCat blog, where you'll find more information on &lt;a href="https://www.revenuecat.com/blog/engineering/google-play-billing-library-5-0/"&gt;Google Play Billing Library 5&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also, the cover image is what DALL·E makes of the prompt "A cat hugging the Google Play logo"&lt;/em&gt; 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Highlights of a Google Play Billing Library 4 to 5 migration
&lt;/h2&gt;

&lt;p&gt;If you’re not using RevenueCat for &lt;a href="https://www.revenuecat.com/blog/engineering/android-in-app-subscriptions-tutorial/"&gt;Android in-app subscriptions&lt;/a&gt;, migrating from PBL4 to 5 involves multiple steps. We’ll share the highlights and most important changes you’ll need to make here, but you’ll find more details in Google’s integration &lt;a href="https://developer.android.com/google/play/billing/integrate"&gt;guide&lt;/a&gt;, and billing specific &lt;a href="https://github.com/android/play-billing-samples"&gt;samples on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a product catalog
&lt;/h3&gt;

&lt;p&gt;Google recommends creating new products using the updated entity structure of Google Play Billing Library 5 before migrating your app. You can do this by consolidating the duplicate products that represent the same subscription benefits with different configurations of price, duration, etc.&lt;br&gt;
This is the recommended first step as editing converted subscription products can result in issues with older versions of your app that still use PBL4 and deprecated methods like &lt;code&gt;querySkuDetailsAsync()&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Managing your catalog with the new API
&lt;/h3&gt;

&lt;p&gt;If you manage your subscriptions automatically with the Developer API, there are three new endpoints to be aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Monetization.subscriptions&lt;/code&gt; to manage subscription products&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Monetization.subscrtipions.basePlans&lt;/code&gt; to manage base plans for your subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Monetization.subscrtipions.basePlans.offers&lt;/code&gt; to manage the offers associated with your base plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything but one-time purchases, these new endpoints should be used via the &lt;code&gt;Subscription Publishing&lt;/code&gt; API. Your one-time purchases will still be managed via the &lt;code&gt;inappproducts API&lt;/code&gt; previously used for subscriptions as well.&lt;/p&gt;
&lt;h3&gt;
  
  
  Updating the Billing Library dependency
&lt;/h3&gt;

&lt;p&gt;Created your new products? You can now migrate your app by updating your Play Billing Library dependency in your &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    def billingVersion = "5.1.0"

    implementation "com.android.billingclient:billing:$billingVersion"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that on October 31st of 2022, &lt;a href="https://developer.android.com/google/play/billing/release-notes#5-1"&gt;Google released&lt;/a&gt; the Google Play Billing Library 5.1, which – if you’re implementing PBL5 now – should be the version you’re using.&lt;/p&gt;

&lt;h3&gt;
  
  
  Showing available products
&lt;/h3&gt;

&lt;p&gt;Because we’ve switched from SKUs to Products, the calls required to show eligible offers have changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;BillingClient.querySkyDetailsAsync()&lt;/code&gt; with &lt;code&gt;BillingClient.queryProductDetailsAsync()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;SkuDetailsParams&lt;/code&gt; with &lt;code&gt;QueryProductDetailsParams&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Query results have gone from &lt;code&gt;SkuDetails&lt;/code&gt; to &lt;code&gt;ProductDetails&lt;/code&gt;, showing you information about the product (title, type, ID, etc), similar to before. New is &lt;code&gt;List&amp;lt;ProductDetails.SubscriptionOfferDetails&amp;gt;&lt;/code&gt;, which contains the available offers for a specific user. Note that – unlike in PBL4 – you’ll be able to see several different offers for the same subscription period. In some cases, Google will handle eligibility, but in other cases, you’re able to define which offers show up in the paywall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: If you’re showing a personalized offer as determined by Art. 6 (1) (ea) CRD of the &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex%3A32011L0083"&gt;Consumer Rights Directive (2011/83/EU)&lt;/a&gt; to a user in the EU, you’re required to disclose this via the Play UI. To do this, customize &lt;code&gt;setIsOfferPersonalized()&lt;/code&gt; with &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, depending on the offers shown to your user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Launching the purchase flow
&lt;/h3&gt;

&lt;p&gt;There are very few changes here, beyond going from SKUs to offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ProductDetailsParams&lt;/code&gt; instead of &lt;code&gt;SkuDetails&lt;/code&gt; for &lt;code&gt;BillingFlowParams&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;SubscriptionOfferDetails&lt;/code&gt; to get offer ID, base plan ID and other offer details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll then pass the &lt;code&gt;offerToken&lt;/code&gt; for a selected offer into the &lt;code&gt;ProductDetailsParams&lt;/code&gt; object to purchase a product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processing purchases
&lt;/h3&gt;

&lt;p&gt;This also largely remains the same, but you will need to pass a &lt;code&gt;QueryPurchasesParams&lt;/code&gt; object with a &lt;code&gt;BillingClient.ProductType&lt;/code&gt; value, instead of a &lt;code&gt;BillingClient.SkuType&lt;/code&gt; value to &lt;code&gt;queryPurchasesAsync()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing subscription status via the API
&lt;/h3&gt;

&lt;p&gt;Your current subscription purchase status management backend component will be able to manage converted subscriptions pre-dating May 2022 as well as backward compatible offers, but will not support any of the new functionality introduced in Google Play Billing Library 5. To fully support the new subscription features, implement the new Subscription Purchases API (&lt;a href="https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptionsv2"&gt;link&lt;/a&gt;), which will check purchase status and manage entitlements in your backend.&lt;/p&gt;

&lt;p&gt;Replace calls to &lt;code&gt;purchases.subscriptions.get&lt;/code&gt; with &lt;code&gt;purchases.subscriptionsv2.get&lt;/code&gt; to access a new resource called &lt;code&gt;SubscriptionPurchaseV2&lt;/code&gt;. There, you’ll find the necessary information to manage entitlements for subscriptions created in the new model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing Android subscriptions for Google Play Billing Library 5
&lt;/h3&gt;

&lt;p&gt;Before launching your app or submitting your app’s update, – as always – thoroughly test your subscriptions. The process to do so doesn’t differ from how you did it in PBL4, so simply follow the steps detailed in &lt;a href="https://www.revenuecat.com/blog/engineering/the-ultimate-guide-to-android-subscription-testing/"&gt;RevenueCat's ultimate guide to Android subscription testing&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrating to Billing Library 5, from Android Dev Summit ‘22
&lt;/h3&gt;

&lt;p&gt;At this year’s Android Dev Summit, Diana García Ríos from Google’s Android team presented on the topic of PBL5 migrations. In this 16 minute video, she explains how to adopt Android and server integrations to take advantage of these new capabilities, and cust maintenance load by designing your subscription system for PBL5 from the bottom up:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/QcgAw1EJfrE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to save yourself some pain?
&lt;/h2&gt;

&lt;p&gt;RevenueCat was built to help developers manage the complexity of offering subscriptions across their mobile applications and web. Read more on our support for &lt;a href="https://www.revenuecat.com/blog/engineering/android-in-app-subscriptions-tutorial/"&gt;Android in-app subscriptions here&lt;/a&gt;, or &lt;a href="https://app.revenuecat.com/signup"&gt;sign up&lt;/a&gt; and start building&lt;/p&gt;

</description>
      <category>android</category>
      <category>subscriptions</category>
      <category>mobile</category>
      <category>googleplay</category>
    </item>
    <item>
      <title>What expert iOS devs expect from WWDC21</title>
      <dc:creator>Hendrik Haandrikman 🚀</dc:creator>
      <pubDate>Fri, 04 Jun 2021 16:39:16 +0000</pubDate>
      <link>https://dev.to/hhaandr/what-expert-ios-devs-expect-from-wwdc21-38m7</link>
      <guid>https://dev.to/hhaandr/what-expert-ios-devs-expect-from-wwdc21-38m7</guid>
      <description>&lt;p&gt;"Dub Dub" is just around the corner, so that means that every iOS developer out there is filled with equal parts excitement about the shiny new things being announced, and dread about the many ways in which those shiny things will break their apps.&lt;/p&gt;

&lt;p&gt;Wondering what expert iOS devs wish for, fear, and expect from this year's Apple Developer Conference? We asked:&lt;/p&gt;

&lt;h2&gt;
  
  
  WWDC 2021 Wishes, Fears, and Expectations
&lt;/h2&gt;

&lt;p&gt;Vincent Pradeilles, iOS developer and &lt;a href="https://www.youtube.com/c/vincentpradeilles"&gt;YouTuber extraordinaire&lt;/a&gt;, spent the last couple of weeks talking to some great folks from the iOS community to ask them about their expectations, fears and wishes for this year's WWDC.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://youtube.com/playlist?list=PLbKJc0NMPDrAFqAhPPUkCRzvBTlraB5p-"&gt;a series of interviews&lt;/a&gt;, he spoke to Kaya Thomas, Donny Wals, Anastasiia Voitova, Antoine van der Lee, Ellen Shapiro, and Carola Nitz to hear their thoughts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vincent Pradeille's perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GHTcfENP3XM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Kaya Thomas' perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1DtE4yn0dbI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Donny Wals' perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/55zK18V_X1M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Anastasiia Voitova's perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8VG_7V3rEHU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Antoine van der Lee's perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/S1jTcXRQeP4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Ellen Shapiro's perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/CizsMCF7QS0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Carola Nitz's perspective
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6fseH5PR_No"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Join the post-WWDC conversation
&lt;/h3&gt;

&lt;p&gt;To see just how wrong/right everyone was, join them in a post-WWDC live discussion hosted by &lt;a href="https://www.bitrise.io"&gt;Bitrise&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Date: June 17th, Thursday&lt;br&gt;
Time: 9 AM PDT / 6 PM CEST&lt;/p&gt;

&lt;p&gt;Guests: Paul Hudson, Ellen Shapiro, Vincent Pradeilles, Anastasiia Voitova, Donny Wals, &lt;strong&gt;you&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitrise.io/webinar/wwdc2021-recap-panel-discussion"&gt;Reserve your seat here&lt;/a&gt; (if you're not able to make it, we'll send you the recording after the stream has ended)&lt;/p&gt;

</description>
      <category>ios</category>
      <category>wwdc</category>
      <category>apple</category>
      <category>iosdevelopment</category>
    </item>
    <item>
      <title>Xcode matters - These are the CICD services where you'll find it first</title>
      <dc:creator>Hendrik Haandrikman 🚀</dc:creator>
      <pubDate>Tue, 01 Jun 2021 17:54:12 +0000</pubDate>
      <link>https://dev.to/hhaandr/xcode-matters-these-are-the-cicd-services-where-you-ll-find-it-first-2fbf</link>
      <guid>https://dev.to/hhaandr/xcode-matters-these-are-the-cicd-services-where-you-ll-find-it-first-2fbf</guid>
      <description>&lt;p&gt;Xcode versions are the drumbeat that iOS teams all around the world march to. Rapid access to Xcode versions ensure that apps are submitted, and updated on time, while Xcode betas help prepare for new features, functionality, and – dreaded – deprecations.&lt;/p&gt;

&lt;p&gt;With WWDC 2021 around the corner, enticing teams with the shiny new things the Apple folks thought up for us, this topic is more relevant than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The research method
&lt;/h2&gt;

&lt;p&gt;Over a 12 month period, a sample of Xcode GMs, RCs and betas was generated based on data aggregated by &lt;a href="https://xcodereleases.com/"&gt;https://xcodereleases.com/&lt;/a&gt; - For this sample of 15 Xcode releases, we pulled in publicly available information on Xcode releases on Bitrise, GitHub Actions, CircleCI, and Travis.&lt;/p&gt;

&lt;p&gt;Whenever a particular Xcode version was skipped by a CI provider, the next version was used instead to determine availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data
&lt;/h2&gt;

&lt;p&gt;The following table shows the tracked releases, and their availability on the different platforms:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zZzGzLu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9lgwsl3erun8l26aqwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zZzGzLu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9lgwsl3erun8l26aqwx.png" alt="A table showing the releases dates for a sample of Xcode versions, as well as their dates of availability on different CICD platforms"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To ensure we're comparing apples to apples, the dates listed are based on CET&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed of Xcode availability on Bitrise
&lt;/h2&gt;

&lt;p&gt;Over the last 12 months, on average, it took 3.4 days to have a new Xcode version available for developers on Bitrise. This includes GM’s and betas.&lt;/p&gt;

&lt;p&gt;Even though this 3.4 day average puts Bitrise ahead 3 days ahead of its second fastest competitor, it falls short of their aim to have new Xcode versions available within 48 hours. Mostly, this is due to a stretch of slower releases in Q4 2020, and Q1 2021 resulting from increased focus an ongoing infrastructure improvement. Regardless, they have expressed a renewed commitment to hit &amp;lt;48 hours availability, where possible.&lt;/p&gt;

&lt;p&gt;Bitrise Xcode updates based on stack update notices posted to their Discourse space &lt;a href="https://discuss.bitrise.io/tags/stack-updates"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode support on CircleCI
&lt;/h2&gt;

&lt;p&gt;New Xcode versions are usually available on CircleCI within a one week window, but their average time to availability came in at 7.2 days – a little over a week. This is mostly caused by some slip-ups related to a number of Xcode beta versions that took several weeks to make it onto CircleCI’s macOS stacks.&lt;/p&gt;

&lt;p&gt;Note that, at time of writing, no Xcode 12.5 beta or GM is available on CircleCI’s macOS stacks, so we’ve left this latest version out of our calculations.&lt;/p&gt;

&lt;p&gt;CircleCI Xcode updates based on stack update notices posted to their Discourse space &lt;a href="https://discuss.circleci.com/search?q=xcode%20%23announcements"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode support on GitHub Actions
&lt;/h2&gt;

&lt;p&gt;New Xcode versions are generally available on GitHub Actions a little over a week after launch, but their average time to availability came in at 6.5 days – a little under a week. Their average got pulled up by a handful of versions that were supported in 2 or 3 days. Like most CI’s, they also managed to support the Xcode 11.5 GM in a day.&lt;/p&gt;

&lt;p&gt;Note that, at time of writing, the Xcode 12.5 beta made available briefly on GitHub Actions is now only available as a “private preview”. There, it can be accessed to those organizations that used GHA’s macOS 11.0 image while it was in public preview mode.&lt;/p&gt;

&lt;p&gt;GitHub Actions Xcode updates based on the commit history for their MacOS 10.15 virtual environments doc &lt;a href="https://github.com/actions/virtual-environments/commits/releases/macOS-10.15/20210525/images/macos/macos-10.15-Readme.md"&gt;here&lt;/a&gt; and their MacOS 10.14 doc &lt;a href="https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.14-Readme.md"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode support on Travis CI
&lt;/h2&gt;

&lt;p&gt;New Xcode support on Travis CI seems erratic, with some versions being supported very quickly (looking at you, Xcode 12.2 Beta 1), but their average time to availability came in at 12.6 days – close to two weeks, and slower than anyone else benchmarked in this article. Time to availability regularly ran over a week, and 12.4 took a full month to support.&lt;/p&gt;

&lt;p&gt;Note that Travis CI is one of the few cloud CICD platforms that currently offers Xcode 12.5 builds, but they seem to have skipped the betas and took a little over 2 weeks to make the RC available.&lt;/p&gt;

&lt;p&gt;Travis CI Xcode updates based on stack update notices posted to their changelog &lt;a href="https://changelog.travis-ci.com/"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode support on App Center
&lt;/h2&gt;

&lt;p&gt;Even though there are still quite a few mobile teams building there today, we’ve not included App Center Xcode updates in this roundup: For the entirety of the measured period, App Center macOS builds ran on GitHub Action macOS images. Their performance can therefore be assessed as being identical to what we’ve recorded for GHA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode support on Jenkins
&lt;/h2&gt;

&lt;p&gt;🤷‍♀️ probably captures the sentiment here best: On Jenkins, you or someone on your team will be responsible for ensuring new Xcode versions are available.&lt;/p&gt;

&lt;p&gt;How long that’ll take is dependent on a number of factors, including the priorities of the team, or the stability of your Jenkins environment: If it’s already kept together by luck, positive thoughts and firefighting, those engineers responsible for maintaining it will often be hesitant to rush out an Xcode update… However eager mobile developers might be to get their hands on it.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>devops</category>
      <category>mobile</category>
      <category>swift</category>
    </item>
    <item>
      <title>Turns out, there's life after Jenkins and it's GREAT</title>
      <dc:creator>Hendrik Haandrikman 🚀</dc:creator>
      <pubDate>Mon, 15 Mar 2021 20:51:47 +0000</pubDate>
      <link>https://dev.to/hhaandr/turns-out-there-s-life-after-jenkins-and-it-s-great-1mah</link>
      <guid>https://dev.to/hhaandr/turns-out-there-s-life-after-jenkins-and-it-s-great-1mah</guid>
      <description>&lt;p&gt;&lt;em&gt;This article contains research findings from Bitrise's &lt;a href="https://www.bitrise.io/downloads/mobile-ci-after-jenkins"&gt;report Mobile CI after Jenkins - 6 lessons learned&lt;/a&gt;. If you're not interested in my stories about uncle Jenkins, manga and struggles with stacks of Macs, just skip ahead a few sections, and I'll share data on how the folks that used to be responsible for Jenkins feel their jobs changed.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Uncle Jenkins
&lt;/h2&gt;

&lt;p&gt;Did you know that in Japan, devs will often refer to Jenkins as 'Jenkins ojisan', or 'Uncle Jenkins'? 🇯🇵 When I first started working at Bitrise and Google Translated Japanese Tweets, that confused me tremendously. Fast forward a couple of years, and we actually hired a manga artist to tell the story of devs struggling with their Jenkins boxes:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u_fuCBnb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/Ef0ZtjqXkAcEOsg.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ftsvJ33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1044916531761737728/OBfH744Z_normal.jpg" alt="Bitrise JPN profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Bitrise JPN
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @bitrisej
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      &lt;a href="https://twitter.com/hashtag/%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"&gt;#新プロジェクト&lt;/a&gt; 待ちに待ったその答えは、、、&lt;br&gt;Bitriseユーザーの生の声を4コママンガにしてお届けいたします！&lt;br&gt;その名も &lt;a href="https://twitter.com/hashtag/%E3%83%9E%E3%83%B3%E3%82%AC%E3%81%A7Bitrise"&gt;#マンガでBitrise&lt;/a&gt; 🤖🐱&lt;br&gt;&lt;br&gt;今回の作品は、&lt;a href="https://twitter.com/fromkk"&gt;@fromkk&lt;/a&gt; さんの体験談を基に作成しました。&lt;br&gt;マンガのデザイナーには、 &lt;a href="https://twitter.com/net_the_mario"&gt;@net_the_mario&lt;/a&gt; さんにご協力いただきます！&lt;br&gt;次回作もお楽しみに！ 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      23:00 PM - 19 Aug 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1296220540722655233" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1296220540722655233" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1296220540722655233" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;But I digress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jenkins is free.... ? 🎉
&lt;/h2&gt;

&lt;p&gt;We all know Jenkins. It's estimated to be what over 70% of devs use for their CI, and for good reason:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's free&lt;/li&gt;
&lt;li&gt;It's flexible&lt;/li&gt;
&lt;li&gt;It's open source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that flexibility comes at a price. It's devilishly difficult to master for beginners, and - as detailed in &lt;a href="https://engblog.nextdoor.com/our-ios-ci-cd-journey-at-nextdoor-2456cfdca82b"&gt;the Nextdoor Engineering Blog recently&lt;/a&gt; - has its limitations when you try and use it at scale for mobile engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintenance is a constant struggle, with the necessary hardware to build for iOS as an (expensive) bonus&lt;/li&gt;
&lt;li&gt;There's a lack of isolation between builds, which means that - for example - the cache from an old build can cause a new build to fail (have fun troubleshooting that one 😓) &lt;/li&gt;
&lt;li&gt;There's a limit to the speed at which you can spin up physical machines if your needs increase, and probably a finance department that wants to know why trucks filled with Macs keep pulling up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oh, and on Jenkins being "free", &lt;a href="https://twitter.com/Moatazeldebsy"&gt;Moataz Nabil&lt;/a&gt; (Senior Software Engineer at Delivery Hero) had the following to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"While Jenkins - technically - is free, the cost of hosting the server on which it will run can not be easily calculated. It's not always possible to estimate the kind of load the server needs to handle, or the amount of compute power you'll need from hardware stacked in the office. The total cost associated remains unpredictable."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: It's free, if you ignore the fact that you're spending a ton of time on it, and also need hardware to run it on. Unless that's fallen off of a truck by the docks, Jenkins is probably not 'free'&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's migrate! But... What do we do with our Jenkins folks?
&lt;/h2&gt;

&lt;p&gt;For these and a number of other reasons that could make up an entirely separate article, cloud-based alternatives like CircleCI, Travis and - yes - Bitrise have been edging out the traditional "Jenkins box" in most mobile engineering organisations.&lt;/p&gt;

&lt;p&gt;That's usually great for those organisations (more on that later), but what about the folks that were responsible for maintaining Jenkins? &lt;/p&gt;

&lt;p&gt;Are they out of a job? Demoted to getting coffee and bagels for the team? What does their day to day look like after we've said our goodbyes to uncle Jenkins?&lt;/p&gt;

&lt;p&gt;We decided to find out, by asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The report
&lt;/h2&gt;

&lt;p&gt;Over January and February of 2021, our UX research team, developer advocates, and a number of other folks surveyed and interviewed hundreds of ex-Jenkins maintainers who had switched to cloud CI for mobile.&lt;/p&gt;

&lt;p&gt;Our goal was to find out exactly what had changed for these people, and - more then anything - figure out how they felt about the change.&lt;/p&gt;

&lt;p&gt;What follows are some of the main takeaways:&lt;/p&gt;

&lt;h2&gt;
  
  
  Computer says... Engineers are happier!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/JliGmPEIgzGLe/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/JliGmPEIgzGLe/giphy.gif" width="500" height="279"&gt;&lt;/a&gt;&lt;br&gt;
(the computer actually said 'yes', but there's no GIF for that...)&lt;/p&gt;

&lt;p&gt;73.9% of those interviewed answered that they were happier with their jobs after moving from Jenkins to a cloud CI alternative. Half of those even reported being &lt;strong&gt;much&lt;/strong&gt; happier, a mental state that - according to Google - usually requires 7 minutes of exercise, more sleep, meditation and / or cake.&lt;/p&gt;

&lt;p&gt;We found a lot of reasons for that increased happiness in answers throughout the survey and interviews, but found 3 big themes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The people responsible for Jenkins have usually worked (very) hard at gathering the necessary knowledge to support their teams, but feel like the constant firefighting leaves them with no time to spend on meaningful improvements to the team's CI / CD setup&lt;/li&gt;
&lt;li&gt;ex-Jenkins maintainers spend &lt;strong&gt;more&lt;/strong&gt; time on building and improving workflows after switching to cloud CI, but see way more results in team performance for that time spent (a whopping 90% reports that their teams are faster and more productive after migrating)&lt;/li&gt;
&lt;li&gt;Turns out that - in most cases - those years 'learning Jenkins' won't go to waste:&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hiring: A Jenkins Expert to manage our Bitrise / CircleCI / Travis setup
&lt;/h2&gt;

&lt;p&gt;Even though a little under 14% of those we talked to thought their Jenkins expertise made it more difficult to find their way around cloud CI, the majority disagreed. Almost 60% were able to use their Jenkins expertise to get started with cloud CI quicker. 34.1% even thought their time on Jenkins gave them a significant edge, and were able to see results sooner, and make a bigger difference in their team's performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus fun fact:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone saw that they were gaining a lot of time to spend on things &lt;em&gt;other&lt;/em&gt; than fixing broken workflows on Jenkins. Only 8.7% of the folks we talked to spent that time on 'rest and relaxation', tho. The rest of them opted for things like creating new features, building and improving automation, and a range of - arguably more productive - efforts.&lt;/p&gt;

&lt;h2&gt;
  
  
  In conclusion
&lt;/h2&gt;

&lt;p&gt;Jenkins is fine, the people that are responsible for Jenkins in their organisations are usually great, and when you give them cloud CI &lt;code&gt;plug&lt;/code&gt; like Bitrise &lt;code&gt;/plug&lt;/code&gt; to play with, they're amazing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitrise.io/downloads/mobile-ci-after-jenkins"&gt;Download the full report&lt;/a&gt; if you're interested in our other findings, and contributions from folks with impressive titles at cool companies. Stuff like WeTransfer, Nextdoor, Signify (the folks of the Hue lightbulbs!), and more. You get the picture 😉&lt;/p&gt;

</description>
      <category>devops</category>
      <category>jenkins</category>
      <category>ios</category>
      <category>ci</category>
    </item>
  </channel>
</rss>
