0
0

More than 3 years have passed since last update.

GitHubActionsで定期実行と手動実行をやってみる

Last updated at Posted at 2020-02-29

サクっと定期実行を動かしつつ、たまに任意のタイミングでもスクリプトを動かせる環境をGitHubActionsで作れないかなと試してみた記録。

GitHubActions以外の選択肢候補

下記は考えただけで、最後までうまく行くかまでは考えてない。

何で動かすか なんで選ばなかったか
AWS EC2 外部APIを利用する際にVPCの構築とかめんどくさいし、稼働費がネック
AWS Lambda 手動実行するのにコンソールにログイン必要?

なぜGitHubActionsを選んだか

  • githubのアカウントがあれば使える
  • crontabのようなscheduleが使える
  • repository_dispatchトリガーによりCurlで実行できる

作ったもの

現在時刻を記載したテキストファイルをAWS S3にアップロードする
(ネットワークの利用、環境変数の動作とかをみたかった)


package main

import (
    "time"
    "os"
    "strings"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

func main() {
    currentTime := time.Now()
    creds := credentials.NewStaticCredentials(os.Getenv("MY_AWS_ACCESS_KEY_ID"), os.Getenv("MY_AWS_ACCESS_KEY_SECRET"), "")
    sess, _ := session.NewSession(&aws.Config{
        Credentials: creds,
        Region:      aws.String(os.Getenv("MY_AWS_REGION"))},
    )
    uploader := s3manager.NewUploader(sess)
    _, _ = uploader.Upload(&s3manager.UploadInput{
        Bucket:      aws.String(os.Getenv("MY_AWS_S3_BUCKET")),
        Key:         aws.String("s3-put-object.txt"),
        Body:        strings.NewReader(currentTime.Format("2006-01-02 15:04:05")),
        ContentType: aws.String("text/plain"),
    })
}
name: UpdateS3Object

on:
  schedule:
    - cron:  '0 1 * * *'
  repository_dispatch:
    types: [build]

jobs:
  execute:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: build
      run: docker-compose run golang go build s3-put-object.go
    - name: execute
      env:
        MY_AWS_ACCESS_KEY_ID: ${{ secrets.MY_AWS_ACCESS_KEY_ID }}
        MY_AWS_ACCESS_KEY_SECRET: ${{ secrets.MY_AWS_ACCESS_KEY_SECRET }}
        MY_AWS_REGION: ${{ secrets.MY_AWS_REGION }}
        MY_AWS_S3_BUCKET: ${{ secrets.MY_AWS_S3_BUCKET }}
      run: ./golang/s3-put-object

手動実行は

curl -X POST -H "Authorization: token #{Personal access token}" -H "Content-Type: application/json" -d '{"event_type":"build","client_payload":{}}' https://api.github.com/repos/:user/:repo/dispatches

感想

docker-composeも使えたのでわりとなんでもできそう
手動実行をcurlで実現したが、slack botとかと連携させることもできそう
upload-artifact, download-artifactを使ってビルドと実行を分離すればもっときれいになりそう
秘匿情報の扱いも簡単(githubを全面的に信用している)

この程度のスクリプトであれば、特になんの懸念もなくやりたいことができました。
今回のサンプルコードではAWSを使ったサンプルですが、定期実行自体にはAWSは関係なく、AWSアカウントの発行は不要です。
AWSやGCPの契約を必要とせずにgithubのアカウントだけでリモート環境に定期実行環境を構築できることはなかなか強みだなと思いました。

0
0
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
0
0