Try Github Actions

Github Actionsを試してみた

Github Actions を使い始めてみました。 ブランチにpushされたらtarで固めて転送して、 転送ファイル名をブランチにより切り替える みたいなものをやってみた。

workflowファイル

サーバ名とかは隠してる。

name: Actions Test
on:
  push: 
    branches:
      - master
      - development
jobs:
    build:
        name: test job
        runs-on: ubuntu-latest
        steps:
            - name: checkout master 
              if: github.ref == 'refs/heads/master'
              uses: actions/checkout@v2
              with: 
                ref: master
                path: source
            - name: checkout development 
              if: github.ref == 'refs/heads/development'
              uses: actions/checkout@v2
              with: 
                ref: development
                path: source
            - name:  make tarball
              run: tar -zcvf source.tar.gz -C source  .
            - name: make ssh key
              run: echo "$SSH_PRIVATE_KEY" > secret && chmod 600 secret
              env:
                SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
            - name: echo github context
              run: echo "$GITHUB_CONTEXT"
              env: 
                GITHUB_CONTEXT: ${{ toJson(github) }}
            - name: scp tarball master 
              if: github.ref == 'refs/heads/master'
              run: scp -i secret -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no source.tar.gz zzzzzz@zzzzz:master.tar.gz
            - name: scp tarball development
              if: github.ref == 'refs/heads/development'
              run: scp -i secret -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no source.tar.gz zzzzzz@zzzzz:development.tar.gz

やっていることは

  1. ソースをチェックアウト
  2. tarでソースを圧縮
  3. secretsからrsa鍵を取得
  4. github contextのダンプの表示(ただの確認)
  5. masterブランチだったら、master.tar.gzとしてファイルを転送、developmentブランチの場合development.tar.gzとしてファイルをscpする

こんな感じ

チェックアウト

    - name: checkout master 
      uses: actions/checkout@v2
      with: 
        ref: release
        path: source

特定のブランチやら何やらをチェックアウトできる

コンテキストのダンプ

    - name: echo github context
      run: echo "$GITHUB_CONTEXT"
      env: 
        GITHUB_CONTEXT: ${{ toJson(github) }}

この部分でgithubコンテキストをjsonにして、表示をしている。github actionsのページでdump結果が確認できればOK。 コンテキストは公式ドキュメントを見るといい。

if

    if: github.ref == 'refs/heads/master'

if 文自体は割とすんなり書けた。 else は現状できない。今回はやっていることが単純だからほぼ一緒のコマンドが並んでるんだけど、 コマンドが複雑になりそうとかだったらそもそもworkflowファイルを分けるか、専用のactionsを書いた方がいい感じがする。

secretの取得

    - name: make ssh key
      run: echo "$SSH_PRIVATE_KEY" > secret && chmod 600 secret
        env:
        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

レポジトリのSettingsタブからSecretsを開くと秘密情報を入力できるページにいく。 そこで設定した変数がActionsから参照できるようになる。

普段Ansibleに触っているので、yamlを書くのはそんなに違和感がないので良かった。あと、ifとかの構文が入ってくると途端にややこしくなるっていう肌感もAnsibleと似てる気がする。

長いworkflowを書くよりも細かく区切って一つ一つをわかりやすくした方がつかいやすそうな印象。思ったよりも簡単だったので使えるところにぶっ込んでいこう。

connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

Jp, Tokyo https://connvoi.com