Learn all about CI/CD with these posts

Continuous Integration and Continuous Deployment for your Swift projects.

GitHub webhooks 🤝 Xcode Cloud

How to use GitHub webhooks to trigger Xcode Cloud builds by writing a comment on a pull request.

Managing multiple Xcode versions on CI using Fastlane

All you need to know about how to set the version of Xcode to use on CI using Fastlane.

Safely pinning SPM dependencies to exact versions

I will show you how code might change across different builds even when depending on an exact version of a Swift Package as well as how to mitigate the risks associated with this.

Using App Store Connect API to trigger Xcode Cloud workflows

Learn how to trigger Xcode Cloud workflow runs using the App Store Connect API.

Scheduling tweets with GitHub Actions and Swift

Using Swift as to write a commit-msg git hook so that adding ticket numbers to a commit message can be automated.

Fastlane and App Store Connect API keys

An up to date guide on how to use an App Store Connect API key with Fastlane and GitHub Actions.

Xcode Cloud scripts: Fastlane and Cocoapods

Learning how to install and use third-party tools in Xcode Cloud through ci scripts.

Managing multiple versions of Swift locally

A guide on how to download, install and manage different versions of Swift.

Collecting GitHub Action workflow metrics using Swift

Creating a command line tool using Swift and async/await to collect metrics on GitHub Action workflows.

Testing your release pipeline using Fastlane

Some processes, such as a release pipeline, are very important but do not get run frequently. In this article, I go through how scheduled CI runs can help you spot failures early and gain confidence in your important and infrequent processes, such as release pipelines.

My first contribution to Fastlane

A short article on the recent contribution I made to Fastlane's open source project.

Cancelling unnecessary GitHub actions automatically

How to make use of the github actions concurrency feature to cancel unnecessary runs automatically. Talking about a real-world example and a tale of two approaches, and why I decided to implement it the way I did.