Hiroto's diary

プログラミングとか色々

GitHub Actions で特定の OS の時のみ実行するスクリプトを切り替える

テスト時の必要なパッケージのセットアップ等で OS 毎に実行するスクリプトを切り替える必要があり, 色々と調べたので書き残します。

GitHub Actions では標準で Windows Server 2019, Ubuntu 18.04, 16.04, macOS Catalina 10.15 が使えます。 (2019/12/18 現在)

help.github.com

CI の際に, OS により実行する事が違う場合が多々ありますが, GitHub Actions では YAML ファイル内で簡単に分岐できます。

OS の切り替えに限らず, 特定の条件のみ実行する場合は jobs.<job_id>.if でコンテキストを使って分岐します。 変に説明するよりも見たほうが早いので, 例を貼り付けます。 以下は Linux (ubuntu-latest) の時は apt, macOS (macos-latest) の時は brew を使い, zsh をインストールする例です。

name: CI

on: [push]

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        node-version: [12.x]

    steps:
      - uses: actions/checkout@v1

      - name: Use the Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}

      # Linux の時のみ, apt で zsh をインストール
      - name: Install zsh on ubuntu-latest
        if: runner.os == 'Linux'
        run: |
            sudo apt update -y
            sudo apt install -y zsh

      # macOS の時のみ, HomeBrew で zsh をインストール
      - name: Install zsh on macos-latest
        if: runner.os == 'macOS'
        run: |
            brew update
            brew install zsh

runner.os で現在のジョブで実行されてる OS の取得が出来ます。 取得できる文字列はLinux, macOS, Windows です。

if で書く OS 名はシングルクォートで囲う必要があります(ダブルクォートだと Your workflow file was invalid: The pipeline is not valid., Unexpected symbol になります)。

分岐条件が複数ある場合は && で繋ぐだけです。

# os が macOS かつ, イベントが pull_request
if: runner.os == 'macOS' && github.event_name == 'pull_request'

Node.js のバージョン切り替えで使っている matrix.node-version や, ジョブの状態を取得する job.status などもコンテキストの一つですので if に使えます。

その他のコンテキストは GitHub ヘルプから参照できます。

help.github.com

Travis CI のようにジョブの情報が環境変数に入っていてシェルスクリプトの中で分岐するのは, シェルスクリプトにあまり慣れてない人(僕)が触るとまあまあ最悪なので, YAML ファイル内で簡単に分岐出来るのはありがたいですね。

iOS の Spotify で曲やアーティストを Twitter で共有する時に曲名やアーティスト名を入れる

iOSバイスSpotify を使ってる方は分かると思うけど, iOSSpotify で曲やアーティストを Twitter で共有すると, なぜか曲名やアーティスト名はツイートされず, URL だけがツイートされる. PC では曲名もアーティスト名もツイートされるのに, 何故か iOS ではこの仕様.

公式クライアントでツイートを見る分にはアーティスト名なり曲名が分かるのでまだ良いですが, 非公式クライアントではただ URL が表示されるだけでめちゃくちゃ不便.

これの解決方法は Safari などの外部ブラウザで開いてブラウザの共有機能でツイートする等があるけど, iOS のショートカットで実現したほうが手っ取り早いので作った.


2020/10/30 追記

iOS 14頃からダブルクオーテーションなどがエンコードされるようになってしまったので, 2020/10/30に大幅書き換え

追記ここまで


まず, ショートカットのアプリと Twitter 共有に使うアプリをインストール. 自分は普段 feather を使ってるので feather で共有する.

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料
apps.apple.com

apps.apple.com

ショートカットアプリを開いて, 以下のような感じのを作る.

f:id:Hiroto-K:20201030154817p:plainf:id:Hiroto-K:20201030154821p:plainf:id:Hiroto-K:20201030154825p:plain

3個目の HTML は以下の通り. parseFromString()の第一引数の名前はショートカットに出てくる名前を選択する.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const parser = new DOMParser();
const doc = parser.parseFromString("名前", 'text/html');
document.body.textContent = doc.documentElement.textContent;
</script>
</body>
</html>

以前は名前を取得を使えばエンコード前のテキストが取得できていたけど, iOS 14 になってから出来なくなっていたので手動でデコードする必要がある.

見た感じデコードの機能はなさそうだったので, データスキームを使って JavaScript を実行するというアクロバティックな実装で突破したけど, 他にもいい方法があるかもしれない.

最後の方のテキストは以下の通り. クエリの text の後ろにエンコード済みのテキストを入れる.

feather以外を使っている人は自分の使ってるアプリの URL スキームを使えばいいと思う.

com.covelline.feather:///post?text=

ショートカットの設定から共有シートに表示をオンにする.

f:id:Hiroto-K:20201030155846p:plain

後は Spotify から共有をするだけ. 共有する際にTwitterを選ばずにその他を選び, そこからショートカットで作った物を選ぶと, 指定したTwitterクライアントに飛ぶ.

f:id:Hiroto-K:20201030160508p:plainf:id:Hiroto-K:20201030160514p:plainf:id:Hiroto-K:20201030160521p:plain

これでいい感じに曲名とアーティスト名を挿入してツイートできる.

こんなのをユーザー側がやるのもアレなので, Spotify 標準の Twitter 共有で曲名とアーティスト名も入れるようにしてほしい.


ここから下はiOS 13の頃まで使えた仕様. 今作っても使えるは使えるけど, ダブルクオーテーションなどがエンコードされて最悪なのでおすすめしない.

以下のような感じのを作る.

f:id:Hiroto-K:20191021000303p:plainf:id:Hiroto-K:20191021000309p:plain

Spotify から共有して確認.

f:id:Hiroto-K:20191021001432p:plainf:id:Hiroto-K:20191021001440p:plain
f:id:Hiroto-K:20191021001448p:plainf:id:Hiroto-K:20191021001455p:plain

© 2015 hiroxto