<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>windmill blog feed</title>
    <description></description>
    <atom:link href="/blog/feed.xml" rel="self" type="application/rss+xml" />
    <language>en-us</language>
    <copyright>Creative Commons Attribution 3.0 License (CC-BY 3.0)</copyright>
    <pubDate>Mon, 21 Sep 2020 07:25:47 +0300 </pubDate>
    <lastBuildDate>Mon, 21 Sep 2020 07:25:47 +0300</lastBuildDate>
    <docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
    <generator>jekyll</generator>
    <ttl>1140</ttl>
    <link></link>
      <item>
        <title>The Windmill source code is now public</title>
        <link>/blog/The-Windmill-source-code-is-now-public.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/The-Windmill-source-code-is-now-public.html</guid>
        <description><![CDATA[<ul>
  <li>
    <p><a href="https://github.com/qnoid/windmill-osx">Windmill on the Mac</a> <br />
Windmill on the Mac is a native macOS application written in Swift 5 on Xcode 10 targetting macOS 10.14. The codebase is about 16k LOC.</p>
  </li>
  <li>
    <p><a href="https://github.com/qnoid/windmill-ios">Windmill on the iPhone</a> <br />
Windmill on the iPhone is a native iOS app written in Swift 5 on Xcode 10 targetting iOS 12.2. The codebase is about 5k LOC.</p>
  </li>
  <li>
    <p><a href="https://github.com/qnoid/windmill-api">Windmill REST API</a> <br />
The Windmill REST API is a Java EE 8 implementation written in Java 8 using JAX-RS. The codebase is about 7.5k LOC.</p>
  </li>
</ul>
]]></description>
        <pubDate>Thu, 09 Apr 2020 08:43:22 +0300</pubDate>
      </item>
      <item>
        <title>The sunset of Windmill</title>
        <link>/blog/The-sunset-of-Windmill.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/The-sunset-of-Windmill.html</guid>
        <description><![CDATA[<p>The <a href="https://windmill.io/changelog/">last version</a> of <a href="https://windmill.io/mac/">Windmill on the Mac</a> is 3.1.2. There are no plans to support Xcode 11 or any future versions of Xcode. <a href="https://windmill.io/iphone/">Windmill on the iPhone</a> never made it to the App Store.</p>

<p>Windmill made continuous delivery of iOS apps accessible by moving away from the idea that developers need to manage and maintain a set of scripts alongside some obscure configuration as part of a toolchain.</p>

<p>Windmill was designed to uphold developers’ privacy and security by not asking them to share their credentials or private keys.</p>

<p>The architecture of Windmill also meant that developers didn’t have to pay for infrastructure on the cloud.</p>

<p>Unfortunately, <a href="https://mjtsai.com/blog/2019/08/08/windmill-for-iphone-rejected-from-the-app-store/">a developer tool like Windmill is not possible within the Apple ecosystem</a>.</p>

]]></description>
        <pubDate>Sat, 04 Jan 2020 09:22:12 +0200</pubDate>
      </item>
      <item>
        <title>Windmill - Introducing Workflow</title>
        <link>/blog/Windmill-Introducing-Workflow.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/Windmill-Introducing-Workflow.html</guid>
        <description><![CDATA[<p>Up until now, you could use Windmill to monitor the master branch in your project repository while working towards a release candidate for your app. With the introduction of <a href="/mac/getting_started/#workflow">Workflow</a>, Windmill opens up to provide <br /> <code class="highlighter-rouge">support across your codebase to every stage in your development workflow.</code></p>

<p>Additionally, with <a href="/changelog">version 3</a>, Windmill can now <a href="/mac/distribution"><code class="highlighter-rouge">distribute</code></a> your app so that you can install it to registered devices. Effectively Windmill helps you take your app from a feature branch all the way to the iPhone.</p>

<h1 id="individuals">Individuals</h1>

<p>As a developer working on a feature branch, you can take advantage of Windmill whenever you commit, to make sure <a href="/mac/basics/#error-highlighting">your code has no errors</a>, your <a href="/mac/basics/#test-failure-highlighting">tests still pass</a>, and you have a <a href="/mac/basics/#test-summary">test summary</a>.</p>

<p><img src="/assets/static/images/2019-06-11-Windmill-Phase-3/feature_branch.png" alt="" /></p>

<p>Once the time comes to merge to master, Windmill will ensure there are no regressions as well as enabling you to <a href="/mac/xcode/#install-the-app-on-a-device">install your app on a device</a>. Eventually, you will upload to <a href="/mac/xcode/#upload-an-app-to-itunes-connect">iTunes Connect</a> as you prepare for a public beta or release to the App Store.</p>

<p><img src="/assets/static/images/2019-06-11-Windmill-Phase-3/merge_master.png" alt="" /></p>

<h1 id="teams">Teams</h1>

<p>With <a href="/mac/getting_started/#workflow">Workflow</a>, small teams in the same office space, can now benefit from Windmill too. Whereas an individual developer runs Windmill on a development Mac, as a team it is recommended that you use a dedicated Mac to monitor your “master” branch. To make the most of your workflow, you can introduce a “develop” branch in order to have a shorter feedback loop on your way to master.</p>

<p><img src="/assets/static/images/2019-06-11-Windmill-Phase-3/team_setup.png" alt="" /></p>

<h1 id="conclusion">Conclusion</h1>

<p><a href="/mac/getting_started/#workflow">Workflow</a> changes everything about what Windmill does, where it comes in and how it supports the development lifecycle for your app. I strongly advise you to read the updated <a href="/faq">Frequently Asked Questions</a>.</p>

<p>I can’t wait to make <a href="/iphone">Windmill on the iPhone</a> available which has been <a href="/blog/Windmill-on-the-iPhone-goes-into-beta.html">in beta</a> for 3 weeks now and in review with Apple for 13 weekdays.</p>

<p>Whether you are an individual developer or working as part of a team, Workflow is the best opportunity to give Windmill another try and take it for a spin. It is <strong>available for free</strong> <a href="/mac">on the Mac</a>.</p>

<p>This is a transformative milestone for Windmill, turning it into a Quality Assurance tool for your development workflow. Continuous delivery of iPhone apps will never be the same again after this.</p>

<p>As always, you can reach me on <a href="https://twitter.com/windmill_io">Twitter</a>, <a href="mailto:qnoid@windmill.io">email</a> or <a href="imessage://qnoid@windmill.io">iMessage</a>.</p>
]]></description>
        <pubDate>Tue, 11 Jun 2019 18:06:58 +0300</pubDate>
      </item>
      <item>
        <title>Windmill on the iPhone goes into beta</title>
        <link>/blog/Windmill-on-the-iPhone-goes-into-beta.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/Windmill-on-the-iPhone-goes-into-beta.html</guid>
        <description><![CDATA[<p>Announcing the beta release of Windmill on the iPhone! Windmill helps you, the iOS Developer, deliver your apps in a reliable and predictable way. Its main goal is to provide quality assurance.</p>

<p><a href="/mac">Windmill on the Mac</a> continuously monitors for code changes, building, testing, archiving and exporting your app.</p>

<p><a href="/iphone">Windmill on the iPhone</a> further enables the distribution of your app to registered devices.</p>

<p>On a mission to make continuous delivery of iPhone apps during development both ubiquitous and accessible, Windmill kicks off with an ease of setup, offering an unparalleled user experience, built with security and privacy in mind.</p>

<h2 id="ease-of-setup">Ease of setup</h2>

<p>With Windmill on the Mac <a href="/mac/getting_started">monitoring your project</a>, use Windmill on the iPhone to <a href="/iphone/getting_started/">purchase a subscription</a>.</p>

<p>As soon as you have an active subscription, Windmill on the Mac distributes a new build for your application.</p>

<p>You can request to be notified when the new build has successfully been distributed.</p>

<p><img src="/assets/static/video/distribute_application.mp4" alt="distributing an application" /></p>

<h2 id="unparalleled-user-experience">Unparalleled user experience</h2>

<p>Windmill on the Mac continuously monitors your project repository for code changes and is responsible for distributing new builds.</p>

<p>As soon as a new commit is made, on a successful run, <a href="/mac/distribution/">Windmill will distribute a new build for your application.</a>. This ensures that you never end up with a broken version.</p>

<p>Tap the <code class="highlighter-rouge">INSTALL</code> button to <a href="/iphone/basics/#install-your-application-over-the-air">download</a> and use your application. Windmill will start the process in the background. Once done, your application will be available on the home screen of your device.</p>

<p><img src="/assets/static/video/install_application.mp4" alt="installing an application" /></p>

<p>Windmill will display <a href="/iphone/integrated/#your-application-details-at-a-glance">detailed information about your application</a> at a glance which can prove useful when you demo or test it.</p>

<p><img src="/assets/static/images/2019-05-20-Windmill-on-the-iPhone-beta/application_details.png" alt="screenshot of details" /></p>

<p>Windmill also knows when a <a href="/iphone/integrated/#dealing-with-expired-distribution-certificates">distribution certificate expires</a> or your <a href="/iphone/integrated/#unsupported-ios">application requires a later iOS</a>, giving you useful alerts right on the iPhone when required.</p>

<p><img src="/assets/static/images/2019-05-20-Windmill-on-the-iPhone-beta/distribution_certificate_expired.png" alt="distribution certificate expired" />
<img src="/assets/static/images/2019-05-20-Windmill-on-the-iPhone-beta/unsupported_ios.png" alt="unsupported ios" /></p>

<h2 id="security-and-privacy"><a href="/mac/security/">Security and privacy</a></h2>

<p>Windmill uses your Apple credentials to secure your Windmill account and create a seamless experience across your devices. The added benefits are:</p>

<ul>
  <li>No extra password to remember.</li>
  <li>You remain anonymous to Windmill.</li>
</ul>

<p>Windmill leans on Xcode and its command line tools to sign, export and distribute your application without going anywhere near your private key and distribution certificate or asking you to share them.</p>

<p>Windmill installs apps only on devices <strong>you have chosen to register</strong> under your Apple Account. It does not store your Apple Account Credentials.</p>

<p>You can also give time-limited access to install your application by sharing a URL outside of Windmill on the iPhone and <a href="/iphone/basics/#delete-your-application">delete the build of your application</a> at will.</p>

<p><img src="/assets/static/video/delete_application.mp4" alt="deleting an application" /></p>

<p>This <a href="/privacy/">Privacy Policy</a> notice describes how data collected and shared with Windmill across devices and platforms is stored, processed and transmitted.</p>

<p><a href="/">Welcome to a future built with Windmill.</a></p>

<h2 id="requirements">Requirements</h2>
<ul>
  <li><a href="/changelog">Windmill on the Mac</a> version 3.0.0 or later (macOS 10.14 Mojave, Xcode 10).</li>
  <li>An iPhone with iOS 12.2 or later.</li>
  <li>An Apple Account.</li>
</ul>

<h2 id="the-beta">The beta</h2>

<p>The beta is invite only with invites going out today. Before you can get started you need to understand a few important details.</p>

<p>During the beta, <strong>subscriptions are free but expire in a matter of minutes</strong>. That makes the experience bite sized and not representative to that of a continuous delivery.</p>

<p>The beta is meant to be used for testing. Before you decide to get involved, please know that you have to put some time aside.</p>

<p>You also need to be signed in with the same Apple Account on both the iPhone and Mac. If you work in a team of developers as part of an organisation, you should use one common account.</p>

<p>To request an invite, send an <a href="imessage://qnoid@windmill.io">iMessage</a> to qnoid@windmill.io</p>

<h3 id="notices">Notices</h3>
<ul>
  <li>Keep in mind this is a beta version of Windmill and can stop working as expected at any time.</li>
</ul>

<h3 id="things-to-try">Things to try.</h3>

<ul>
  <li>Purchase a new subscription.
    <blockquote>
      <p>Does Windmill on the Mac distribute a new build for your application?</p>
    </blockquote>
  </li>
  <li>Install an application
    <blockquote>
      <p>Is the application downloaded in the background, installed, and can run as expected?</p>
    </blockquote>
  </li>
  <li>See the details of an application by tapping the info button.
    <blockquote>
      <p>Does everything look ok? Is any data missing or malformed?</p>
    </blockquote>
  </li>
  <li>Delete a distributed application.
    <blockquote>
      <p>Is the application removed successfully from the list? 
Please note that a subscription may still elapse between deleting an app and refreshing the list. If that happens, purchase a new subscription and refresh the list.</p>
    </blockquote>
  </li>
  <li>Distribute multiple applications.
    <blockquote>
      <p>Use Windmill on the Mac to distribute more than one application. Windmill on the Mac may only monitor one application at a time yet can still distribute many over time.</p>
    </blockquote>
  </li>
  <li>Read through the Help sections.
    <blockquote>
      <p>Is everything clearly explained? Is there a help section you think is missing?</p>
    </blockquote>
  </li>
  <li>Purchase a subscription on one device. Restore purchases on a second device.
    <blockquote>
      <p>Does the second device get access to the applications?</p>
    </blockquote>
  </li>
</ul>

<p>Use it as normal and report back any issues related to reliability, poor network conditions and device specific visual artefacts.</p>

<p>Thank you!</p>
]]></description>
        <pubDate>Tue, 21 May 2019 00:00:00 +0300</pubDate>
      </item>
      <item>
        <title>Developing an app towards its release</title>
        <link>/blog/Developing-an-app-towards-its-release.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/Developing-an-app-towards-its-release.html</guid>
        <description><![CDATA[<p>Developing an app is more than writing code. It is about releasing it to the world.
Windmill helps you establish a process, strongly aligned with Xcode, to support you along the way towards a release.</p>

<p>On every commit, <strong>Windmill builds the Application bundle</strong> as well as the <strong>Archive bundle</strong>. The Application bundle enables you to <a href="/mac/#launch-the-app-on-the-simulator">run your app on the Simulator</a>, say to use the <a href="https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows.html#//apple_ref/doc/uid/TP40015022-CH9-SW2">Xcode debugger to inspect and understand the view hierarchy</a> of your app.</p>

<video controls="" class="hero border">
	<source src="/assets/static/video/2018-06-01-Developing-an-app-towards-its-release/Debug.mp4" type="video/mp4" />
</video>

<p>The Archive bundle is used to create your project’s IPA <a href="/mac/#install_on_device">so that you can demo your app with your team</a> and later <a href="/mac/#upload_to_itunes_connect">prepare for a public beta using TestFlight or a release through the App Store.</a></p>

<p>When using Xcode to build and run your app, a collection of build settings referred to as <strong>build configuration</strong> is used to package the Application bundle.</p>

<p>To see what build configuration Xcode uses, open the Scheme editor. In Xcode choose <em>Product &gt; Scheme &gt; Edit Scheme…</em>, then select the Run action for the app.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/build_configuration.png" alt="build configuration" /></p>

<blockquote>
  <p>“A build configuration specifies a set of build settings used to build a target’s product in a particular way. For example, it is common to have separate build configurations for debug and release builds of a product.” - <a href="https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Build_Settings.html"> Apple, 2011-05-09: XcodeConcepts, Build Settings </a></p>
</blockquote>

<p>By default, Xcode uses the “Debug” build configuration, also used by Windmill, to build and test your app. To see what build configuration Windmill uses, open the Side panel. In Windmill choose <em>View &gt; Side Panel &gt; Show Side Panel</em>.</p>

<p>Equally like Xcode, Windmill uses the “Release” build configuration to produce the <strong>Archive bundle</strong>. The build configuration used by Windmill for the archive is also visible in the Side Panel.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/archive_configuration.png" alt="archive configuration" /></p>

<h1 id="how-does-that-help">How does that help?</h1>

<p>There are at least two ways to take advantage of using a “Debug” and a “Release” build configuration for the development and release of your app respectively.</p>

<h3 id="1-conditional-compilation">1. Conditional compilation</h3>

<p>You can use a build setting, one for a Swift codebase and one for Objective-C, that allows you to conditionally compile a block of code.</p>

<p>In Swift that is the “SWIFT_ACTIVE_COMPILATION_CONDITIONS” or “OTHER_SWIFT_FLAGS” setting.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/swift_active_compilations_conditions.png" alt="swift active compilations conditions flag" /></p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/other_swift_flags.png" alt="other swift flag" /></p>

<p>In Objective-C that is the “GCC_PREPROCESSOR_DEFINITIONS” setting.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/preprocessor_macros.png" alt="GCC preprocessor definitions flag" /></p>

<p>By default, Xcode sets the value to “DEBUG” for both Swift and Objective-C under your Application target.</p>

<p>You can use this value as an <strong>identifier</strong> in your code to conditionally compile a code path. As an example, this can be helpful if you want to use a different endpoint during development than the release.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/if_debug.png" alt="if debug" /></p>

<blockquote>
  <p>“Unlike the condition of an if statement, the compilation condition is evaluated at compile time. As a result, <strong>the statements are compiled and executed only if the compilation condition evaluates to true at compile time.</strong> The compilation condition can include the true and false Boolean literals, <strong>an identifier used with the -D command line flag</strong>, or any of the platform conditions listed in the table below.” - <a href="https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/doc/uid/TP40014097-CH33-ID539"> The Swift Programming Language (Swift 4.1), Apple, 2018-03-29: Language Reference, Conditional Compilation Block</a></p>
</blockquote>

<h3 id="2-file-management">2. File management</h3>

<p>Some build settings specify a file to be used. A common one is the “INFOPLIST_FILE” setting which specifies which property list file to use when packaging a bundle.</p>

<p class="center"><img src="/assets/static/images/2018-06-01-Developing-an-app-towards-its-release/infoplist_file.png" alt="Info property list file" /></p>

<p>As an example, for <a href="https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/plist/info/NSAppTransportSecurity">NSAppTransportSecurity</a> you want to make sure that any exception rules you have for development don’t leak into your release build. This is the case if your development build uses different endpoints to your release one.</p>

<h1 id="in-closing">In closing</h1>

<p>Windmill’s integration with Xcode’s build configurations gives you the ability to manage the development of your app towards a release in a streamlined way.</p>

<p>Regardless of how much you have a need for the “Debug” and the “Release” build configurations, Windmill uses them to build your app accordingly.</p>

<p>Have a look at <a href="https://help.apple.com/xcode/mac/10.0/#/itcaec37c2a6">Xcode’s build settings</a> to make the most of them for each build configuration.</p>

<p>Share your thoughts, experience and how useful Windmill has been so far to you. How has it changed the way in which you develop, iterate, get feedback and deliver your app?</p>

<p>If you are missing out, what’s preventing you from using it?</p>
]]></description>
        <pubDate>Fri, 01 Jun 2018 18:25:28 +0300</pubDate>
      </item>
      <item>
        <title>Windmill 2.0</title>
        <link>/blog/Windmill-2.0.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/Windmill-2.0.html</guid>
        <description><![CDATA[<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Did anyone try <a href="https://twitter.com/windmill_io?ref_src=twsrc%5Etfw">@windmill_io</a> yet? It fill an interesting niche for indie devs that do not want to use hosted services for continuous integration. And unlike the Xcode bot mess, I trust <a href="https://twitter.com/qnoid?ref_src=twsrc%5Etfw">@qnoid</a> to actually make it work.</p>&mdash; Peter Steinberger (@steipete) <a href="https://twitter.com/steipete/status/965604528644067329?ref_src=twsrc%5Etfw">February 19, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Windmill was <a href="/changelog/windmill-1.0.0.html">released on February 14th</a> so that us, iOS Developers, could have an <a href="/blog/Announcing-Windmill.html">alternative to Jenkins for automating building and testing our iOS apps</a>.</p>

<p>You can finally use a native macOS app <strong>alongside Xcode</strong>, <a href="/mac/xcode/#launch-the-app-on-the-simulator">which is highly integrated</a>, to <strong>continuously monitor</strong> for code changes on your git repository, enabling you to <strong>always</strong> have your app ready to do a demo, public test or release.</p>

<p>Although Windmill requires next to no effort to get started, the initial release did not make it any easier to identify and fix failures than going through the logs. Here is where version 2.0 comes in, alongside many great features to help you with delivering a high quality app.</p>

<h1 id="build-failures">Build Failures</h1>

<p>Windmill 2.0 <a href="/mac/basics/#error-highlighting">highlights and surfaces build errors</a> in a familiar way. This gives you a <strong>consistent view</strong> while debugging. It leaves no ambiguity as to how many errors there are, what these are and where each of them lies.</p>

<p class="center"><img src="/assets/static/images/error_summary.png" alt="error summary" /></p>

<p>It is purposely designed in a way so that you do not have to learn new visual cues, communication language or put the mental effort required to associate Windmill errors to Xcode ones.</p>

<p>Since Windmill proactively builds your app for testing, you will get build errors for your test code too.</p>

<h1 id="test-failures">Test Failures</h1>

<p>Another failure that Windmill will highlight is that of a test failing.</p>

<p>At a glance, you will be able to see if and how many tests have failed. In order to help you understand and cross check test failures with Xcode, Windmill will also give you a <a href="/mac/basics/#test-summary">test summary</a>.</p>

<p class="center"><img src="/assets/static/images/test_summary.png" alt="test summary" /></p>

<h1 id="more-useful-logs">More useful logs</h1>

<p>As Windmill goes through your project, it will stop as soon as it encounters a failure. The <a href="/mac/getting_started/#distilled-aka-pretty-log">Distilled Log</a> will give you a more fine grained view of what Windmill was doing at the time of the failure (e.g. compiling a file) as well as a hint on how to fix it.</p>

<p class="center"><img src="/assets/static/images/error_log.png" alt="distilled log" /></p>

<h1 id="simulator-support">Simulator support</h1>

<p>As part of building your app for distribution, Windmill will give you the option to <a href="/mac/xcode/#launch-the-app-on-the-simulator">launch the latest build of your app on the Simulator</a>.</p>

<p>This can be useful when you want to check what your app looks like right there and then. It also enables you to install and run the app on the Simulator without access to the source code.</p>

<h1 id="the-app-bundle">The app bundle</h1>

<p>Each time you commit to master, Windmill will build your app bundle. You can choose to save it under the commit for future reference.</p>

<h1 id="terminal-access">Terminal access</h1>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/windmill_io?ref_src=twsrc%5Etfw">@windmill_io</a> how best to manage dependencies in Windmill, like Carthage or pods?</p>&mdash; John Nye (@john_nye) <a href="https://twitter.com/john_nye/status/965921670988009472?ref_src=twsrc%5Etfw">February 20, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">hey <a href="https://twitter.com/qnoid?ref_src=twsrc%5Etfw">@qnoid</a> <a href="https://twitter.com/windmill_io?ref_src=twsrc%5Etfw">@windmill_io</a>! Is there a support for projects using cocoapods?</p>&mdash; Viktor Malyi (@victormalyy) <a href="https://twitter.com/victormalyy/status/965864424971087872?ref_src=twsrc%5Etfw">February 20, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>You can now use the Terminal to bring in any external dependencies (e.g. using Carthage or CocoaPods) to your project as monitored by Windmill. For a How-To, open the Windmill Help menu (⌘?).</p>

<p>Keep in mind that Windmill <a href="/blog/What-is-Windmill.html">will not automatically update any dependencies</a> as part of a new commit pushed to master.</p>

<p class="center"><img src="/assets/static/images/terminal.png" alt="terminal" /></p>

<h1 id="whats-stopping-you">What’s stopping you?</h1>

<p>It is as simple to get started as opening your Xcode project/workspace. Windmill will also provide support along the way to recover from failures and works with even more project configurations than before.</p>

<p>To be part of an upcoming “Showcase” on the website please send screenshots of your app running on the Simulator alongside Windmill.</p>

<p>If there is anything preventing you from using Windmill or you have any feedback <strong>I would like to hear it</strong>.</p>

<p>If you are the only iOS Developer at a startup or a freelancer working for a client, please get in touch to better understand how Windmill fits into your development workflow.</p>

<p>You can reach me personally at <code class="highlighter-rouge">qnoid</code> under the Windmill domain or Twitter <a href="https://twitter.com/windmill_io">@windmill_io</a>.</p>

<p><a href="/changelog/windmill-2.0.0.html">Windmill 2.0</a> lays the foundation for the future. With your support, what comes next is only a matter of time.</p>

<h1 id="one-more-thing">One more thing…</h1>

<p>Windmill already makes it easy to <a href="/mac/xcode/#install-the-app-on-a-device">install your app on a device</a>.</p>

<p>Running your app on an iPhone allows you to see how the app looks and feels. It is a great way to do a demo either 1 on 1 or as part of a team meeting.</p>

<p>However it does require a provisioned device to be physically present, making it less convenient for showcasing small updates, asking for feedback, ad hoc sharing of tidbits with the rest of the team.</p>

<p>You can now <a href="/mac/previews/#record-and-share-a-10-second-clip"> record and share a 10 second clip</a> anywhere you can share a video.</p>
]]></description>
        <pubDate>Sat, 05 May 2018 17:18:18 +0300</pubDate>
      </item>
      <item>
        <title>What is Windmill?</title>
        <link>/blog/What-is-Windmill.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/What-is-Windmill.html</guid>
        <description><![CDATA[<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr">I develop on a MBP. Can&#39;t imagine using this alongside regular XCode build/run cycles.</p>&mdash; Igor Makarov (@igormaka) <a href="https://twitter.com/igormaka/status/965612393454809090?ref_src=twsrc%5Etfw">February 19, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/qnoid?ref_src=twsrc%5Etfw">@qnoid</a> Also interested on your thoughts as to processor overheads if developing and debugging whilst Windmill is running. Dev &gt; commit &gt; push &gt; dev &gt; commit &gt; push ... is a common workflow for me. I wonder if Windmill might run at inconvenient times and slow this down?</p>&mdash; Sammy C (@dubblewordscore) <a href="https://twitter.com/dubblewordscore/status/965712779880685568?ref_src=twsrc%5Etfw">February 19, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="i-commit-code-quite-frequently-during-the-day">“I commit code quite frequently during the day.”</h2>

<p class="highlight">TL;DR Windmill monitors your <strong>master</strong> branch. You can utilise it every time you merge and push to master while you keep your existing development workflow on a feature branch.</p>

<p>The goal of Windmill is to establish a process that enables you to:</p>

<ul>
  <li>know when your app can no longer be released, give you the reasons that hold you back and provide you with feedback/support on how to resolve them.</li>
</ul>

<p>e.g. build no longer compiles, distribution certificate has expired etc.</p>

<ul>
  <li>monitor the “quality” of your app through metrics and reports.</li>
</ul>

<p>e.g. do tests pass? how many tests are there? what’s the code coverage?</p>

<ul>
  <li>see the “progress” of your app by providing you with an IPA that you can install on a device</li>
</ul>

<p>e.g. does the “pull to refresh” feature <strong>look and feel</strong> as expected?</p>

<p>This, among others<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup>, is the value that Windmill aims to provide you with.</p>

<p>Windmill is not meant to be used while practicing TDD, <span style="text-decoration: line-through;">working on a feature branch</span> (Windmill have since added <a href="/mac/getting_started/#workflow">branch support</a>) or as a replacement to a continuous integration service<sup id="fnref:2"><a href="#fn:2" class="footnote">2</a></sup>.</p>

<p>Windmill exists to monitor your <strong>master</strong> branch for release candidates. A candidate that you decide when to turn into a public release by evaluating what is in front of you.</p>

<p>See also: <a href="/faq/">Frequently Asked Questions</a></p>

<p class="center"><img src="/assets/static/images/what-is-windmill.png" alt="diagram visualising the windmill process" /></p>

<hr />

<div class="footnotes">
  <ol>
    <li id="fn:1">
      <p>By operating in a process like this you are also confident you can release your app at a moment’s notice. <a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
    </li>
    <li id="fn:2">
      <p>A service that monitors every feature branch, continuously merging into a master branch, promoting to a release without any human interaction in a large codebase and/or distributed team. <a href="#fnref:2" class="reversefootnote">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></description>
        <pubDate>Wed, 21 Feb 2018 08:10:55 +0200</pubDate>
      </item>
      <item>
        <title>Announcing Windmill</title>
        <link>/blog/Announcing-Windmill.html?utm_source=blog+rss+feed&amp;utm_medium=rss&amp;utm_campaign=rss+feed</link>
        <guid isPermaLink="true">/blog/Announcing-Windmill.html</guid>
        <description><![CDATA[<h2 id="background">Background</h2>

<p>For far too long us iOS developers have relied on Jenkins to, at the very minimum, automate checking out, building and testing our iOS apps.</p>

<p>Apple realised the need and in 2014 introduced Xcode bots as part of Xcode Server. In 2017, Xcode bots became part of Xcode bringing automation to the development Mac rather than explicitly requiring setting up a server.</p>

<p>Numerous cloud based services are also available that mirror Jenkins in terms of their offering when it comes to building and testing iOS apps.</p>

<h2 id="where-are-we-today">Where are we today?</h2>
<h3 id="jenkins">Jenkins</h3>

<p>Jenkins appears to be the market leader according to <a href="https://www.macstadium.com/devops-survey/">MacStadium’s survey</a> and anecdotal evidence seems to back this up.</p>

<p>Even though Jenkins is a <strong>generic</strong> “automation server”, its open source nature and plugin architecture has allowed<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup> the iOS community to provide support for iOS apps.</p>

<p>Setting up Jenkins requires considerable time and effort. It also assumes  you are familiar with Apple’s Command Line Tools and feel comfortable using, what looks like, an ops tool.</p>

<p>There is only so much integration Jenkins offers with the rest of your iOS development process. Namely, any test devices to install your app to, or Xcode for App Store and Testflight distribution.</p>

<h3 id="xcode-bots">Xcode bots</h3>

<p>Xcode bots, almost 4 years later, hasn’t challenged Jenkins.</p>

<p>Xcode bots is a native offering, with out of the box support for building and testing your iOS apps. Going as far as providing both IPA and archive files.</p>

<p>It only takes a few clicks through a series of dialogs to setup, guiding you through the process. Before long, it will monitor for code changes, build, test, archive and export your app. It will even publish the IPA on a web server running locally so that you can install it on a device over the air.</p>

<h3 id="cloud-based-services">Cloud based services</h3>

<p>Cloud based services don’t seem to be focusing on iOS development. The exception being buddybuild that has recently been acquired by Apple.</p>

<p>Cloud based services typically mirror Jenkins and offer a scalable infrastructure. They too provide automation but typically leave it up to you to set them up.</p>

<p>As a result, like Jenkins, they require you to have knowledge of the tooling so that you can put everything together.</p>

<p>Unlike Jenkins, they don’t come “free”. Instead, limiting the work by some combination and factor of time, users and builds.</p>

<p>Should you wish to create an IPA and/or an archive you are  expected to share your Apple account credentials or at the very least your signing certificate and private key.</p>

<p>Last but not least, access to your source code is mandatory.</p>

<h2 id="where-does-windmill-fit-into-all-this">Where does Windmill fit into all this?</h2>

<p>At a bare minimum, an automation tool for iOS development must be able to provide support for the following scenarios:</p>

<ul>
  <li>check out the code whenever there is a new commit.</li>
  <li>build the app, making sure it still compiles after any code merges.</li>
  <li>test the code, making sure there are no regressions.</li>
  <li>archive the build so that it is always ready to publish.</li>
  <li>export an IPA so that the app can be run on a device.</li>
</ul>

<p>Windmill does all the above as a native macOS app, built on top of Apple’s command line tools, taking into account existing conventions and development practices as defined and established by Apple.</p>

<p>It is designed to be at opposing ends to Jenkins by being easier to setup and maintain<sup id="fnref:2"><a href="#fn:2" class="footnote">2</a></sup>. Also aiming to provide an “out of the box” level of integration paralleled to that set by Xcode bots. It offers support for all scenarios listed above as a standalone macOS app <strong>for free.</strong></p>

<p class="center"><img src="/assets/static/images/comparison.png" alt="comparison" /></p>

<p>Windmill aims to bring a basic level of automation to building, testing and distributing an iOS app in a way that is both accessible and made ubiquitous to every iOS developer.</p>

<p>To achieve that, Windmill relies heavily on existing conventions as set by Apple and aims to establish a best practice on how to automate building, testing and distributing apps. At this stage, what Windmill is able to achieve and to what extent is defined by Apple. There is no way around it. This is a conscious decision. To pretend otherwise would be to rely on reverse engineering, side effects, undocumented features and observable behaviours. For bringing that basic level of automation it should be enough.</p>

<p>Windmill is not meant to be customised at this stage and definitely not in a way of writing and maintaining scripts. It is a slippery slope that leads to complexity, overhead and creates a dependency to those few people writing the scripts. As a result, there is <strong>currently no support</strong> for using third party tools or integrating with third party services.</p>

<h2 id="windmill-takes-its-first-step-looking-into-the-future">Windmill takes its first step, looking into the future.</h2>

<p>It is time iOS automation takes a leap when it comes to delivering apps. Not by zealously automating every step and integrating end to end. But by bringing sense, establishing a common understanding across iOS developers and businesses through a platform that focuses on what the goals are.</p>

<p>To safely make code changes. To have an app that runs on a device. To have a build ready for in house testing. To be ready for a demo. To have visibility on business metrics.</p>

<p>It is fair to say that this is just the beginning<sup id="fnref:3"><a href="#fn:3" class="footnote">3</a></sup> of Windmill. A humble, yet determined entry to make a mark in a crowded market with big players.</p>

<p><a href="/blog/What-is-Windmill.html">Windmill</a> should be able to cover your needs today if you are:</p>

<ul>
  <li>using Jenkins just to checkout, build, test your app</li>
  <li>an indie developer</li>
  <li>an iOS freelancer working for a client</li>
  <li>the sole developer in a startup</li>
  <li>developing a side project</li>
  <li>a student</li>
  <li>a teacher</li>
</ul>

<p>If you are indeed any of the above and there is a use case preventing you from using Windmill, I would like to hear it. You can reach out by posting to <em>qnoid at windmill.io</em> or on twitter <em><a href="https://windmill_io">@windmill_io</a></em></p>

<hr />

<div class="footnotes">
  <ol>
    <li id="fn:1">
      <p>With Apple’s blessings by offering command line developer tools. <a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
    </li>
    <li id="fn:2">
      <p>There are no scripts to maintain and Windmill is, by design, only using the public, documented functionality of command line tools. Any breaking changes due to Apple updating the command line tools (as part of an Xcode upgrade) can still occur to Apple’s discretion. At which point, an upgrade to Windmill will be required. <a href="#fnref:2" class="reversefootnote">&#8617;</a></p>
    </li>
    <li id="fn:3">
      <p>Windmill recognises that as a business grows, so does the  complexity around delivering apps. As Windmill evolves, accessibility and ubiquity remain strong anchors. <a href="#fnref:3" class="reversefootnote">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></description>
        <pubDate>Sat, 17 Feb 2018 00:27:19 +0200</pubDate>
      </item>
  </channel>
</rss>
