Github Actionsでいろいろ困ったところと対応方法。主にシェルスクリプトを使うGitHub Actions

GitHub Actions

みなさん、GitHub Actionsで遊んでますか?
私も最近、GitHub Actionsで遊んでいるんですけど、
いくつか困ることもありまして、
この記事は、その時、困ったことの解決メモであります。
(雑な導入)


https://help.github.com/ja/actions/automating-your-workflow-with-github-actions


シェルスクリプト内で、privateなnpmレポジトリをnpm install

プレイベートなnpmレポジトリをnpm installするには、
.npmrc作るのが早い。

Settingsメニューから、Secrets設定を選んで、NPM_AUTH_TOKENを設定。
でもって、こんな感じ。

- run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
- name: npm install
  run: |
    npm install


シェルスクリプト内でgit clone

actionでなくて、シェルスクリプトでgitする。
ローカルで動くビルドスクリプトがあって、
それをGitHub Actionsでもそのまま使いたいケースの対応方法。

パターン1

git cloneする時、httpsでアクセスすれば、SSHの設定は要らない。

git clone git@github.com:taku-o/github-actions-workflow-demo.git
     ↓
git clone https://github.com/taku-o/github-actions-workflow-demo.git

パターン2

SSHのキーを設定しておけば、プライベートなGitHubレポジトリもcloneできる。
シェルスクリプトでいろいろする前に、
ssh-key-actionで、SSHの設定を入れておく。

- name: ssh key
  uses: shimataro/ssh-key-action@v1
  with:
    private-key: ${{ secrets.SSH_KEY }}
    public-key: ${{ secrets.SSH_KEY_PUBLIC }}
    known-hosts: ${{ secrets.SSH_KNOWN_HOSTS }}
- name: git clone
  run: |
    git clone git@github.com:taku-o/github-actions-workflow-demo.git


actions/cacheのlimitが小さくて困る

actions/cacheのキャッシュのlimitが小さい。400MB。
容量足りなくて、大きなアプリだと、一切キャッシュが効かなくなる。


でも、これぐらいならすぐに修正が入るだろう。
そう思っていた私は、issueが建ってから22日経過しているのを見て、
音速でフォークするのであった。

https://github.com/taku-o/github-actions-cache

- name: cache node environment
  id: cache-node
  uses: taku-o/github-actions-cache@v1.0.4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-


1GBまで増やした。
どうせやるなら、パラメータ外出しにしような
って意見もあるかもしれない。
ダメだわコレ。内部でtgzしてる。 よって単体でファイルサイズが400MB越えて、GitHub Actionsの制限にかかって消されちゃう(´・ω・`)


アクションのフォーク

アクションはGitHub Actions Marketplaceに公開しなくても使える。楽でイイネ。

でも、GitHub ActionsのアクションをForkして、自分のレポジトリに持ってくると、
レポジトリの名前が大げさ(?)な感じになっちゃうね。

アクションをForkする場合は、初手名前変更安定だろうね。

actions/cache
   ↓
taku-o/cache
   ↓
taku-o/github-actions-cache (邪魔にならない感じの名前に)


actions/upload-artifact

actions/upload-artifactはzip形式でファイルをアップロードする。

でも、既にzipファイルを作ってる場合は、それをそのままアップロードして欲しいんだよ、

って少し思ったけど、
mkdir、mvすれば良かっただけだね。
これならまだ許せる。

- name: collect staging built files
  run: |
    mkdir built
    mv release/app.zip built

- name: upload built files
  uses: actions/upload-artifact@master
  with:
    name: built
    path: built


nameは、built.zipとzip付きで指定すると、built.zip.zipが作られるぞ。
気をつけるのだ。

- name: upload built files
  uses: actions/upload-artifact@master
  with:
    name: built.zip
    path: built


gitのbranch名を取る

pushされたGitHubレポジトリのbranchの名前を取る。

GITHUB_REFの中に名前が入っている。
refs/heads/feature/window-sizeのようなフォーマット。

- name: build staging application
  run: |
    npx gulp build:staging --branch=${GITHUB_REF#refs/heads/}


Pull Requestされたコードを取る

Pull Requestされたコードを取る。
Pull Requestされたコードのテストなどで使う。

こちらもGITHUB_REFの中に名前が入っている。
refs/pull/9999/merge

- name: build pr application
  run: |
    npx gulp build:pr --pull_request=${GITHUB_REF#refs/}


実際に、Pull Requestのコードを取り込んで使うには ↓みたいなことするコードを書くことになるかな?

git clone taku-o/github-actions-workflow-demo
cd github-actions-workflow-demo
git pull origin pull/9999/merge


おわり

終わりなのだ。