fastlaneで独自actionを追加する

fastlaneもだいぶ浸透してきた昨今ですが、求めているactionがなかった時に
lane内でシェルスクリプトを叩くようにしたりしていませんか？
そういうときは、独自actionを作るほうがベターです。

## 独自actionの作成
今回以下の様な意味がないactionを作成してみます。

 - sample_flagがtrueの時にsample_paramの内容をログ出力する。


### コマンドからテンプレート作成
以下のコマンドでテンプレートをもとにファイルを用意してくれます。

```shell:command
fastlane new_action
```

上記コマンドを叩くとaction名を聞かれるので入力します。
action名の注意点は以下のとおり。

```
Must be lower case, and use a '_' between words. Do not use '.'
examples: 'testflight', 'upload_to_s3'
```

名前を入力すると、以下の場所にファイルが作成されます。
ファイル名は、つけた名前.rb(sampleとしたらsample.rb)

```
fastlane/actions/
```


ちなみに、実際のテンプレートは以下にあります。

 - [custom_action_template.rb](https://github.com/fastlane/fastlane/blob/master/fastlane/lib/assets/custom_action_template.rb)



### コード記述
作成されたテンプレートコードを元に中身を書いていきます。
以下のように書くことが出来ます。

```ruby:sample.rb
module Fastlane
  module Actions
    class SampleAction < Action

      def self.run(params)
        UI.message("LOG: #{params[:sample_param]}") if(params[:sample_flag])
      end

      def self.description
        "意味が無いactionであります"
      end

      def self.available_options
        FastlaneCore::ConfigItem.new(key: :sample_param,
                                     env_name: "SAMPLE_PARAM",
                                     description: "叫ぶ言葉"),
        FastlaneCore::ConfigItem.new(key: :sample_flag,
                                     env_name: "SAMPLE_FLAG",
                                     description: "叫ぶかどうか",
                                     is_string: false,
                                     default_value: true)
      end

      def self.is_supported?(platform)
        platform == :ios
      end
    end
  end
end
```


書いたコードの動作確認は以下で試すのが良いです。

```
fastlane run action key:value
```

今回の例でいうならば、以下の様な感じになります

```
fastlane run sample sample_param:param sample_flag:true
```

上記を実行すると以下の様な出力になります。

```
--------------------
--- Step: sample ---
--------------------
LOG: param
Result: true
```


Fastfileの記述は以下の様な感じになります。

```ruby:Fastfile
  lane :sample_action do
    sample(
      sample_param: "hello_japan"
      #sample_flagを書かない場合、デフォルト値のtrueになります
    )
  end
```

actionの実装例については、既存のコードが参考になるはずなので是非以下のactionを参考にすると良いかと思います。

 - [actions](https://github.com/fastlane/fastlane/tree/master/fastlane/lib/fastlane/actions)



#### 各種コマンドをうった場合の表示
以下のコマンドで存在するaction全てが表示されます。

```
fastlane actions
```

上記コマンドの場合は以下のように表示されます。

```
| sample  | 意味が無いactionであります | tarappo  |
```


以下のコマンドで情報が表示されます。

```
fastlane action action名
```

上記コマンドの場合は以下のように表示されます。

```
+--------------------+
|       sample       |
+--------------------+
| 意味が無いactionであります   |
|                    |
| Created by tarappo |
+--------------------+

+--------------+-------------+--------------+---------+
|                   sample Options                    |
+--------------+-------------+--------------+---------+
| Key          | Description | Env Var      | Default |
+--------------+-------------+--------------+---------+
| sample_param | 叫ぶ言葉        | SAMPLE_PARAM |         |
| sample_flag  | 叫ぶかどうか      | SAMPLE_FLAG  | true    |
+--------------+-------------+--------------+---------+
```

他のactionもこのように表示されるので、action利用時に参考にすることが可能です。


## 最後に
上記の説明で分かったかと思いますが、独自actionを作るのは簡単です。
社内でしか使えない独自actionであれば社内で共有し、誰でも使えるのであればfastlaneにPRを出すのが良いかと思います。

今回は非常に意味のないactionを作成しましたがそのうち意味のあるサンプルを公開したいですね。