【Swift】fastlaneを使用してリリースまでのステップを自動化する

## はじめに
リリース作業で時間を取られたり手間がかかっているという問題を解決すべくリリース作業を自動化してみようと思います。導入から実行まで紹介します。

## fastlaneとは
iOSやAndroidアプリのビルド、テスト、リリース作業を自動化するためのツールです。

## 導入方法

### 1. fastlaneをインストール

https://docs.fastlane.tools/getting-started/ios/setup/

今回はHomebrewを使用してインストールします。
```
brew install fastlane
```

### 2.ターミナルで追加対象のプロジェクトのディレクトリに移動し、initを実行します。

```
cd /xxx_project

fastlane init
```

### 3. 質問にいくつか答えます
![インストール開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/66f08aee-8c68-500f-9107-302fc58d0b7e.png)

質問：What would you like to use fastlane for?に関して、3のAutomage App Store distributionを選択しました。

![インストール完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/5bb0b387-d1ab-fdfc-53bb-d7e732d1bdcf.png)



最後に2枚目の画像が表示されれば完了です。

### 4. fastlaneファイルが生成されているのを確認します

![スクリーンショット 2024-06-06 6.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/61261303-627d-3d3d-2fd9-e3321952a938.png)
※1 各ファイル構成の詳細をまとめています。

## 各ファイル構成の詳細
### Appfile
Fastlaneの基本設定を定義するファイル。アプリのバンドルIDやApple ID、チームIDなどの情報が含まれます。

### Deliverfile
`deliver`ツールを使用するための設定ファイル。メタデータやスクリーンショットを含むアプリ情報をApp Store Connectにアップロードするために使用されます。

### Fastfile
Fastlaneのメイン設定ファイルで、各種レーン（lane）を定義します。各レーンには、ビルド、テスト、デプロイなどのアクションが含まれます。

### metadata
アプリのメタデータ（アプリの名前、説明、リリースノートなど）を格納するフォルダ。このフォルダ内のファイルは、`deliver`ツールによってApp Store Connectにアップロードされます。

### screenshots
アプリのスクリーンショットを格納するフォルダ。このフォルダ内のスクリーンショットも`deliver`ツールによってApp Store Connectにアップロードされます。

## 実行方法
**1. 対象のプロジェクトのリポジトリへ移動しコマンドを実行**
今回は`release`コマンドを実行します。するとFastfileに記載されているreleaseレーンが実行されます。ビルド番号がインクリメント、アプリがビルド、App Store Connectにアーカイブをアップロードする作業が行われます。
```
cd /xxx_project

fastlane release
```
```
// Fastfile

platform :ios do
  desc "Push a new release build to the App Store"
  // レーン指定
  lane :release do
    increment_build_number(xcodeproj: "xxx.xcodeproj")
    build_app(workspace: "xxx.xcworkspace", scheme: "xxx")
    upload_to_app_store
  end
end
```

## GitHub Actionsを使ってみる
今回はfastlaneのみでリリース作業を自動化でしたが、GitHub上でリリースブランチのPushを検知して、自動でアーカイブをアップロードする処理をまとめてみます。GitHub Actions を使用してのリリースはまだ試していませんがまとめてみました

## 導入方法
### 1. GitHubリポジトリの設定
GitHubリポジトリのルートに.githubディレクトリを作成し、その中にworkflowsディレクトリを作成します。

### 2.GitHub Actionsワークフローファイルの作成
.github/workflows/release.ymlという名前で新しいワークフローファイルを作成します。以下はその内容です。

YAMLファイルの導入に関しては下記記事が参考にしてください。

https://qiita.com/sauna1137/items/7a897cf3daefba1b2c73

```yaml
name: Release iOS App

on:
  push:
    branches:
      - release/*

jobs:
  build:
    runs-on: macos-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 2.7

    - name: Install dependencies
      run: |
        gem install bundler
        bundle install

    - name: Install fastlane
      run: |
        gem install fastlane

    - name: Build and release
      run: |
        bundle exec fastlane release
      env:
        APP_STORE_CONNECT_API_KEY_PATH: ${{ secrets.APP_STORE_CONNECT_API_KEY_PATH }}
        APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }}
        APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
        APPLE_ID: ${{ secrets.APPLE_ID }}
        TEAM_ID: ${{ secrets.TEAM_ID }}
```
これにより、GitHub Actionsがこれらの情報を使用してApp Store Connectに接続し、リリースブランチにプッシュされたタイミングでFastlaneを使用したリリース作業が自動的に実行されます。

## まとめ
今回はiOSでしたがAndroidのリリース作業自動化についても時間があれば挑戦してみたいです。

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/