Help us understand the problem. What is going on with this article?

GitHub ActionsでScalaのプロジェクトをビルドする

# 実現したこと
GitHub Actionsを使用してScalaのプロジェクトをビルドして、ビルドしたパッケージをS3へアップする処理

name: Build to Scala Project

on:
  push:
    branches:
      - master

jobs:
  build:
    name: Build to Scala Project
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        ref: ${{ github.event.push.head.sha }}
    - name: Notify push start to Slack
      run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【START】 Scala Build"}' ${{ secrets.SLACK_WEBHOOK }}
    - name: Setup Python 3.7 for awscli
      uses: actions/setup-python@v1
      with:
        version: '3.7'
        architecture: 'x64'
    - name: Install awscli
      run: pip install --upgrade pip awscli
    - name: Setup Sbt and Build
      id: sbt
      uses: lokkju/github-action-sbt@8-0.13.17-2.11.12
      with:
        commands: dist
        sbt_project_directory: ./
    - name: Push package to S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: aws s3 cp "target/universal/hoge.zip" s3://piyo/piyo/
    - name: Deploy failure
      if: failure()
      run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Faild】Scala Build"}' ${{ secrets.SLACK_WEBHOOK }}
    - name: Deploy success
      if: success()
      run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Success】Scala Build"}' ${{ secrets.SLACK_WEBHOOK }}

細部の補足

AWS CLIの導入

S3へパッケージをアップする際に、AWS CLIが必要になるため、Python環境が利用できるアクションを利用して、AWS CLIを導入してます。

- name: Setup Python 3.7 for awscli
  uses: actions/setup-python@v1
  with:
    version: '3.7'
    architecture: 'x64'
- name: Install awscli
  run: pip install --upgrade pip awscli

Scalaのソースコードのビルド

同様に、SBTの環境がセットアップされたアクションを利用して、Scalaのソースコードをビルドしています。
今回は、以下のアクションを使用しました。
https://github.com/lokkju/github-action-sbt

commands: 実行したいコマンド
の形式で引数でコマンドを指定してあげることで、動作の制御が行えます。
今回の場合は、以下のコマンドを発行しているのと同義です。
sbt dist

同時にテスト等も実行したい場合は、以下のように書くと実現できる気がします(動作未検証)。
commands: test clean dist

8-0.13.17-2.11.12 の部分は、それぞれ
{JAVA_VERSION}-{SBT_VERSION}-{SCALA_VERSION}の順で指定できます。
それぞれの対応されているバーションの中から、自身のプロジェクトのバージョンに即したものを指定して利用してください。

- name: Setup Sbt and Build
  id: sbt
  uses: lokkju/github-action-sbt@8-0.13.17-2.11.12
  with:
    commands: dist
    sbt_project_directory: ./

ビルド後のパッケージをS3にアップする

env のパートで、環境変数を登録しておくことができます。
${{ secrets.AWS_ACCESS_KEY_ID }} GitHubのリポジトリの設定で、予めシークレット変数(リポジトリのSettings>Secretsで設定できる)を設定しておくことで、以下のようにして利用することが可能です。
AWSリソースへのアクセスキー等のセンシティブな認証情報は、直接記載せずに、シークレット変数として定義して利用することが好ましいです。

- name: Push package to S3
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  run: aws s3 cp "target/universal/hoge.zip" s3://piyo/piyo/

通知

success() failure() 関数を利用することで、成功時、失敗時、それぞれでの通知の定義が可能です。

- name: Deploy failure
  if: failure()
  run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Faild】Scala Build"}' ${{ secrets.SLACK_WEBHOOK }}
- name: Deploy failure
  if: success()
  run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Success】Scala Build"}' ${{ secrets.SLACK_WEBHOOK }}

最後に

CircleCIからの乗り換えでしたが、割とクセなくシンプルで使いやすいな って印象を受けました。
難点を1つ上げるとすると、CircleCIでは、ECR等のBuild済みのコンテナのイメージを指定できるのに対し、GitHub Actionsでは、毎回イメージのビルドから始まるので、その分の時間的なオーバーヘッドがかかってしまうくらいです。
GitHub Packagesまたは、DockerHubのレジストリが指定でき、そちらを使用することでイメージのビルド分の時間を節約できるそうです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした