Github Actions 사용한 electron build

Github Actions는 예전부터 사용할 수 있었지만 마땅히 사용할 곳이 없었다. Tistory Editor는 travis-ci로 멀쩡히 잘 동작하고 있어서 굳이 바꾸면서 고생하기는 싫고 이걸 위해서 따로 뭔가를 만들기도 뭣하고 해서 사용을 안하고 있었다.

Github Actions로 변경한 이유

script:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then npm run build; npm run dist -- -l; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm run build; npm run dist -- -mw; fi

그럼 왜 변경했느냐? Tistory Editor는 travis에서 이렇게 2번의 빌드로 3개의 플랫폼 빌드를 만들어내고 있었다. 그런데 osx에서 windows 빌드를 만드는 것에서 문제가 생겼다. 라이브러리한 곳에서 문제가 발생하고 있는데 너무나 많은 라이브러리를 사용하고 있는 상황이라 이걸 추적하는 것이 쉽지 않았다.

가장 쉬운 해결방법은 windows에서 빌드를 하는 것인데 안타깝게도 travis는 windows환경을 제공하지 않는다. 그때 github actions에서 windows환경을 제공하는 것이 생각났다. 그래서 이번 기회에 옮겨보기로 했다.

Github Actions 사용법

Github Actions는 이전 글에서도 정리했듯 workflow에 조건(on), 수행할 일(job)을 정리하면 된다.

name: Release

on:
  push:
    tags:
      - v*

jobs:
  build:

    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [macOS-latest, windows-latest, ubuntu-latest]

    steps:
      - name: Context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"
      - uses: actions/checkout@v1
        with:
          fetch-depth: 1
      - name: Use Node.js 10.x
        uses: actions/setup-node@v1
        with:
          node-version: 10.x
      - name: Decrypt secret
        run: ./.github/scripts/decrypt_secret.sh
        env:
          BUILD_KEY: ${{ secrets.BUILD_KEY }}
          BUILD_IV: ${{ secrets.BUILD_IV }}
      - name: npm install
        run: |
          npm install
      - name: npm build
        run: |
          npm run build
      - name: electron build
        run: |
          npm run dist
      - name: Release
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: "dist/TistoryEditor*"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

많은 시행착오 끝에 정리한 이 workflow를 보면 대략 github actions의 동작을 알 수 있다. 먼저 이 workflow는 v로 시작하는 tag가 생성되면 수행된다.

on:
  push:
    tags:
      - v*

job은 3개의 os에서 각각 수행되도록 했다. matrix.os 에 원하는 os 버전을 설정하고 runs-on으로 수행하면 된다.

    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [macOS-latest, windows-latest, ubuntu-latest]

이제 가장 시행착오가 많았던 부분이다. secret data를 decrypt하는 것이다. 분명히 github actions의 문서에서는 gpg를 사용하라고 나와있는데 분명히 linux만 있을때 작성된 문서일 것이다. mac, windows에서는 gpg가 없다. 따로 설치해야한다. openssl로 key, iv 사용하면 모든 os에서 잘 된다.

      - name: Decrypt secret
        run: ./.github/scripts/decrypt_secret.sh
        env:
          BUILD_KEY: ${{ secrets.BUILD_KEY }}
          BUILD_IV: ${{ secrets.BUILD_IV }}

마지막으로 release다. 이미 누가 만들어 둔 것이 있으니 softprops/action-gh-release 이걸 사용하면 된다. ref가 tags이면 build결과물을 지정해서 업로드하라고 하면된다. 여러가지 옵션이 있는데 draft, prerelease로 할 수도 있고 폴더전체를 업로드할 수도 있다.

      - name: Release
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: "dist/TistoryEditor*"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

이렇게 시행착오를 겪은 actions이 완성됐다. 아직 조금 더 조정할 부분이 있는데 일단 이 정도에서 마무리하려고 한다. 이렇게 만들어두고보니 뭔가 또 수정해서 빌드해보고 싶다.

반응형