Swift プロジェクトの テスト CI を Travis CI から GitHub Actions へ移行

Travis CI を使って GitHub のプロジェクトに push した時に、自動でテストが実行されるようになったいたのを GitHub Actions に変えてみた。

GitHub actions の yaml の書き方や、Travis CI からの移行については以下のドキュメントが参考になる。

実施した手順のメモ。

1. プロジェクトのルートに .github フォルダを作成
2. .github フォルダ内に workflows フォルダを作成
3. workflows に yml ファイルを作成し、そこにテストの内容を記述していく。
たとえば、こんな感じ。

name: ci

on: 
  push:
    branches: 
      - master
  pull_request:
    branches: 
      - '*'

jobs:
  testing_macos:
    runs-on: macos-11
    steps:
    - uses: actions/checkout@v1
    - name: "Xcode13 iOS"
      run:  xcodebuild clean test -project Test.xcodeproj -scheme Test-iOS -sdk iphonesimulator -destination "platform=iOS Simulator,OS=15.0,name=iPhone 8" -configuration Debug

4. ブランチを新たに作り、今までの作業内容をコミットして、プルリクエストする。

  on: 
  push:
    branches: 
      - master
  pull_request:
    branches: 
      - '*'

この部分の記述で pull request した時も GitHub アクションが実施されるようにしているので、このプルリクエストのタイミングで実際にテストが開始されるのを確認できる。

5.プルリクエストのテストが成功したら、main ブランチにマージする。


GitHub のページから UI でワークフロー・GitHub アクションも作れるのだけど、上のような感じで UI を介さずに、作ることもできる。

実際 Travis CI と GitHub Actions だとどう yaml が変わったというと、、、

Travis CI の時(macOS 上で iOS, macOS, tvOS のテスト+Linux 上のテスト)

branches:
  only: 
    - master

matrix:
  include:
    - os: osx
      language: swift
      osx_image: xcode12
      script:
        # iOS
        - xcodebuild clean -project "MurmurHash.xcodeproj" 
        - xcodebuild test -project "MurmurHash.xcodeproj" -scheme "MurmurHash-iOS" -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 11 Pro Max" -configuration Debug
        
        # macOS
        - xcodebuild clean -project "MurmurHash.xcodeproj" 
        - xcodebuild test -project "MurmurHash.xcodeproj" -scheme "MurmurHash-macOS" -destination "platform=OS X" -configuration Debug
        
        # tvOS
        - xcodebuild clean -project "MurmurHash.xcodeproj" 
        - xcodebuild test -project "MurmurHash.xcodeproj" -scheme "MurmurHash-tvOS" -sdk appletvsimulator -destination "OS=12.2,name=Apple TV 4K" -configuration Debug
        
    - os: linux
      language: generic
      dist: xenial
      sudo: false
      addons:
        apt:
          packages:
            - wget
            # Ubuntu needs following packages to build Swift.
            # 
            # Reference:
            # https://github.com/apple/swift#System-Requirements
            - git
            - cmake
            - ninja-build
            - clang
            - python
            - uuid-dev
            - libicu-dev
            - icu-devtools
            - libbsd-dev 
            - libedit-dev
            - libxml2-dev
            - libsqlite3-dev
            - swig
            - libpython-dev
            - libncurses5-dev
            - pkg-config
            - libblocksruntime-dev
            - libcurl4-openssl-dev
            - systemtap-sdt-dev
            - tzdata
            - rsync
      script:
        - wget https://swift.org/builds/swift-5.3-release/ubuntu1604/swift-5.3-RELEASE/swift-5.3-RELEASE-ubuntu16.04.tar.gz
        - tar xvfz swift-5.3-RELEASE-ubuntu16.04.tar.gz
        - export PATH=$(pwd)/swift-5.3-RELEASE-ubuntu16.04/usr/bin:"${PATH}"
        - swift build
        - swift test

GitHub Actions の時(テストの内容は、Travis CI と同じ。Xcode や OS のバージョンは上げている)

name: ci

on: 
  push:
    branches: 
      - master
  pull_request:
    branches: 
      - '*'

jobs:
  testing_macos:
    runs-on: macos-11
    steps:
    - uses: actions/checkout@v1
    - name: "Xcode13 iOS"
      run:  xcodebuild clean test -project MurmurHash.xcodeproj -scheme MurmurHash-iOS -sdk iphonesimulator -destination "platform=iOS Simulator,OS=15.0,name=iPhone 8" -configuration Debug
      env:
        DEVELOPER_DIR: /Applications/Xcode_13.0.app/Contents/Developer
    - name: "Xcode13 macOS"
      run: xcodebuild clean test -project MurmurHash.xcodeproj -scheme MurmurHash-macOS -destination "platform=OS X" -configuration Debug
      env:
        DEVELOPER_DIR: /Applications/Xcode_13.0.app/Contents/Developer
    - name: "Xcode13 tvOS"
      run: xcodebuild clean test -project MurmurHash.xcodeproj -scheme MurmurHash-tvOS -sdk appletvsimulator -destination "platform=tvOS Simulator,OS=15.0,name=Apple TV" -configuration Debug
      env:
        DEVELOPER_DIR: /Applications/Xcode_13.0.app/Contents/Developer

  testing_linux:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v1
    - name: "Linux"
      run: swift test

となった。

まあ、そこまで変わらない感じでかけた。(使っていないけど、GitHub actions でも matrix を書けるらしい)
あと、Travis CI の時は、Linux で Swift 実行環境を作るためにパッケージインストールをしていたのが、GitHub だと最初から入っているので、楽。

GitHub で使える OS 環境は以下を見た。

ちなみに GitHub アクションでも、ビルドステータスのバッチがつけれます。