<?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: Sophie @Appcircle</title>
    <description>The latest articles on DEV Community by Sophie @Appcircle (@appcircle_rel).</description>
    <link>https://dev.to/appcircle_rel</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%2F650037%2F44548fab-23c5-45da-898b-f4532e2c2d41.jpg</url>
      <title>DEV Community: Sophie @Appcircle</title>
      <link>https://dev.to/appcircle_rel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/appcircle_rel"/>
    <language>en</language>
    <item>
      <title>The Journey of Microsoft App Center: A Retrospective from Birth to Sunset</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 17 Apr 2024 18:28:42 +0000</pubDate>
      <link>https://dev.to/appcircle/the-journey-of-microsoft-app-center-a-retrospective-from-birth-to-sunset-p55</link>
      <guid>https://dev.to/appcircle/the-journey-of-microsoft-app-center-a-retrospective-from-birth-to-sunset-p55</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Genesis of App Center&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After Apple launched iOS and Google introduced Android, both achieving great results, Microsoft decided to make a move to strengthen its presence in the mobile ecosystem. However, the "Windows Phone" domain did not experience the expected growth in the industry, and market focus shifted towards iOS/Android-based smart devices.&lt;/p&gt;

&lt;p&gt;Consequently, Microsoft developed a new strategy to reposition itself in the sector. Instead of competing by introducing new devices, it chose to develop platforms that would serve iOS/Android developers.&lt;/p&gt;

&lt;p&gt;This initiative began with Microsoft's release of the "Xamarin" development framework in May 2011. Xamarin provided C#/.NET developers with a cross-platform development environment, enabling them to create iOS and Android applications. This framework quickly became popular, enabling thousands of ".NET developers" to become "mobile developers," and highlighting the need for server-based services. To respond quickly, Microsoft acquired HockeyApp in November 2014, making its first step into cloud-based mobile services. This acquisition was also part of Microsoft's efforts to expand its range of mobile application development tools and services.&lt;/p&gt;

&lt;p&gt;In March 2017, Microsoft consolidated all of its mobile-related cloud services, including Xamarin Test Cloud, HockeyApp, and CodePush, with the goal of providing a comprehensive 360-degree suite of tools for mobile developers. This initiative led to the launch of the MS App Center. The development framework "Xamarin," paired with the cloud service "MS App Center," effectively addressed a wide array of needs for mobile developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Rise of App Center&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alongside supporting the Xamarin ecosystem with App Center services, Microsoft also positioned itself as an alternative to &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Google Firebase&lt;/a&gt; and &lt;a href="https://aws.amazon.com/amplify/" rel="noopener noreferrer"&gt;AWS Amplify&lt;/a&gt;, thus solidifying its place in the mobile ecosystem.&lt;/p&gt;

&lt;p&gt;After a while, Microsoft began to develop "DevOps" features in addition to the "runtime features" on App Center. Starting with "Xamarin" and later extending compilation support to "Native iOS", "Native Android", and "React Native", Microsoft App Center solidified its position in the industry.&lt;/p&gt;

&lt;p&gt;As the mobile ecosystem entered a new era, Microsoft accelerated the adoption of App Center by addressing specific challenges such as the lack of specialized CI/CD products for mobile projects and developers' limited access to MAC OS build machine. &lt;/p&gt;

&lt;p&gt;App Center offered a comprehensive suite of services (almost for free) like &lt;strong&gt;Error Tracking and Reporting, Mobile Analytics, Beta Test Distribution, Push Notifications, Code Push, App Build for Mobile and Windows,&lt;/strong&gt; etc., which significantly attracted the industry’s interest.&lt;/p&gt;

&lt;p&gt;While Microsoft Azure DevOps continued to evolve in the backend DevOps area, MS App Center became more prominent on the mobile front. Integrations between Azure DevOps and MS App Center increased enterprise adoption of App Center.&lt;/p&gt;

&lt;p&gt;App Center became a preferred choice for beta distribution among many companies. Over time, it started surpassing Google Firebase and AWS Amplify in this regard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Retirement of App Center…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Microsoft managed sustained success with Xamarin, the usage metrics for App Center were satisfactory. However, App Center was not commercially profitable, and the emergence of alternatives like &lt;a href="https://developer.apple.com/xcode-cloud/" rel="noopener noreferrer"&gt;Xcode Cloud&lt;/a&gt; and &lt;a href="https://appcircle.io/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=journey_of_appcenter" rel="noopener noreferrer"&gt;Appcircle&lt;/a&gt; increased competition. The rise of Firebase’s runtime features also created alternatives to App Center, prompting Microsoft to reassess its strategies.&lt;/p&gt;

&lt;p&gt;While Microsoft continued to make significant investments in &lt;a href="https://azure.microsoft.com/en-us/products/devops" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;, it defined a new strategy and began recommending the more corporate solution of the Azure DevOps family instead of App Center. As the DevOps sector began to rise in the early 2020s, Microsoft continued to position Azure DevOps as an alternative to other players in the industry such as GitLab CI, Circle CI, and Jenkins. I'm not even mentioning the acquisition of Github, as that is a completely parallel strategy.&lt;/p&gt;

&lt;p&gt;In recent years, MS App Center has increasingly failed to meet the industry's needs. Its lack of support for Flutter, not prioritizing issues on Github, and failing to meet roadmap targets indicated a decline in its priority within Microsoft. However, because it did not produce a solution in the Mobile DevOps area, the closure of MS App Center was not widely anticipated.&lt;/p&gt;

&lt;p&gt;Currently, Microsoft is focusing on growing within the Community through Github Actions, while continuing to emphasize Azure DevOps in the Enterprise world. For mobile needs, it is trying to address Runtime features (&lt;strong&gt;Error Tracking and Reporting, Mobile Analytics&lt;/strong&gt;) by directing them towards Azure services for solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exit Planning from App Center&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Considering the services provided by App Center, I would like to share some alternatives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; App Center’s build feature was relatively limited, but it filled a crucial gap especially in Xamarin and Windows builds. For mobile solutions, transitioning to &lt;a href="https://appcircle.io/build?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=journey_of_appcenter" rel="noopener noreferrer"&gt;Appcircle Build&lt;/a&gt; and &lt;a href="https://developer.apple.com/xcode-cloud/" rel="noopener noreferrer"&gt;Xcode Cloud&lt;/a&gt; might be necessary, although custom pipelines will be needed for Xamarin and Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beta Distribution:&lt;/strong&gt; One of App Center’s most popular features was its Beta Distribution capability used for distributing mobile packages. Alternatives like &lt;a href="https://appcircle.io/testing-distribution?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=journey_of_appcenter" rel="noopener noreferrer"&gt;Appcircle Testing Distribution&lt;/a&gt; and &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Google Firebase&lt;/a&gt; can be considered. If you need more corporate capabilities (SSO/LDAP Login, Pipeline Integration, Reporting, etc.), Appcircle offers a good solution, while Google Firebase can be considered for community-based products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analytics &amp;amp; Diagnostics:&lt;/strong&gt; You can set up your own services in Microsoft Azure, but &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Google Firebase&lt;/a&gt; and &lt;a href="https://aws.amazon.com/amplify/" rel="noopener noreferrer"&gt;AWS Amplify&lt;/a&gt; can also be considered. There are many solutions available in this area.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodePush:&lt;/strong&gt; For the Code Push feature that App Center offers for React Native projects, you can set up the &lt;a href="https://github.com/microsoft/code-push" rel="noopener noreferrer"&gt;open source&lt;/a&gt; project available on GitHub on your own servers.&lt;/p&gt;

&lt;p&gt;Large service providers like Microsoft, &lt;a href="https://killedbygoogle.com/" rel="noopener noreferrer"&gt;Google&lt;/a&gt;, and AWS can suddenly shut down their services based on their own strategies. This situation can lead to unexpected results, especially for corporations. &lt;/p&gt;

&lt;p&gt;Therefore, I recommend that corporate organizations use reasonably priced, paid services to establish long-term agreements.&lt;/p&gt;

</description>
      <category>appcenter</category>
      <category>mobile</category>
      <category>devops</category>
    </item>
    <item>
      <title>Isolation as Key: Optimizing Performance in Concurrent Builds on a Single Host</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Tue, 02 Apr 2024 14:54:54 +0000</pubDate>
      <link>https://dev.to/appcircle/isolation-as-key-optimizing-performance-in-concurrent-builds-on-a-single-host-4k9a</link>
      <guid>https://dev.to/appcircle/isolation-as-key-optimizing-performance-in-concurrent-builds-on-a-single-host-4k9a</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/isolation-as-key-optimizing-performance-in-concurrent-builds-on-a-single-host?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=isolation" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjxbn50bpdcbdi7hh8p7.png" alt="isolation techniques" width="800" height="386"&gt;&lt;/a&gt;&lt;br&gt;
Running multiple builds on a single host for mobile application development is a common practice, but it introduces security and efficiency concerns. This article is about the importance of isolation techniques in mitigating these risks effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definitions:&lt;/strong&gt;&lt;br&gt;
By leveraging strategies such as containerization and virtual machine (VM) deployment, developers can ensure that each runner operates independently, minimizing conflicts such as managing different Xcode versions, test cases (simulators and emulators), and library dependencies, thus optimizing performance.&lt;/p&gt;

&lt;p&gt;Runners are the machines that execute jobs in a CI/CD workflow. For example, a runner can clone your repository locally, install testing software, and then run commands that evaluate your code. Additionally, insights from best practices in managing multiple runners from other development platforms are integrated to provide comprehensive guidance for creating secure and efficient development environments for mobile applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolation Techniques: Best Practice&lt;/strong&gt;&lt;br&gt;
To accommodate multiple builds on a single host, developers often deploy replicas of runners with unique names. This approach enables the execution of numerous runners and jobs on a single host. However, to prevent conflicts and ensure smooth operation, it’s imperative to establish sufficient isolation between these runners.&lt;br&gt;
...&lt;br&gt;
&lt;a href="https://appcircle.io/blog/isolation-as-key-optimizing-performance-in-concurrent-builds-on-a-single-host?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=isolation" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;u&gt;Read More&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vm</category>
      <category>runner</category>
      <category>mobile</category>
      <category>devops</category>
    </item>
    <item>
      <title>Measuring Mobile DevOps Maturity with DORA Metrics</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Tue, 26 Mar 2024 16:00:11 +0000</pubDate>
      <link>https://dev.to/appcircle/measuring-mobile-devops-maturity-with-dora-metrics-1hjk</link>
      <guid>https://dev.to/appcircle/measuring-mobile-devops-maturity-with-dora-metrics-1hjk</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/measuring-mobile-devops-maturity-with-dora-metrics?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=dora_metrics" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpawwfg3r1h2rix8pr66n.png" alt="DevOps Maturity" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discover how Appcircle transforms mobile DevOps in our latest article! 🚀 &lt;br&gt;
Learn about tailored DORA metrics on Mobile DevOps &lt;/p&gt;

&lt;p&gt;Let's redefine Mobile DevOps together! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/blog/measuring-mobile-devops-maturity-with-dora-metrics?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=dora_metrics" rel="noopener noreferrer"&gt;https://appcircle.io/blog/measuring-mobile-devops-maturity-with-dora-metrics&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>devops</category>
    </item>
    <item>
      <title>Update on App Center's Retirement</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Fri, 22 Mar 2024 13:58:43 +0000</pubDate>
      <link>https://dev.to/appcircle/update-on-app-centers-retirement-5e73</link>
      <guid>https://dev.to/appcircle/update-on-app-centers-retirement-5e73</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/navigating-the-retirement-of-app-center-embracing-appcircle-as-the-ultimate-alternative?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=appcenter_retirement" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2j596gcm49bfgjt3h85.png" alt="App Center Retirement" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have an update on App Center's retirement. In our blog, "Navigating the Retirement of AppCenter: Embracing Appcircle as the Ultimate Alternative," we explore the challenges of App Center's retirement and how Appcircle is the ideal replacement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/blog/navigating-the-retirement-of-app-center-embracing-appcircle-as-the-ultimate-alternative?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=appcenter_retirement" rel="noopener noreferrer"&gt;https://appcircle.io/blog/navigating-the-retirement-of-app-center-embracing-appcircle-as-the-ultimate-alternative&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>devops</category>
    </item>
    <item>
      <title>Transforming Kotlin Collections - Functions with Examples</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Mon, 17 Oct 2022 07:11:36 +0000</pubDate>
      <link>https://dev.to/appcircle/transforming-kotlin-collections-functions-with-examples-dgd</link>
      <guid>https://dev.to/appcircle/transforming-kotlin-collections-functions-with-examples-dgd</guid>
      <description>&lt;ul&gt;
&lt;li&gt;This article originaly posted to &lt;a href="https://blog.appcircle.io/article/transforming-kotlin-collections-functions-with-examples" rel="noopener noreferrer"&gt;Appcircle&lt;/a&gt; blog and is written by Safa Orhan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Knowing about the standard library functions in Kotlin saves a lot of time while working on complex data structures. Whether you are mapping the API response model into your business model or you are sorting, filtering, and manipulating data; knowing  these operation on Kotlin collections come really handy.&lt;/p&gt;

&lt;p&gt;In this post, we are gonna go through some collection transformation operations that I use frequently.&lt;/p&gt;

&lt;h2&gt;Kotlin Collections - Transformation Operations&lt;/h2&gt;

&lt;h2&gt;1. Mapping&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping1-1-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping1-1-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mapping means to modify each item in a collection by applying a transformation lambda which results in the creation of another collection.&lt;/p&gt;

&lt;p&gt;If you are working on lists of data that you need to transform from one model into another or if you want to convert the API response model into a domain layer model you should use mapping operations in Kotlin.&lt;/p&gt;

&lt;h3&gt;.map()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping2-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping2-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
Using the &lt;code&gt;.map()&lt;/code&gt; function is the most common way to convert a collection of items into another. It applies the given transform lambda to each of the items of the receiver collection and yields them into a newly created list.&lt;/p&gt;

&lt;h3&gt;.mapIndexed()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping3-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping3-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you also need the index of each item when transforming them, you can use the &lt;code&gt;.mapIndexed()&lt;/code&gt; function. It will feed the index of each item to the transform lambda so that you can utilize the order of the items.&lt;/p&gt;

&lt;h3&gt;.mapNotNull()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping4-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FMapping4-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another convenient mapping function is &lt;code&gt;.mapNotNull()&lt;/code&gt;. You can use it if you want to filter out null items after the conversion.&lt;/p&gt;

&lt;p&gt;For example, if you have a list of objects which may or may not have text property, you can use &lt;code&gt;.mapNotNull()&lt;/code&gt; to get a list of texts without any nulls being in it.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Kotlin's standard library also has &lt;code&gt;.mapIndexedNotNull()&lt;/code&gt; method which combines &lt;code&gt;.mapIndexed()&lt;/code&gt; and &lt;code&gt;.mapNotNull()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also you can find &lt;code&gt;.mapKeys()&lt;/code&gt; and &lt;code&gt;.mapValues()&lt;/code&gt; methods which are defined on &lt;code&gt;Map&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Please check out the &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#map" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; if you need more information on the topic.&lt;/p&gt;

&lt;h2&gt;2. Zipping&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping1-1-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping1-1-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you have two lists of the same size and you want to merge each item from the first list with the corresponding item coming from the second list you want zipping.&lt;/p&gt;

&lt;p&gt;Kotlin standard library has convenient functions to zip and unzip collections including &lt;code&gt;List&lt;/code&gt;s, &lt;code&gt;Array&lt;/code&gt;s, and &lt;code&gt;Sequence&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Let's take a look at what we have:&lt;/p&gt;

&lt;h3&gt;.zip()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping2-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping2-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use &lt;code&gt;.zip()&lt;/code&gt; without any transformation to create a list of pairs. The pairs have their first item from the receiver list and the second from the argument. If you want to combine two different data sources into one and if the sources has the same number of items, the function &lt;code&gt;.zip()&lt;/code&gt; is really useful.&lt;/p&gt;

&lt;h3&gt;.zip() with transform lambda&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping3-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping3-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't need pairs but you want to define your own zipping logic, good news: &lt;code&gt;.zip()&lt;/code&gt; can also take a transform lambda as an argument. So you don't need to chain a &lt;code&gt;.zip()&lt;/code&gt; command with a &lt;code&gt;.map()&lt;/code&gt;. Instead, pass a lambda and combine two items coming from two data sources in a way you would prefer.&lt;/p&gt;

&lt;h3&gt;.unzip()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping4-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FZipping4-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another great function in Kotlin is the &lt;code&gt;.unzip()&lt;/code&gt;. The name gives it all away: it does the opposite of &lt;code&gt;.zip()&lt;/code&gt;. If you have a list of pairs and want to create two lists that contain the firsts and seconds of each item, then just &lt;code&gt;.unzip()&lt;/code&gt; it!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you want to see some examples please check out the &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#zip" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now let's check out another group of transformation operations:&lt;/p&gt;

&lt;h2&gt;3. Association&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation1-1-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation1-1-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Association is when you want to traverse a &lt;code&gt;List&lt;/code&gt; and convert it into a &lt;code&gt;Map&lt;/code&gt; by associating each item with one of its properties. Understanding association operations is easier to show than tell, so let's take a look at what sort of functions we have in the standard library:&lt;/p&gt;

&lt;h3&gt;.associateWith()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation2-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation2-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.associateWith()&lt;/code&gt; function, structures the items of the List as keys of a &lt;code&gt;Map&lt;/code&gt;. The values for each key are computed by running the given lambda on the item. Please note that maps cannot have duplicate keys, so if the receiver collection has repetitive items, only the last one will remain in the map.&lt;/p&gt;

&lt;h3&gt;.associateBy()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation3-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation3-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kotlin also has &lt;code&gt;.associateBy()&lt;/code&gt;, which functions almost the same. The difference is items of the receiver collections are not used as keys but values.&lt;/p&gt;

&lt;p&gt;That means if the lambda returns the same values for different items, only the last one will be present in the resulting map.&lt;/p&gt;

&lt;h3&gt;.associate()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation4-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FAssociation4-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last associating function in the standard library is &lt;code&gt;.associate()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Using this function, you can define the logic of building the map. You need to pass a lambda that returns &lt;code&gt;Pair&lt;/code&gt;s and a &lt;code&gt;Map&lt;/code&gt; will be built for you using these &lt;code&gt;Pair&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Please note that this function has some performance implications since it generates &lt;code&gt;Pair&lt;/code&gt;s as an intermediate step.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you want to learn more on association you can take a look at the &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#associate" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, let's see how we can flatten collections:&lt;/p&gt;

&lt;h2&gt;4. Flattening&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening1-1-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening1-1-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flattening in general is removing the nestedness in a collection. Consider you are given a list of lists. If you want to remove all child lists and get their elements into one single-level list, you need to flatten that list.&lt;/p&gt;

&lt;p&gt;Let's begin with:&lt;/p&gt;

&lt;h3&gt;.flatten()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening2-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening2-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the most simple way of flattening a list of lists into just list. Just call &lt;code&gt;.flatten()&lt;/code&gt; on the receiver collection to have a flat list.&lt;/p&gt;

&lt;h3&gt;.flatMap()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening3-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening3-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or, if you want to apply some kind of transformation whilst flattening, you can use &lt;code&gt;.flatMap()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Please note that &lt;code&gt;.flatMap()&lt;/code&gt; is just a shorter form of &lt;code&gt;.map().flatten()&lt;/code&gt; chain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening4-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FFlattening4-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you want to see some code examples, you may check the &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#flatten" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; on flattening.&lt;/p&gt;

&lt;p&gt;Now let's check out last chapter:&lt;/p&gt;

&lt;h2&gt;5. String Representation&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString1-1-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString1-1-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are generating user-visible text out of Kotlin collections or trying to log an internal state you will need to represent collections as strings. I really liked when I learned that Kotlin standard library has a function just for this reason:&lt;/p&gt;

&lt;h3&gt;.joinToString()&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString2-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString2-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If don't pass any parameters to &lt;code&gt;.joinToString()&lt;/code&gt;, string representations of each items will be concatenated in a string and separated by commas with spaces by default.&lt;/p&gt;

&lt;h3&gt;Customizing the separator, prefix and postfix strings&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString3-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString3-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, if you need to change the separator strings or add some more useful information to the start or to the end you can pass some arguments for &lt;code&gt;separator&lt;/code&gt;, &lt;code&gt;prefix&lt;/code&gt; and &lt;code&gt;postfix&lt;/code&gt; parameters.&lt;/p&gt;

&lt;h3&gt;The limit and truncated arguments&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString4-1030x515.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2022%2F10%2FString4-1030x515.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.joinToString()&lt;/code&gt; also support limiting and truncating the list. If you have a long list and don't want to print everything and make a mess, you can limit how many elements you want in the resulting string and what string to use in the place of an ellipsis.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Finally, it also supports passing a transform lambda if you also want to define how each item will be converted into a string.&lt;/p&gt;

&lt;p&gt;You can study the &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#string-representation" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; to learn more about the topic.&lt;/p&gt;




&lt;p&gt;That was it! Now you have learned how to transform Kotlin collections using a handful of convenience functions.&lt;/p&gt;

&lt;p&gt;If you like the article please share in your social media and if you want to learn more on Kotlin's standard library functions, let us know!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/contact?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=transforming_kotlin_collections_functions_with_examples" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9pfolgwlhw0k8nzem9v.png" alt="ContactUs" width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>mobile</category>
    </item>
    <item>
      <title>What Is The Alternative To Xcode For Windows For Mobile App Archive, Sign And Simulation?</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:37:46 +0000</pubDate>
      <link>https://dev.to/appcircle/what-is-the-alternative-to-xcode-for-windows-for-mobile-app-archive-sign-and-simulation-bho</link>
      <guid>https://dev.to/appcircle/what-is-the-alternative-to-xcode-for-windows-for-mobile-app-archive-sign-and-simulation-bho</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/alternative-xcode-for-windows-app-archive-sign-simulation/" rel="canonical noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fac.appcircle.io%2Fwp-content%2Fuploads%2F2020%2F04%2FXcode-for-Windows-2.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading Time: 2 minutes&lt;br&gt;
People frequently ask, “How to download and install Xcode on Windows for iOS development?” or similarly “Xcode on Linux”. The volume of queries to find a working Xcode for Windows has recently been more augmented as people are forced to work from home with no access to their macOS devices.&lt;/p&gt;

&lt;p&gt;You can still do iOS development on Windows with code editors in a crude way or by using the cross-platform frameworks, but you would be missing out crucial Xcode features such as iPhone and iPad simulators and archiving and signing iOS applications on Windows.&lt;/p&gt;

&lt;p&gt;There are certain technical workarounds to use Xcode for Windows as we mention in other posts, but each has their own complexities regarding building, previewing and distributing mobile applications.&lt;/p&gt;

&lt;p&gt;Moreover, you will encounter additional issues if you want to use multiple Xcode versions such as beta or if you are using a cross-platform framework to develop your iOS app, which requires specific dependencies besides Xcode itself, so you would also be looking to seek an alternative to use such dependencies on Windows.&lt;/p&gt;

&lt;p&gt;Instead of struggling with all of these issues, you can use Appcircle for an automates and simple mobile CI/CD experience on any environment.&lt;/p&gt;

&lt;p&gt;Appcircle is a complete DevOps platform that can replace many of the post-development operations done with Xcode, from app builds to simulators.&lt;/p&gt;

&lt;p&gt;What is the Advantage of Appcircle as an Alternative to Xcode for Windows?&lt;br&gt;
You can just connect your git repository without the need for Xcode and Appcircle will handle the full CI/CD processes of your app in your browser, whether you are using Windows or Linux or any other operating system. Appcircle even works on tablets so in a way, you can use Xcode on iPad for app signing and previews.&lt;/p&gt;

&lt;p&gt;Get started with Appcircle right away for archiving, signing and submitting iOS apps along with running apps on simulators.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/contact?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=what_is_the_alternative_to_xcode_for_windows_for_mobile_app_archive_sign_and_simulation" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9pfolgwlhw0k8nzem9v.png" alt="ContactUs" width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xcode</category>
      <category>appcircle</category>
      <category>mobile</category>
      <category>devops</category>
    </item>
    <item>
      <title>What is Noops And How to Achieve Noops in Mobile App Development?</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:37:02 +0000</pubDate>
      <link>https://dev.to/appcircle/what-is-noops-and-how-to-achieve-noops-in-mobile-app-development-5b03</link>
      <guid>https://dev.to/appcircle/what-is-noops-and-how-to-achieve-noops-in-mobile-app-development-5b03</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/what-is-noops-and-how-to-achieve-noops-in-mobile-app-development/" rel="canonical noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappcircle.io%2Fwp-content%2Fuploads%2F2019%2F08%2FWhat-is-Noops-845x321.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading Time: 3 minutes&lt;/p&gt;

&lt;p&gt;As enterprises are embracing DevOps and realizing its benefits, especially in their well-established software stacks, they are challenged with another question with the increasing prominence of DevOps in the cloud applications supported with automation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The question can be expressed as "why don't we fully streamline the DevOps processes even further since it is more or less consist of tasks in a highly structured flow?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The primary hurdle is the presence of physical hardware that requires maintenance in any case, but moving to the cloud and taking advantage of SaaS (Software as a Service) or PaaS (Platform as a Service) products eliminates this layer of complexity and automated DevOps starts to make more sense.&lt;/p&gt;

&lt;p&gt;And this concept actually has a recently coined name of "NoOps", which is gaining foothold in parallel with the cloud adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is NoOps?
&lt;/h2&gt;

&lt;p&gt;In the simplest way, NoOps can be considered as integrating and automating (wherever possible) DevOps processes. In this sense, it is perceived as an alternative to DevOps or sometimes even as "DevOps" killer, but, it is more like an extension and further streamlining of the DevOps concept.&lt;/p&gt;

&lt;p&gt;The term is first identified by Forrester and they emphasize that&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"NoOps means that application developers will never have to speak with an operations professional again."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Indeed, when NoOps is implemented and used in the right way and in the right conditions, it is as beneficial and productive as the name suggests.&lt;/p&gt;

&lt;p&gt;However, it requires the right tools and preferably a full cloud presence and it should not be considered as a silver bullet for DevOps needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2019/08/cloud-image.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappcircle.io%2Fwp-content%2Fuploads%2F2019%2F08%2Fcloud-image.png.webp" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the advantage of the cloud, NoOps eliminates the hassle of integration and upload/download operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps vs. NoOps
&lt;/h2&gt;

&lt;p&gt;There are certain fields where you have an established DevOps culture and an "Ops" team, such as maintaining critical backend applications, which may include dealing with locally installed hardware and software.&lt;/p&gt;

&lt;p&gt;However, in emerging technologies such as mobility, it is not as easy as to find and maintain internal resources for DevOps or you might not have the operations experience that you have already gained in backend applications for decades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2019/08/DevopsvsNoops.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappcircle.io%2Fwp-content%2Fuploads%2F2019%2F08%2FDevopsvsNoops.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps in Enterprise Mobility
&lt;/h2&gt;

&lt;p&gt;Due to its nature, mobility has its own DevOps challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Requiring a binary to be installed on mobile devices&lt;/li&gt;
&lt;li&gt;  Device and operating system fragmentation making coding, testing and distribution processes demanding&lt;/li&gt;
&lt;li&gt;  Binary distribution regulations to mobile devices&lt;/li&gt;
&lt;li&gt;  Strict app signing requirements&lt;/li&gt;
&lt;li&gt;  Issues with keeping signing identities safe, secure and accessible&lt;/li&gt;
&lt;li&gt;  Complex app signing and submission processes that force the use of specific hardware and software.&lt;/li&gt;
&lt;li&gt;  Lengthy and complex store submission and review processes causing issues in maintenance of the apps after production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this reason, we highlight the fact that mobile app development is only the tip of the iceberg and the lifecycle management of mobile apps (the "Ops" part) is as important as the development itself, if not more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2019/08/Lifecycle.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappcircle.io%2Fwp-content%2Fuploads%2F2019%2F08%2FLifecycle.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Typical Mobile App Lifecycle&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching From DevOps to NoOps in Mobile App Development
&lt;/h2&gt;

&lt;p&gt;Achieving NoOps in mobile app development is more difficult but also more important than many other fields due to the problems outlined in the previous section.&lt;/p&gt;

&lt;p&gt;We developed Appcircle for enterprises to embrace the NoOps approach in enterprise mobility. You can consider Appcircle like an automated production line, where everything is transferred automatically between stations.&lt;/p&gt;

&lt;p&gt;Appcircle automates DevOps processes to achieve NoOps to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  streamline mobile CI/CD&lt;/li&gt;
&lt;li&gt;  deliver mobile apps faster&lt;/li&gt;
&lt;li&gt;  increase productivity&lt;/li&gt;
&lt;li&gt;  automate mobile app releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/contact?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=what_is_noops_and_how_to_achieve_noops_in_mobile_app_development" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9pfolgwlhw0k8nzem9v.png" alt="ContactUs" width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>noops</category>
    </item>
    <item>
      <title>What is CI/CD and Why Do You Need CI/CD in Mobile App Projects</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:36:34 +0000</pubDate>
      <link>https://dev.to/appcircelio/what-is-ci-cd-and-why-do-you-need-ci-cd-in-mobile-app-projects-ip1</link>
      <guid>https://dev.to/appcircelio/what-is-ci-cd-and-why-do-you-need-ci-cd-in-mobile-app-projects-ip1</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/what-is-ci-cd-why-mobile/" rel="canonical"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KseMRsB7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/04/Why-do-you-need-mobile-CI-CD-845x321.png.webp" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading Time: 4 minutes&lt;/p&gt;

&lt;p&gt;As the backend systems are evolving to cloud-native apps and the frontend clients are unifying around mobile apps, continuous integration (CI) and continuous delivery (CD) are getting more and more crucial in every software development project regardless of the size and the scope. Mobile app development is one of the areas that can benefit from CI/CD the most.&lt;/p&gt;

&lt;p&gt;This article is the first in our CI/CD article series, where we answer the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What is CI/CD and why do you need CI/CD in mobile app projects? (This article)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://appcircle.io/blog/10-operational-business-benefits-of-mobile-ci-cd/"&gt;What are the operational and business benefits of CI/CD?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://appcircle.io/blog/common-problems-mobile-app-lifecycle-how-appcircle-solves/"&gt;How does Appcircle solve the common problems in mobile app lifecycle?&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our first article, we will start with a quick introduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Continuous Integration and Continuous Delivery?
&lt;/h2&gt;

&lt;p&gt;Continuous Integration (or CI for short) is the automated way of building every code pushed to a common code repository. This build process is ideally enhanced with workflows for steps like code reviews, code analysis and unit tests.&lt;/p&gt;

&lt;p&gt;Continuous Delivery (or CD for short), as the name indicates, is the automated delivery of the application with environment deployment (e.g. a development or production variant), code signing, versioning and sharing the successfully built releases with the related users (e.g. testers).&lt;/p&gt;

&lt;h3&gt;
  
  
  So, then, what is a pipeline (CI and CD)?
&lt;/h3&gt;

&lt;p&gt;When you consider CI and CD together, we get a full application "pipeline". With CI, you build your app and push it towards the pipeline. With CD, you ensure the app is transported through the pipeline properly to the correct recipients.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do CI and CD relate to some of the most prominent problems in mobile app projects?
&lt;/h2&gt;

&lt;p&gt;After laying the groundwork, let's explain why you need CI/CD in mobile app development, starting with the causes, the problems that are commonly observed in mobile app lifecycle and how CI/CD addresses them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Code repositories being used like a file storage, not as a collaboration tool: Automated CI/CD process encourages frequent code pushes.&lt;/li&gt;
&lt;li&gt;  Low application quality with issues slipping through the cracks in the end user release: Automated CI/CD process eliminates manual operation and possibility of human error.&lt;/li&gt;
&lt;li&gt;  Long build times of large apps with multiple dependencies: Agent-based CI/CD tools free the local environments from the resource and time-consuming build process.&lt;/li&gt;
&lt;li&gt;  Rapidly changing landscape with frequent updates to mobile operating systems and development frameworks: CI/CD tools handle the environment to be up to date while providing a wide range of options for build configurations.&lt;/li&gt;
&lt;li&gt;  Complexities and delays caused by application code signing due to the unique requirements of Apple and Google: With CI/CD all the complex steps in the app lifecycle are automated and the developers are isolated from these complexities&lt;/li&gt;
&lt;li&gt;  Complicated set of build artifacts to gather at every step of the app lifecycle: The CI/CD tools automatically collect and deliver all the artifacts from a single convenient point of access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all these problems and many more, it is indeed necessary to have a proper CI/CD solution in place and we can now have a more detailed look on why you would need CI and CD in mobile app projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do you need Continuous Integration in mobile app projects?
&lt;/h2&gt;

&lt;p&gt;CI is not just about using a source control system and resolving conflicts when multiple developers are working on the code. It is about establishing a discipline and a standard for development.&lt;/p&gt;

&lt;p&gt;The reason for this is that even if a team is using a common code repository but without an automated build process, the general tendency is to use it like a backup tool and push changes at the end of the day.&lt;/p&gt;

&lt;p&gt;From this perspective, one of the most important advantages of CI lies in the automated builds, which is then enhanced with automated workflow steps such as static code analysis, code quality review and of course, integration with testing automation or manual testing distribution.&lt;/p&gt;

&lt;p&gt;CI enables shorter release and test cycles, which is even more crucial with the unique complexities and error-prone nature of mobile apps.&lt;/p&gt;

&lt;p&gt;For instance, if you are developing your apps with a native or hybrid cross-platform framework, which is highly likely to have a single-project structure, building the same project for iOS and Android requires totally independent efforts, which can be automated with mobile CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do you need Continuous Delivery in mobile app projects?
&lt;/h2&gt;

&lt;p&gt;Similarly, CD is not just about uploading and downloading multiple app binaries for different environments. CD automates the release process and eliminates the human factor, which again enables shorter release cycles and producing more reliable releases.&lt;/p&gt;

&lt;p&gt;In mobile apps, one of the most crucial pain points is the environment switches and with an automated CD process, you can easily get the same application for multiple environments.&lt;/p&gt;

&lt;p&gt;Another point that makes mobile CD more complex but also more important is code signing, which is not applicable for the majority of the web applications. Especially for iOS apps, there are different code signing procedures for different distribution methods (ad hoc, enterprise distribution and public distribution) and manual signing is indeed a complex process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;These are just the tip of the iceberg in terms of the reasons and the benefits of using CI/CD in mobile development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/blog/10-operational-business-benefits-of-mobile-ci-cd/"&gt;In our next article, we discuss and list the benefits of CI/CD both from a general and from mobile development perspective.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Appcircle is an all-in-one automated mobile CI/CD platform is that makes mobile CI/CD best practices accessible to everyone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/contact?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=what_is_ci_cd_and_why_do_you_need_ci_cd_in_mobile_app_projects"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9pfolgwlhw0k8nzem9v.png" alt="ContactUs" width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>mobiledev</category>
    </item>
    <item>
      <title>Why Do You Need a Dedicated Mobile CI/CD Platform Instead of Jenkins</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:35:14 +0000</pubDate>
      <link>https://dev.to/appcircelio/why-do-you-need-a-dedicated-mobile-ci-cd-platform-instead-of-jenkins-2jg9</link>
      <guid>https://dev.to/appcircelio/why-do-you-need-a-dedicated-mobile-ci-cd-platform-instead-of-jenkins-2jg9</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a href="https://appcircle.io/blog/mobile-ci-cd-devops-platform-comparison-jenkins/" rel="canonical"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CtD3k_UJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/12/Jenkins-for-Mobile-DevOps-845x321.png.webp" width="800" height="304"&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Reading Time: 4 minutes&lt;/p&gt;

&lt;p&gt;Jenkins is a general-purpose CI/CD tool, but you may be asking how you can use Jenkins for mobile app builds or if Jenkins is useful for mobile CI/CD. Jenkins is one of the most popular tools for DevOps processes, however mobile DevOps may benefit from specialized tools that meet the unique needs of mobile apps.&lt;/p&gt;

&lt;p&gt;In this article, we will discuss how Jenkins manages mobile DevOps processes, and show how it differs from a CI/CD solution that's specifically designed for mobile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is Jenkins and what is it good for?
Jenkins is highly flexible and configurable CI/CD platform with a wide range of plug-ins. This interoperability and flexibility makes Jenkins a preferred tool, however sometimes, plug-ins are needed even for the most basic tasks, but it syncs with a wide range of platforms, operating systems, programming languages and technologies. That also allows Jenkins to integrate with other software/tools used in your company’s tech stack, such as Maven, Gitlab, SonarQube, Selenium.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a result, its complexity and dependency is high since everything is handled by manual efforts of integrating with the right plugins.&lt;/p&gt;

&lt;p&gt;You are also dependent on third parties, and whenever there is an issue, you have to get support from the plug-in developers themselves, the Jenkins community, or even whoever configured the platform in the first place.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How is Jenkins used for DevOps?
Jenkins works as a deployable solution, which is highly scalable. It can be used in different DevOps stacks with the right configuration and the plugins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From student projects to enterprise products, Jenkins can cover most of your needs if you deploy and set up everything by yourself. However, Jenkins can be hard to figure out as its unintuitive and outdated UI can be confusing for first-time users.&lt;/p&gt;

&lt;p&gt;It may take a decent amount of time and effort to for new users to be comfortable with using Jenkins.&lt;/p&gt;

&lt;p&gt;For this reason, there are many number of emerging tools that specialize on specific stacks to alleviate such issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is Jenkins suitable for enterprise use and teams?
Jenkins can be used in enterprises, however it requires a huge deal of customization, setup and maintenance for enterprise-oriented or team-based tasks. Since it’s not designed for large teams in mind, the management of Jenkins is generally done by a single user, which leads to tracking and accountability problems with the pushed code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jenkins has the risk of creating a singular “hero user” within a large team, which creates a potentially problematic dependency on top of other third-party dependencies for plugins and such.&lt;/p&gt;

&lt;p&gt;Assigning separate users or groups to split tasks or jobs is not available and Jenkins doesn’t allow one developer to reach the activities done by another team member, readily. Tracking the overall release progress becomes a challenging job for larger projects and enterprises. Reporting is also a major feature lacked by Jenkins.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How can Jenkins be used for mobile CI/CD?
Jenkins is very much like a Swiss Army Knife. It can work with many different stacks, but it’s not specialized in any of those; so in cases of complex and unique stacks like mobile, it requires a big deal of configuration, management, and many different plug-ins to set up a full pipeline.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thus, Jenkins can solve the most common problems, but falls short in anything that requires precision without additional tools.&lt;/p&gt;

&lt;p&gt;For instance, there is no storage for previous builds and artifacts. Therefore, users need to store their former documents and artifacts manually to reach back later.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is it actually possible to use Jenkins with high productivity for mobile CI/CD?
Build and deployment of mobile apps with Jenkins is not an easy task, and you have to maintain it all by yourself, without official support. Also, even if Jenkins itself is scalable, you will have issues with the build environments such as the unique requirement of a Mac to build iOS apps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jenkins is designed with freedom and flexibility in mind, but mobile stacks do not have the same freedom that backend stacks have. It is tightly controlled by the constantly changing rules and standards by Apple and Google. This increases not just the setup effort but the maintenance effort as well for mobile stacks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What are the concerns of using Jenkins as a mobile CI/CD tool?
Especially for iOS, the build environments must be on a Mac and if you have multiple projects or multiple build it is difficult to isolate them or create queues by default. Scaling is another issue. You can easily scale the Jenkins instance itself, but the scaling of build environments requires additional efforts and a special set of knowledge for macOS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When using Jenkins for mobile app projects, the build environments usually become the performance and operations bottleneck.&lt;/p&gt;

&lt;p&gt;With a cloud-based dedicated mobile CI/CD platform, you have higher performance all around as all relevant specifications and extensive automation is possible without third-party tools.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What is the alternative of Jenkins for mobile CI/CD?&lt;br&gt;
A special case for mobile CI/CD is that the DevOps processes are usually handled by the developers themselves.&lt;br&gt;
Mobile CI/CD is differentiated by the specific knowledge and the close attention required for the build and deployment processes.&lt;br&gt;
With all the concerns specified in the previous items, it is common for mobile developers or any mobile DevOps specialist to look for a Jenkins alternative for mobile DevOps.&lt;br&gt;
There are actually dedicated mobile CI/CD platforms that makes mobile CI/CD accessible by everyone by providing the best of both worlds set of features with high flexibility and ease of use.&lt;br&gt;
Dedicated mobile CI/CD platforms that can be used in the cloud in a fully scalable manner without the need for any maintenance or hardware investment or they can be deployed on-premises for enterprises. With this way, there is no compromise from what Jenkins offers with significant value added.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Benefits of using an dedicated mobile CI/CD platform as an alternative to Jenkins&lt;br&gt;
With an enterprise-oriented, specialized mobile CI/CD platform like Appcircle, you have native integrations and automated workflows.&lt;br&gt;
Any issue or maintenance is handled from a single point of contact with full support.&lt;br&gt;
As authorization and role management is available, proper collaboration can be achieved by the enterprise teams.&lt;br&gt;
Continuous integration and delivery in mobile DevOps have a unique set of requirements and demand a dedicated mobile CI/CD tool for the highest productivity, as Jenkins alone cannot achieve.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With Appcircle, you can manage the full CI/CD pipeline of mobile apps without the need for complex integrations and multiple tools. Appcircle is specialized on the specific needs of mobile apps.&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>mobile</category>
      <category>cicd</category>
    </item>
    <item>
      <title>SECURITY IN APPCIRCLE</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:34:13 +0000</pubDate>
      <link>https://dev.to/appcircelio/security-in-appcircle-4lh2</link>
      <guid>https://dev.to/appcircelio/security-in-appcircle-4lh2</guid>
      <description>&lt;p&gt;&lt;a href="https://appcircle.io/blog/security-in-appcircle/" rel="canonical"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H1Ki5Qwo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2021/01/Security-in-Appcircle-845x321.png.webp" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading Time: 3 minutes&lt;/p&gt;

&lt;p&gt;A well-established CI/CD pipeline gets entwined with many enterprise processes and the security of the pipeline gets more and more crucial. In this article, we will outline how Appcircle ensures the security of your CI/CD pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Security in Appcircle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Appcircle connects to your repository to fetch your projects and branches so that you can build your apps in the cloud, however the source codes are not stored in Appcircle infrastructure.&lt;/li&gt;
&lt;li&gt;  The source code is fetched for the build only to a brand-new build agent specifically created for that build. Once the build is complete, the agent is killed along with all the source code and any leftover data from the build.&lt;/li&gt;
&lt;li&gt;  GitHub, GitLab and Bitbucket are all supported by Appcircle through oAuth. The agents connecting to your repositories follow the protocols enforced by the repository providers.&lt;/li&gt;
&lt;li&gt;  For all other repository providers, the only provided option is to use SSH connections for the utmost security.&lt;/li&gt;
&lt;li&gt;  Appcircle never modifies the contents of the repository itself. During the build, it is possible to modify the contents with custom scripts and workflow steps by the user, but these are not permanent and only applicable for the local copy.&lt;/li&gt;
&lt;li&gt;  Appcircle team does not have access to the source code for any means and purposes. The oAuth tokens or the SSH keys are stored securely in an AWS vault and they are only used to fetch the branch and commit list or during the build.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Infrastructure Security in Appcircle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Appcircle fully runs on AWS, who considers cloud security as the highest priority with many built in security features and services. For more information on the cloud security, please refer to the &lt;a href="https://aws.amazon.com/security/"&gt;AWS Security Center&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Appcircle is built on Kubernetes. For every single build, there is a brand-new virtual machine specifically created for you. This enables Appcircle to keep your source codes secure and isolated from others.&lt;/li&gt;
&lt;li&gt;  The virtual build agents run on an internal private network and they are not directly accessible from the outside.&lt;/li&gt;
&lt;li&gt;  Even your concurrent builds run on different containers which eliminate the chances of conflicts and instability.&lt;/li&gt;
&lt;li&gt;  After the build is done, the virtual machine is killed and there is no residual data storage.&lt;/li&gt;
&lt;li&gt;  Only the selected build artifacts and the build logs are retained, and they are not accessible by the Appcircle team.&lt;/li&gt;
&lt;li&gt;  The same level of security is also applicable for the Appcircle simulator/emulator. A brand new virtual device is generated for every session and once the session ends, the virtual device is killed and no residual data is stored.&lt;/li&gt;
&lt;li&gt;  The same also applies for the shared app preview links. For every new session, a new device is generated even though the app is the same and you can set an expiration date for the public links as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Security in Appcircle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  All secret data, including the keys, signing identities, environment variables and secrets are stored in an AWS vault. Since these are highly confidential and crucial elements for DevOps, Appcircle provides the best-in-class security for any private element.&lt;/li&gt;
&lt;li&gt;  For instance, the secret environment variables (both text keys and files) are not accessible externally. They can only be utilized in a build and they cannot be exposed by the build module users (e.g. they are automatically removed from the build logs). They cannot be modified and the only way to update them is deleting and re-adding.&lt;/li&gt;
&lt;li&gt;  As for the signing identities, again, if a user does not have access to the signing identities module, they cannot view, download or edit the signing identities while being able to use them in builds.&lt;/li&gt;
&lt;li&gt;  You can be highly confident when sharing the build logs with developers or others for any kind of assistance needed. They can see neither your secrets nor the signing identities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enterprise-Grade User Management and Logging in Appcircle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  For enterprises, Appcircle provides fine-grained permissions for all submodules so that you can manage which user can access which module in what level. This makes it well suited for team without the need to worrying about widespread access.&lt;/li&gt;
&lt;li&gt;  Appcircle provides logs for all modules so that the enterprise admin can track which build is done by whom or who ran an in-browser app preview session and when. This provides full transparency and visibility across the entire platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Billing Safety with Appcircle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Appcircle uses &lt;a href="https://stripe.com/"&gt;Stripe&lt;/a&gt;, which is world's one of the most used and trusted payment platform. Your credit card information is never stored in Appcircle and does not pass through Appcircle infrastructure.&lt;/li&gt;
&lt;li&gt;  All transactions are done exclusively through the Stripe platform directly and transactions are done with 3D Secure for the supported credit cards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Even Higher Security with Private Cloud and On-Premise Options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  The Kubernetes-based next generation architecture of Appcircle enables private cloud and on-premise deployments as well. Even though Appcircle provides high security, you can optionally ensure that the full CI/CD pipeline is hosted in your own infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Appcircle, you can manage the full CI/CD pipeline of mobile apps in a secure and trusted environment.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>HOW TO DEPLOY IOS AND ANDROID APPS TO AWS DEVICE FARM AND RUN TESTS AUTOMATICALLY</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:33:03 +0000</pubDate>
      <link>https://dev.to/appcircelio/how-to-deploy-ios-and-android-apps-to-aws-device-farm-and-run-tests-automatically-1i7h</link>
      <guid>https://dev.to/appcircelio/how-to-deploy-ios-and-android-apps-to-aws-device-farm-and-run-tests-automatically-1i7h</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a href="https://appcircle.io/blog/how-to-deploy-ios-and-android-apps-to-aws-device-farm-and-run-tests-automatically/" rel="canonical"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yIVAVqSL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Appcircle-with-AWS-Device-Farm-for-CT-845x321.png.webp" width="800" height="304"&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Reading Time: 5 minutes&lt;/p&gt;

&lt;p&gt;Appcircle is a mobile CI/CD platform that provides a fully automated environment to manage mobile app CI, CD and CT (continuous testing).&lt;/p&gt;

&lt;p&gt;For continuous testing, you have a number of options with Appcircle and you can use AWS Device Farm for multiple-device testing. In this article, we will be integrating AWS Device Farm to your mobile CI/CD workflow in a few easy steps so that you can deploy apps and run tests automatically for a complete CI-CD-CT.&lt;/p&gt;

&lt;p&gt;Manage your mobile CI, CD and CT (continuous testing) with Appcircle&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/start"&gt;Start for Free&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding AWS Device Farm Step to the Build Workflow
&lt;/h2&gt;

&lt;p&gt;AWS Device Farm is an application testing service that enables you to run your tests concurrently on multiple mobile devices to speed up the execution of your tests and generates videos and logs to help you quickly identify issues with your app. Appcircle is integrated with AWS Device Farm for continuous testing. You can build your app in Appcircle and deploy it directly to AWS Device Farm to run automated tests.&lt;/p&gt;

&lt;p&gt;With the "AWS Device Farm Deploy and Run" step in Appcircle, you can directly deploy your binaries and test scripts during the build to the specified AWS Device Farm project and run tests.&lt;/p&gt;

&lt;p&gt;To start, you need to add the&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  "Android Build for UI Testing" step for Android&lt;/li&gt;
&lt;li&gt;  "Xcodebuild Build for Testing" step for iOS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;followed by the "AWS Device Farm Deploy and Run" step to the workflow from the &lt;a href="https://docs.appcircle.io/workflows/why-to-use-workflows#workflow-marketplace"&gt;workflow marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you just want to run tests, you can also remove other build steps such as "Android Build" or "Xcodebuild for Devices".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wuRI-3jJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-1.png" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Android workflow for AWS Device Farm&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8VKoyUyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-2.png" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iOS workflow for AWS Device Farm&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the AWS Device Farm Step in the Workflow
&lt;/h2&gt;

&lt;p&gt;Once these steps are added, press save to exit the workflow edit mode and click on the AWS Device Farm step.&lt;/p&gt;

&lt;p&gt;The input values are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AWS Access Key ID: Enter the AWS access key ID. &lt;a href="https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys"&gt;For more information, you can refer here.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  AWS Secret Access Key: Enter the secret access key associated with the ID entered above. &lt;a href="https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys"&gt;For more information, you can refer here.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  AWS Default Region: Enter the AWS region where for the run. &lt;a href="https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints"&gt;You can find the endpoint codes for the regions here.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is highly recommended to add the keys as &lt;a href="https://docs.appcircle.io/environment-variables/managing-variables"&gt;secret environment variables&lt;/a&gt; instead of typing them here for security purposes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AWS Project ARN: The ARN of the project for deploy and run.&lt;/li&gt;
&lt;li&gt;  AWS Device Pool Arn: The ARN of the device pool for the run.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm Run Name Prefix: The name prefix for the run to be scheduled. AWS Device Farm Run Test Type: The type of the test for the run.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm File Upload Time Out: Time out duration (seconds) for the test file upload. The step is skipped if the time out is reached.&lt;/li&gt;
&lt;li&gt;  Maximum Waiting Time for Run Test Results: Time out duration (seconds) for the AWS Device Farm run. The step is skipped if this duration is reached, but the test execution continues in AWS Device Farm.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm App ARN: The ARN of the application package to run tests against, created with CreateUpload. If you don't set this parameter, the subsequent App Upload File Name, App Upload Type and App Upload File Path parameters are required.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm App Upload File Name: The file to be uploaded. The name should not contain any forward slashes (/ ). If you are uploading an iOS app, the file must have an .ipa extension. If you are uploading an Android app, the file must have an .apk extension.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm App Upload Type: The upload type of the file.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm App Upload File Path: The file path for the app upload.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm Test ARN: The ARN of the uploaded test to be run. If you don't set this parameter, the subsequent Test Upload File Name, Test Upload Type and Test Upload File Path parameters are required.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm Test Upload File Name: The test file to be uploaded. The file must have a .zip extension.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm Test Upload Type: The upload type of the test.&lt;/li&gt;
&lt;li&gt;  AWS Device Farm Test Upload File Path: The file path for the test upload.&lt;/li&gt;
&lt;li&gt;  AWS Test Spec ARN: The ARN of the uploaded test spec to be run.&lt;/li&gt;
&lt;li&gt;  AWS Test Spec Upload File Name: The test spec file to be uploaded.&lt;/li&gt;
&lt;li&gt;  AWS Test Spec Upload Type: The upload type of the test spec.&lt;/li&gt;
&lt;li&gt;  AWS Test Spec Upload File Path:The file path for the test spec upload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the details of the AWS Device Farm-specific parameters, please refer to the following documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.aws.amazon.com/cli/latest/reference/devicefarm/create-upload.html"&gt;create-upload --- AWS CLI Command Reference&lt;/a&gt; -- to upload apps and tests&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.aws.amazon.com/cli/latest/reference/devicefarm/schedule-run.html"&gt;schedule-run --- AWS CLI Command Reference&lt;/a&gt; -- to run tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running the Build with the AWS Device Farm Step
&lt;/h2&gt;

&lt;p&gt;After you save your settings, you can &lt;a href="https://docs.appcircle.io/build/build-manually-or-with-triggers"&gt;run the build automatically with the triggers or run it manually&lt;/a&gt; and the step will be executed accordingly. You can view the details of the upload operation in the build logs:&lt;/p&gt;

&lt;p&gt;After you save your settings, you can run the build and the step will be executed accordingly. You can view the details of the AWS Device Farm Deploy and Run step in the build logs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-3.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CPPZXW6C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-3.png" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building and deploying apps automatically for AWS Device Farm&lt;/p&gt;

&lt;p&gt;The full details of the tests are accessible in the &lt;a href="https://console.aws.amazon.com/devicefarm/"&gt;AWS Device Farm console&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-4.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c99MMyj1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/AWS-Device-Farm-with-Appcircle-4.png" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An automated test run on AWS Device Farm&lt;/p&gt;

&lt;p&gt;With Appcircle, you can automate the full lifecycle of your mobile app with continuous integration, continuous delivery and continuous testing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GUIDE TO BUILDING FLUTTER WEB APPS WITH APPCIRCLE</title>
      <dc:creator>Sophie @Appcircle</dc:creator>
      <pubDate>Wed, 08 Sep 2021 16:29:06 +0000</pubDate>
      <link>https://dev.to/appcircelio/guide-to-building-flutter-web-apps-with-appcircle-2914</link>
      <guid>https://dev.to/appcircelio/guide-to-building-flutter-web-apps-with-appcircle-2914</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a href="https://appcircle.io/blog/guide-to-building-flutter-web-apps-with-appcircle/" rel="canonical"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qyeHki8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Building-Flutter-Web-Apps-With-Appcircle-845x321.png.webp" width="800" height="304"&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Reading Time: 2 minutes&lt;/p&gt;

&lt;p&gt;Appcircle is a mobile CI/CD platform that provides a fully automated environment to manage mobile app lifecycle end-to-end, transforming DevOps to NoOps with the best practices and the Flutter framework is an open-source user interface toolkit created by Google.&lt;/p&gt;

&lt;p&gt;Flutter app development is done with the Dart language and you can develop iOS, Android, and web apps with Flutter.&lt;/p&gt;

&lt;p&gt;Appcircle supports the full lifecycle of Flutter apps for all Flutter CI/CD needs. In this article, we will be building a Flutter web app with Appcircle. &lt;a href="https://appcircle.io/blog/guide-to-automated-mobile-ci-cd-for-flutter-projects-with-appcircle/"&gt;For a full overview on mobile CI/CD with Flutter and Appcircle, please refer to this post.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Build Flutter mobile and web apps with Appcircle&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/start"&gt;Start for Free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your app supports Flutter Web, you can also build the Flutter web app along with the &lt;a href="https://appcircle.io/blog/guide-to-automated-mobile-ci-cd-for-flutter-projects-with-appcircle/"&gt;Flutter iOS or Android build&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flutter Web Build is available as a workflow step in the workflow marketplace. Just configure your project as you would for iOS or Android and add the Flutter Build for Web step anywhere after the Flutter Install step to include a web build in the workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eJ2bclZZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-1.png.webp" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to build your Flutter project only for web, you can &lt;a href="https://appcircle.io/blog/guide-to-automated-mobile-ci-cd-for-flutter-projects-with-appcircle/#creating-a-build-profile-for-a-flutter-project"&gt;add a Flutter Android project in the standard way&lt;/a&gt;, save your project configuration once, and then remove all the Android-related steps from the build workflow.&lt;/p&gt;

&lt;p&gt;In this case, the workflow may look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iED4WoC5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-2.png.webp" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to deploy your web output automatically, you can use a &lt;a href="https://github.com/appcircleio/appcircle-custom-script-component/"&gt;Custom Script&lt;/a&gt; or &lt;a href="https://appcircle.io/blog/how-to-deploy-mobile-app-build-artifacts-automatically-to-amazon-s3-with-appcircle/"&gt;upload it to Amazon S3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once your build is configured, it can be built &lt;a href="https://appcircle.io/blog/guide-to-automated-mobile-ci-cd-for-flutter-projects-with-appcircle/#starting-a-build-and-after-a-build"&gt;manually or automatically in the same way with other apps&lt;/a&gt;. Your app will be built in the beta channel to enable web builds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-3.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T9WEsXdf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-3.png" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a build, you can download the web build output manually &lt;a href="https://appcircle.io/blog/guide-to-automated-mobile-ci-cd-for-flutter-projects-with-appcircle/#starting-a-build-and-after-a-build"&gt;from the build artifact list&lt;/a&gt; as the &lt;code&gt;web.zip&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-4.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mUGnqFPq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://appcircle.io/wp-content/uploads/2020/10/Flutter-Web-4.png.webp" alt="" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Appcircle, you can manage the CI/CD of your Flutter web, iOS and Android apps for free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appcircle.io/start"&gt;Start Using Appcircle Now&lt;/a&gt;&lt;/p&gt;

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