はじめに
Actionsを触り始めて間もないので、間違ってるところもあるかもです。ご指摘いただければ幸いです。
docker構築せずにseleniumを動かしたいという方は、こちらの記事を参考にしてください。
さて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]
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
# -*- 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()
# ワークフロー
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
については先の方法でも作成してますので、作成例は省略します。
# 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
name: 'test_docker'
description: 'test docker script'
# カレントディレクトリ?のDockerfileを実行
runs:
using: 'docker'
image: 'Dockerfile'
# ワークフロー
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絡みの記事になりがちですが、ぜひ自身の目的に合わせてアレンジして使ってみてください。