3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ミライトデザインAdvent Calendar 2024

Day 19

GitHub Actionsで制約を突破!サードパーティActionsなしで自前アクションを作った話

Last updated at Posted at 2024-12-19

この記事はミライトアドベントカレンダー 19日目の記事です。
昨日は ほげさん概観 トランザクションとロック - 用語整理と最初の一歩 - でした。

トランザクション分離レベルについては学生時代に勉強したっきりで、これまであまり気にしてませんでした...
この機会に勉強させていただこうと思います。

ZennのBookって章ごとにページ分けられて良いですね、Qiitaだと長い1ページが長くなっちゃうので...

さて、本日の記事は Pest アーキテクチャテスト についての記事を書く予定でしたが、時間が足りず別のネタに急遽変更しました。
コード書いたり、検証が必要な内容だと完成させるの大変でした...

仕切り直して本日の記事は GitHub Actionsで制約を突破!サードパーティActionsなしで自前アクションを作った話 です。

何が起きたのか

このワークフローはPHPUnitを実行して自動テストを行なってくれるワークフローです。

.github/workflows/phpunit.yml
name: PHPUnit
on:
  pull_request:
jobs:
  phpunit:
    runs-on: ubuntu-20.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - name: Setup PHP with composer v2
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          tools: composer:v2
      - name: PHP Version
        run: php -v
      - name: Composer Version
        run: composer -V
      - name: Install Dependencies
        run: composer install --quiet --prefer-dist --no-progress --no-interaction --no-scripts --no-ansi
      - name: PHPUnit Testing
        run: ./vendor/bin/phpunit

こんな感じのPHPとComposerをインストールして、PHPUnitを実行するシンプルなワークフローです。

えいや!とgit pushしたらGitHub Actions上で Startup failure のエラーが表示されました。詳細なエラーは次の内容でした。

Error
shivammathur/setup-php@v2 is not allowed to be used in company-name/project-name. Actions in this workflow must be: within a repository that belongs to your Enterprise account, created by GitHub, or matching the following: aws-actions/, gradle/, hashicorp/, redhat-actions/, google-github-actions/*.

なんとPHPの環境構築をしてくれる shivammathur/setup-php ライブラリが許可されていませんでした...

客先と交渉しましたが、結論はセキュリティ上サードパーティのアクションズは許可できないとのことでした。

自前で実装するのはいいですよと許可貰えたので、せっかくなので自分で書いてみることにしました。

方針

複数のワークフローでPHPの環境を用意したかったため、複合アクション(Composite Action)を使ってPHP環境構築の部分を切り出すことにしました。

複合アクションの実装

ディレクトリ構成

.github
├── actions
│   └── php-setup
│       └── action.yml
└── workflows
    └── phpunit.yml
  • .github/actions/php-setup/action.yml
    • 複合アクションファイル名は action.yml or action.yaml 固定なので注意
  • .github/workflows/ci.yml
    • ワークフローファイル

PHP Setup複合アクション

.github/actions/php-setup/action.yml
name: PHP Setup
description: PHP, Composer をインストールするアクション
inputs:
  php-version:
    description: 'PHP version to install'
    required: true
  composer-version:
    description: 'Composer version to install'
    required: true
runs:
  using: composite
  steps:
    - name: Add PHP repository
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y software-properties-common
        sudo add-apt-repository -y ppa:ondrej/php
        sudo apt-get update
    - name: Install PHP
      shell: bash
      run: |
        sudo apt-get install -y \
        php${{ inputs.php-version }} \
        php${{ inputs.php-version }}-cli \
        php${{ inputs.php-version }}-mbstring \
        php${{ inputs.php-version }}-xml \
        php${{ inputs.php-version }}-curl \
        php${{ inputs.php-version }}-zip \
        php${{ inputs.php-version }}-bcmath \
        php${{ inputs.php-version }}-bz2 \
        php${{ inputs.php-version }}-calendar \
        php${{ inputs.php-version }}-pdo-sqlite \
        php${{ inputs.php-version }}-sqlite3
    - name: Set PHP default version
      shell: bash
      run: sudo update-alternatives --set php /usr/bin/php${{ inputs.php-version }}
    - name: Install Composer
      shell: bash
      run: |
        curl -sS https://getcomposer.org/installer | php -- --version=${{ inputs.composer-version }}
        sudo mv composer.phar /usr/local/bin/composer

補足: inputs

inputs:
  php-version:
    description: 'PHP version to install'
    required: true

inputs で受け取る値を取得
${{ inputs.php-version }} で取得できる

runs:
  using: composite

ワークフローと違って、 jobs ではなく runs なことと using: composite と複合アクションと明示する必要があるようです。
自分はずっと勘違いして jobs と書いてました笑

補足: Add PHP repository ステップ

    - name: Add PHP repository
      shell: bash
      run: |
        sudo apt-get update
        sudo apt-get install -y software-properties-common
        sudo add-apt-repository -y ppa:ondrej/php
        sudo apt-get update

ppa:ondrej/php
Ondřej Surý 氏が管理する Ubuntu 用のサードパーティーリポジトリ(PPA: Personal Package Archive)です。

ppa:ondrej/php を追加するために add-apt-repository コマンドを利用します。
add-apt-repository コマンドを利用するために software-properties-common パッケージをインストールしています。

注意点なんですが、 shell: bash 各ステップに shell の指定が必須です。

補足: Install PHP ステップ

    - name: Install PHP
      shell: bash
      run: |
        sudo apt-get install -y \
        php${{ inputs.php-version }} \
        php${{ inputs.php-version }}-cli \
        php${{ inputs.php-version }}-mbstring \
        php${{ inputs.php-version }}-xml \
        php${{ inputs.php-version }}-curl \
        php${{ inputs.php-version }}-zip \
        php${{ inputs.php-version }}-bcmath \
        php${{ inputs.php-version }}-bz2 \
        php${{ inputs.php-version }}-pdo-sqlite \
        php${{ inputs.php-version }}-sqlite3

PHPをインストールしています。
プロジェクトで使っている拡張機能をインストールしています。

補足: Set PHP default version ステップ

    - name: Set PHP default version
      shell: bash
      run: sudo update-alternatives --set php /usr/bin/php${{ inputs.php-version }}

update-alternatives コマンドはDebianベースのLinuxディストリビューションで用意されているシステムコマンドです。
このコマンドは、システム内で複数のバージョンが存在するコマンドやツールを管理するために使用します。

補足: Install Composer ステップ

    - name: Install Composer
      shell: bash
      run: |
        curl -sS https://getcomposer.org/installer | php -- --version=${{ inputs.composer-version }}
        sudo mv composer.phar /usr/local/bin/composer

ここでは Composer をインストールしています。

PHPUnitを実行するワークフロー

.github/workflows/phpunit.yml
name: PHPUnit
on:
  pull_request:
jobs:
  phpunit:
    runs-on: ubuntu-20.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - name: Setup PHP
        uses: ./.github/actions/php-setup
        with:
          php-version: '8.2'
          composer-version: '2.7.7'
      - name: PHP Version
        run: php -v
      - name: Composer Version
        run: composer -V
      - name: Install Dependencies
        run: composer install --quiet --prefer-dist --no-progress --no-interaction --no-scripts --no-ansi
      - name: PHPUnit Testing
        run: ./vendor/bin/phpunit

補足: Setup PHP ステップ

複合アクションを呼び出してる箇所です。

      - name: Setup PHP
        uses: ./.github/actions/php-setup
        with:
          php-version: '8.2'
          composer-version: '2.7.7'
  • uses: ./.github/actions/php-setup
    • ファイル名ではなくディレクトリ名を指定するところが注意です

さいごに

今回はセキュリティでやむなく複合アクションに切り出しましたが、思ったより便利でした。
ハマりどころも知れたので、共通アクションがある場合は切り出してみようかなと思いました。

明日のアドベントカレンダー

明日のミライトデザインのアドカレは ブッチ さんの「データ活用から始めるエンジニアの視野の広げ方」という記事です。お楽しみに!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?