LoginSignup
0
2

More than 3 years have passed since last update.

自作ライブラリ Carthage CocoaPods 公開を CI で自動化

Last updated at Posted at 2020-08-08

GitHub Actions を利用し、Release 作成タイミングで、ライブラリ公開作業を自動化しましょう!

前提

  • Release の作成 (= tag 作成) は手作業で行うものとします。
    この記事で行う自動化は、Release 作成をトリガーとして行うものです。

  • https://github.com/yuki0n0/WaveSlider/
    解説するものは、こちらのライブラリを作成したときの情報に基づいています。
    よかったら GitHub で Star ★ つけてね。

  • https://qiita.com/yuki0n0/items/290c6ab753634e7395f5
    ライブラリ公開の手続きなどはこちらで解説しております。

  • CI は GitHub Actions を利用しています。
    大したことはやってないのでお好きな CI で読み替えてください

CocoaPods

今回やることは下記です。

  • pod trunk push を CI で自動的に実行
  • push が行えるように認証情報を用意する
  • バージョン情報を tag から取得

1. トークンを取得

登録 (もしくはログイン) します。メールが来たらアクティベートしましょう。

# 登録済みの場合は Name は必要ありません
pod trunk register mail@example.com Name

~/.netrc に認証情報があるため、 password を確認します。

~/.netrc
machine trunk.cocoapods.org
  login mail@example.com
  password 0000000a000000aaaaaaa0000aa00a0a

この password を GitHub Actions から利用できるように Secrets にセットします。
ここでは COCOAPODS_TRUNK_TOKEN としておきます。
GitHub Actions Secrets

2. バージョンを環境変数から取れるようにしておく

.podspec ファイルでバージョンを指定しますが、ここの値を外部から指定できるようにしておきます。
環境変数 LIBRARY_VERSION1.0.0 のような値が入っていることを想定します。

LibraryName.podspec
# コードは一例です。お好きな方法で外部の値をとってこれるようにしましょう。
version = ENV["LIBRARY_VERSION"]
exit 1 if version.to_s.empty?

Pod::Spec.new do |spec|
  spec.name         = "LibraryName"
  spec.version      = version
  spec.source       = { :git => "https://...git", :tag => spec.version }
  ...
end

今回でいう外部は、 git の tag 名に基づいて指定したいということです。
つまり、必然的に tag 名は 1.0.0 というような CocoaPods のバージョン名と一致することが求められます。

3. GitHub Actions の Yaml ファイル

最低限の Yaml を下記に載せました。ポイントをまとめます。

  • CocoaPods のトークン (password) を env として定義し忘れない
  • env LIBRARY_VERSION に tag 名を渡す
  • github.event.release.tag_name でタグ名を取れる! (これにたどり着くのに時間かかった)
GitHub Actions の Yaml ファイル
on:
  release:
    types: [published]

jobs:
  job-name:
    runs-on: macos-10.15

    env:
      COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
      LIBRARY_VERSION: ${{ github.event.release.tag_name }}

    steps:
    - uses: actions/checkout@v2
    - run: pod trunk push LibraryName.podspec

ソースコードはこちら
https://github.com/yuki0n0/WaveSlider/blob/1.0.2/.github/workflows/release_published.yaml

Carthage

Carthage は公開を自動化するというより、
オプションとして行う「バイナリのアップロード」を自動化します。

1. 前提知識

Release の Assets

https://docs.github.com/ja/github/administering-a-repository/about-releases
GitHub の Release には、ファイルを Assets として置いておける場所があります。
ReleaseのAssets
そして、ここにブラウザ上から手動でファイルをアップロードすることもできます。
Releaseにアップロード
このアップロードを自動化します。

アップロードしたいバイナリ

下記コマンドを実行すると、 LibraryName.framework.zip を作成できます。

carthage build --archive

バイナリを Assets に置いておくメリット

ビルド済みのバイナリを置いておくことにより、ライブラリ利用者はこれを使用できます。
通常はソースコードを各利用者の環境でビルドするので、このビルド時間を省略1できます。

2. バイナリを自動アップロード

最小限のコードを、コメントと共に掲載しておきます。

GitHub Actions の Yaml ファイル
on:
  release:
    types: [published]

jobs:
  job-name:
    runs-on: macos-10.15

    env:
      GITHUB_TOKEN: ${{ github.token }}

    steps:
    - uses: actions/checkout@v2

    # LibraryName.framework.zip を作成
    - run: carthage build --archive 

    # upload_url を取得するために使用させていただく
    - uses: bruceadams/get-release@v1.2.0
      id: get

    # Release の Assets にファイルをアップロード
    - uses: actions/upload-release-asset@v1.0.2
      with:
        upload_url: ${{ steps.get.outputs.upload_url }}
        asset_path: ./LibraryName.framework.zip
        asset_name: LibraryName.framework.zip
        asset_content_type: application/zip

ソースコードはこちら
https://github.com/yuki0n0/WaveSlider/blob/1.0.2/.github/workflows/release_published.yaml

参考


  1. 一方で、このバイナリを「Swiftのバージョンが異なる」等の理由で利用できない場合があります。
    その場合は Carthage 側が自動的に判断2して、バイナリは利用せずに通常通りソースコードからビルドして利用します。
    どんな状況でもバイナリを使用したくない場合は --no-use-binaries オプションを付与してコマンドを実行します。 

  2. Carthage 0.20.0 以降 

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2