Git Hub Actions入門
Github Actionsって何?
主にCI/CD
を実現するためにGithubが提供している機能。
Github上の何らかのアクションに応じた動作を定義できる。
例えば「git push
した場合に自動的に環境をビルドし、実環境にデプロイする」とか「自動テストを定義しておき、定期的に環境に対して実行する」など
Githubって?
Microsoftが買収した会社。
主にGithub.comというGitホスティングサイトを運営している。
Gitって?
Gitはソースコードを管理するためのバージョン管理システム。
過去の変更や最新のコードの管理を簡単に管理できる。
CI/CDって?
CI/CD (継続的インテグレーション/継続的デリバリー) とは、アプリケーション開発に自動化を取り入れて、顧客にアプリケーションを提供する頻度を高める手法。
ソフトウェア開発にで、ビルドやテストを自動化し、短期間で品質管理を行う手法。
とりあえず、お客様に早く届けるために自動化してやってこうぜって考え方。
とりあえずやってみる
1. gitレポジトリを作成する。
とりあえず、試すためのレポジトリを作成してください
この辺は適当に作成します。
今回はAdd a README file
などにチェックすると新しいレポジトリにファイルが追加される方法でやっています。
2. ローカルにクローンする
レポジトリ右上のCode
の部分からURLをコピーしてgit cloneします。
3. 実行ファイルを作成/実行
.github/workflows/
フォルダを作成し、任意の名前のyamlを作成します。
今回はrun.yaml
というファイルを作成しています。
name: learn-github-actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- run: echo "this is pen"
この実行ファイルは「pushが実行された場合に最新のGithubが準備したUbuntu環境でecho "this is pen"
というコマンドを実行する」という内容のワークフローになります。
この変更をレポジトリに追加し、git pushを行います
git add .
git commit -m"this is pen action add"
git push
このプッシュのタイミングでワークフローが実行されます。
4. 実行の確認
実行されたことを確認するには、Githubの対象のレポジトリのActions
を参照してください。
実行された、過去のワークフローを確認する事ができます。
下記の手順で選択をすると、this is pen
と出力されていることがわかります。
以上がgit hubactionsの超基本利用方法です。
好きなことをやらせてみる
これでubuntuで実行可能がことが、ほとんど可能なことがわかりました。
しかし、自動化する場合に0から他の環境構築などを行うと大変です。
それを簡単にするために、githubはマーケットプレイスを用意しています。
ここには、すでにパッケージ化された処理を共有し、再利用する事ができます。
少しパッケージを紹介します。
checkout
多分、最もよく使うやつです。
このアクションは「レポジトリからソースコードを取得する」というアクションになります。
下記のように利用すると、ソースコードが取得できる事がわかると思います。
name: learn-github-actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- run: echo "this is pen"
- uses: actions/checkout@v2
- run: |
ls -al
cd .github/workflows/
ls -al
- uses: actions/checkout@v2
でcheckout
のアクションを実行して、その後lsコマンドで作業フォルダ内と.github/workflows/
内を確認しています。
実行結果として下記のようになり、レポジトリのソースコードがcloneされていることが分かると思います。
docker/build-push-action
このアクションは、Dockerイメージをビルドし、自動的にdocker hubなどのイメージレポジトリサービスにPushするアクションです。
zaproxy/action-baseline
このアクションはZAPという脆弱性検査ツールを実行するアクションです。
単純実行のみなら容易だが、ログイン処理を組み込もうとするとデスクトップソフトの設定を読み込む必要があり面倒。
steebchen/kubectl
kubernetesを操作するkubectl
というCLIアプリケーションを利用するアクションです。
変数
コンテキストと環境変数
変数周りに関しては下記にまとめさせていただきました。
Github コンテキスト
Github Actionsの実行状態によって可変するGithub コンテキストというものも利用できます。
例えばgithub.sha
などはワークフローの実行をトリガーしたコミット SHAを取得する事ができます。
シークレット
秘密鍵やパスワード、IDなど表示したくない変数を利用する場合にシークレットという機能を利用できます。
定義
定義は、Organization単位かレポジトリ単位で定義する事ができます。
それぞれのSettingからSecretに移動し、変数名と内容を設定するだけです。
Organizationで利用すればレポジトリをまたいだ共有も可能となります。
利用方法
yaml上では下記のようにコンテキストの一種類として利用できます。
on: push
name: deploy
jobs:
deploy:
name: deploy to cluster
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: deploy to cluster
uses: steebchen/kubectl@v2.0.0
with: # defaults to latest kubectl binary version
config: ${{ secrets.KUBE_CONFIG_DATA }}
command: set image --record deployment/my-app container=${{ github.repository }}:${{ github.sha }}
- name: verify deployment
uses: steebchen/kubectl@v2.0.0
with:
config: ${{ secrets.KUBE_CONFIG_DATA }}
version: v1.21.0 # specify kubectl binary version explicitly
command: rollout status deployment/my-app
この場合は、
steebchen/kubectl
はkubernetesを操作するためのアクションになっていて、KUBE_CONFIG_DATA
というSecretにBase64で加工した$HOME/.kube/config
というkubernetesへの接続方法が記載された設定ファイルが入っています。
イベント
GithubActionsは実行されるタイミングも任意で設定できます。
yamlファイルの最初に記載されているon: push
などと定義されている部分を変更すれば、任意のタイミングで実行する事ができます。
※本当にいろいろなイベントが用意されていますが、一部のイベントはメインブランチにコミットしておく必要があることを注意してください。
よく使いそうな設定
push
ブランチがpush
されたタイミングで実行されます。
ブランチを別に指定することで、特定のbrunchにpushされたタイミングでアクションを実行する事ができます。
on:
push:
branches:
- main
schedule
スケジューリングされたタイミングでGithub Actionを実行できます。
このタイミングはCron構文で定義する事ができ、簡単に設定する事ができます。
on:
schedule:
- cron: '*/1 * * * *' #1分に1回実行
マニュアル実行
手動で任意のタイミングで実行したい場合、workflow_dispatch
を利用します。
また、このときに実行時引数なども定義しておき、実行前に選べるようにも設定する事ができます。
実行はGithub Actionsのタグから選択することができます。
外部連携
GithubAPIを利用して、外部と連携して実行する事もできるようです。
この場合、repository_dispatch
というイベントを利用します。
作者は利用したことがないので紹介だけ…
価格
パブリックレポジトリの場合は無料で利用できます。
ただし、プライベートレポジトリの場合はFreeプラインの場合は2000分が上限になります。
これを回避するためにはホストランナーといわれる、外部のサーバを用意してそちらでGithub Actionsを実行する方法もあります。
検索すると下記のような記事が色々と見つかります。
<ActionsのホストランナーをEC2でやってみた>
Discussion