GithubActions上でDocker構築してseleniumを動かしたので簡単にまとめてみた（初心者）

# はじめに
Actionsを触り始めて間もないので、間違ってるところもあるかもです。ご指摘いただければ幸いです。

docker構築せずにseleniumを動かしたいという方は、[こちらの記事](https://qiita.com/yoshi-kin/items/d900a35744dee23657ad)を参考にしてください。

さてActionsでdockerを構築する方法ですが、個人的に大きく分けて2つあるのかなと思います。
・**Actionsのワークフロー上で直接イメージを利用してコンテナを構築する方法**
・**ワークフローとは別にDockerfileを作成しておいてワークフローから間接的に実行する方法**

前者の方が簡単ですが、後者の方が応用が利きそうな気がします。


# 1. ワークフロー上で直接イメージを利用してコンテナを構築する方法
こちらは簡単なのでサクッと行きます。

Actionsを動かしたいリポジトリにて以下の3つを作成します。
・google.chrome.repo（chromeをインストールするので必要）
・test_selenium.py
・.github/workflows/docker.yml（ワークフロー）

以下のような構成になります。
リポジトリ/
　　　　├ google.chrome.repo
　　　　├ test_selenium.py
　　　　└ .github/
　　　　　　　 └ workflows/
　　　　　　　　　　　　└ docker.yml

```google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

```python:test_selenium.py
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary

options = Options()
# ヘッドレスモード（Linux上で動かすとき必ずこのモードにしておく）
options.add_argument('--headless')
# よくわからないけど必要（はまった）
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
# アクセス先のURLを出力
print(driver.current_url)
driver.quit()
```

```yml:.github/workflows/docker.yml
# ワークフロー
name: docker_selenium
on: push

jobs:
  docker:
    runs-on: ubuntu-latest
    # コンテナ構築
    container:
      image: centos:7
    steps:
      - 
        name: Checkout Repository
        uses: actions/checkout@v2
      - 
        name: Install Python
        run: |
          yum -y update
          yum install -y https://repo.ius.io/ius-release-el7.rpm
          yum install -y python36u python36u-libs python36u-devel python36u-pip
          python3 --version
      -
        name: Install Chrome
        run: |
          cp google.chrome.repo /etc/yum.repos.d/google.chrome.repo
          yum install -y google-chrome-stable
          google-chrome --version
      -
        name: Install Package
        run: |
          pip3 install selenium
          pip3 install chromedriver-binary==94.*
      -
        name: Execute Selenium
        run: python3 test_selenium.py
```
ワークフローでは、コンテナを構築した後は自動的にコンテナ内での実行になるのでコンテナ内のディストリビューションに合わせてコマンドを実行しています。

あとはこれをコミットするとActionsタブでワークフローが実行されていることが確認できます。


# 2. ワークフローからDockerfileを間接的に実行する方法
こちらはリポジトリに以下の5つのファイルを作成します。

・Dockerfile
・action.yml
・google.chrome.repo
・test_selenium.py
・.github/workflows/docker.yml


以下のような構成になります。
リポジトリ/
　　　　├ Dockerfile
　　　　├ action.yml
　　　　├ google.chrome.repo
　　　　├ test_selenium.py
　　　　└.github/
　　　　　　　└ workflows/
　　　　　　　　　　　　└ docker.yml

`google.chrome.repo`と`test_selenium.py`については先の方法でも作成してますので、作成例は省略します。

```Dockerfile:Dockerfile
# centos7イメージ
FROM centos:7

# デフォルトシェルの指定
SHELL ["/bin/bash", "-c"]

# ホームディレクトリ(/root)に移動
WORKDIR /root

# Pythonをインストール
RUN yum -y update
RUN yum install -y https://repo.ius.io/ius-release-el7.rpm
RUN yum install -y python36u python36u-libs python36u-devel python36u-pip

# Chromeをインストール
COPY google.chrome.repo /etc/yum.repos.d/google.chrome.repo
RUN yum install -y google-chrome-stable

# 必要なパッケージをインストール
RUN pip3 install selenium
RUN pip3 install chromedriver-binary==94.*

COPY test_selenium.py /test_selenium.py
# コンテナ立ち上げ時に実行
ENTRYPOINT python3 test_selenium.py
```

```yml:action.yml
name: 'test_docker'
description: 'test docker script'

# カレントディレクトリ?のDockerfileを実行
runs:
  using: 'docker'
  image: 'Dockerfile'
```

```yml:.github/workflows/docker.yml
# ワークフロー
on: push

jobs:
  docker_selenium:
    runs-on: ubuntu-latest
    steps:
      - 
        name: Checkout Repository
        uses: actions/checkout@v2
      - # カレントディレクトリ（ここではリポジトリ直下）のaction.ymlを実行
        name: Run docker
        uses: ./
```

処理の流れとしては、
`当該リポジトリにpush（またはコミット）`
-> `docker.yml(ワークフロー)実行`
-> `action.yml実行` 
-> `Dockerfile実行`
になります。

ワークフローから直接Dockerfileを実行することはたぶんできないので、action.ymlをかますのがポイントです。

# まとめ
自分で調べた限りこの2つの方法がわかりやすいなと思ったのですが他の方法もあるかもしれません。知っている方がいましたらぜひコメントいただければと思います。

また、業務上seleniumを使うことが多いのでどうしてもselenium絡みの記事になりがちですが、ぜひ自身の目的に合わせてアレンジして使ってみてください。