【Github】Github Actions ~ 外部シェルスクリプト実行 ~

■ はじめに

今回は、Github Actionsで、可読性を上げるために、
共通処理を外部シェルスクリプトとして切り出して、
Github Actionsから呼び出して使う。

小ネタではあるが、色々と学ぶものがあったので、メモ。

目次

【1】Github Actions処理
 1)フォルダ構成
 2)実装したGithub Actions
 3)使用したシェルスクリプト
【2】気を付けるポイント
 Point1)シェルスクリプト自体は、Gitの構成のまま存在
 Point2)シェルスクリプトの実行権限に注意
【3】自分用メモ:今回学べたこと
 1)git update-index
 2)$@ と $* の違い

【1】Github Actions処理

1)フォルダ構成

+ .github/workflows
 | + main.py
 | + run-airflow-cli-for-mwaa.sh
+ ...

2)実装したGithub Actions

name: CI

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # ★Point1★
      - uses: actions/checkout@v4

      # ★Point1★ / ★Point2★
      - name: Call your script
        run: |
          .github/workflows/run-airflow-cli-for-mwaa.sh your-mwaa-name variables set KEY1 VALUE1
          .github/workflows/run-airflow-cli-for-mwaa.sh your-mwaa-name variables set KEY2 VALUE2

3)使用したシェルスクリプト

https://medium.com/dnx-labs/how-to-use-apache-airflow-cli-with-amazon-mwaa-a773edfa0a45

のスクリプトを少し改良。

run-airflow-cli-for-mwaa.sh

#!/bin/bash

MWAA_ENVIRONMENT=${1}
shift 1
AIRFLOW_CLIS=("$@")

# Check arguments
if [ "$MWAA_ENVIRONMENT" = "" ]; then
     echo "Provide one argument  as your MWAA name";
     exit 1;
fi
if [ "$AIRFLOW_CLIS" = "" ]; then
     echo "Provide at least one argument to the Airflow CLI";
     exit 1;
fi

# Get CLI token and web server hostname from AWS MWAA CLI
CLI_JSON=$(aws mwaa create-cli-token --name $MWAA_ENVIRONMENT)

# Parse results
CLI_TOKEN=$(echo $CLI_JSON | jq -r '.CliToken')
WEB_SERVER_HOSTNAME=$(echo $CLI_JSON | jq -r '.WebServerHostname')

# Trigger request of Airflow CLI from Amazon MWAA
RESPONSE=$(curl -s --request POST "https://$WEB_SERVER_HOSTNAME/aws_mwaa/cli" \
     --header "Authorization: Bearer $CLI_TOKEN" \
     --header "Content-Type: text/plain" \
     --data-raw "${AIRFLOW_CLIS[*]}")

# Check if we have a valid JSON to be parsed...
if jq -e . >/dev/null 2>&1 <<<"$RESPONSE"; then
     # If JSON is valid then get stdout and stderr
     STDOUT=$(echo $RESPONSE | jq -r '.stdout')
     STDERR=$(echo $RESPONSE | jq -r '.stderr')

     # Decode the results from Base64
     echo $STDOUT | base64 -d

     if [ "$STDERR" != "" ]; then
          echo "Error:"
          echo $STDERR | base64 -d
     fi
else
     # In case of invalid JSON just return the message to the terminal
     echo $RESPONSE
fi

【2】気を付けるポイント

Point1)シェルスクリプト自体は、Gitの構成のまま存在

当たり前なのかもしれないが、、、
シェルスクリプト自体は、Gitの構成のまま存在しているため、
呼び出す際は、例えば、以下のように呼び出すこと。
~~~~~
.github/workflows/run-airflow-cli-for-mwaa.sh your-mwaa-name variables set KEY1 VALUE1
~~~~~

これは、actions/checkout@vXで呼び出して、
Github Actionsでソースコードをcloneしているので。
actions/checkout@vXの詳細は、以下の関連記事を参照のこと

Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443

Point2)シェルスクリプトの実行権限に注意

https://www.folklore.icu/github-actions/entrypoint-pd/
https://qiita.com/kakiuchis/items/ae33adb0bbd98d258432

で言われている通り、以下を行って、
実行権限を付与しないとエラーになってしまう。

予め行わなければならないgitコマンド例

# git update-index --add --chmod=+x シェル名
git update-index --add --chmod=+x .github/workflows/run-airflow-cli-for-mwaa.sh

【3】自分用メモ:今回学べたこと

1)git update-index

* まだちゃんと砕けていないので、ちゃんと理解する、、、

2)$@ と $* の違い

* ほぼ同じだが、以下の違いがある(これでハマってうまく動かなかった)
 + "$*" : "a  b  c" に展開される
 + "$@":"a"  "b"  "c"  と別々の文字列に展開される

https://se.cite.ehime-u.ac.jp/~aman/memo/bash/shell_prog1.html

 => 以下の関連記事にも追記、、、

シェル ~ 基本編・引数あれこれ ~
https://dk521123.hatenablog.com/entry/2021/07/11/000421

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2023/12/21/155224
シェル ~ 基本編・引数あれこれ ~
https://dk521123.hatenablog.com/entry/2021/07/11/000421
MWAA ~ Variable ~
https://dk521123.hatenablog.com/entry/2023/12/28/002530
sedコマンド
https://dk521123.hatenablog.com/entry/2019/11/23/101625