GiitHub Actions로 Dart 제작 명령줄 도구 구축 및 공개

13998 단어 GitHub ActionsDarttech

하고 싶은 일


Dartdart compile exe는 단일 바이너리를 출력하기 때문에 회사 내부를 대상으로 하는 명령행 도구를 제작하여 나누어 주는 등 쉽다.
GiitHub Releases↓에서 이런 느낌으로 만들고 싶어요.

GiitHub Actions 구축 후 Releases에 업로드


Go로 쓰면 교차 컴파일할 수 있고, Gooleaser로 GiitHub Releases에 업로드하는 것도 수월하지만, Dart에서는 그렇게 완벽한 구조가 없다.
https://github.com/dart-lang/sdk/issues/28617
교차 번역이 안 된 지 2년 정도 지났는데 다들 포기할 뻔했다.대신 GiitHub Actions를 사용하는 윈도우즈-latest, 마코스-latest, Ubuntu-latest가 정형화됐다.
위의 issue는 실제로 각자의 구축 환경에서 구축되어 위영에 업로드된 샘플이 있지만 GiitHub Releases는 이를 총괄하는 스크립트가 없습니다.

편역하다


각 OSdart compile exe에서만 작동하지만 출력 파일 이름은 Windows.exe에서만 작동해야 합니다.다음 matrix/include를 사용할 수 있습니다.
jobs:
  compile:
    name: dart compile exe
    strategy:
      matrix:
        include:
          - runs-on: ubuntu-latest
            binary-name: mycli_linux_amd64
          - runs-on: macos-latest
            binary-name: mycli_macos_amd64
          - runs-on: windows-latest
            binary-name: mycli_windows.exe
    runs-on: ${{ matrix.runs-on }}
    steps:
      - uses: actions/checkout@v2
      - uses: dart-lang/setup-dart@v1
      - run: dart pub get
      - run: mkdir ${{ matrix.runs-on }}
      - run: dart compile exe bin/mycli.dart -o ${{ matrix.runs-on }}/${{ matrix.binary-name }}

발행 방법


https://docs.github.com/ja/rest/reference/repos#releases
영화를 보려면 두 가지 일이 필요하다.
  • 릴리스
  • POST/repos/{owner}/{repo}/releases
  • 릴리스에 asset 업로드
  • POST/repos/{owner}/{repo}/releases/{release_id}/assets
  • api.github.컴이 아니라 업로드예요.github.com
  • 처음엔 컬에서 해보려고 노력했지만 GiitHub Action의 시장 광장을 보면 저장도 많이 된 것 같아서 빌려 썼어요.

    acti-gh-release를 사용하여 제작 발행

    actions/create-release@v1actions/upload-release-asset@v1 유지 보수가 없는 것 같아서 softprops/action-gh-release@v1로 대체했습니다.
    https://github.com/softprops/action-gh-release
    하나의 동작으로 파일을 제작하고 업로드할 수 있어 편리하다.
    다양한 옵션을 지정할 수 있지만 초고로 먼저 제작해 배포하고 파일을 올리고 싶다면 다음과 같은 내용만 있으면 된다.
          - uses: softprops/action-gh-release@v1
            with:
              draft: true
              files: out/*
    
    files는glob 형식으로 지정할 수도 있고 다음과 같이 여러 줄을 지정할 수도 있습니다.
              files: |
    	    out/mycli_linux
    	    out/mycli_macos
    	    out/mycli_windows
    

    총결산


    이런 느낌 괜찮은데.바이너리 이름만 조정하면 다양한 CLI 애플리케이션에서 사용할 수 있을 것입니다.
    .github/workflows/deploy.yml
    name: Deploy
    
    on:
      push:
        tags:
          - '[0-9]+.[0-9]+.[0-9]+'
    
    jobs:
      compile:
        name: dart compile exe
        strategy:
          matrix:
            include:
              - runs-on: ubuntu-latest
                binary-name: mycli_linux_amd64
              - runs-on: macos-latest
                binary-name: mycli_macos_amd64
              - runs-on: windows-latest
                binary-name: mycli_windows.exe
        runs-on: ${{ matrix.runs-on }}
        steps:
          - uses: actions/checkout@v2
          - uses: dart-lang/setup-dart@v1
          - run: dart pub get
          - run: mkdir ${{ matrix.runs-on }}
          - run: dart compile exe bin/mycli.dart -o ${{ matrix.runs-on }}/${{ matrix.binary-name }}
          - uses: actions/upload-artifact@v2
            with:
              name: bin-${{ matrix.runs-on }}
              path: ${{ matrix.runs-on }}
    
      release:
        needs: compile
        name: github release
        runs-on: ubuntu-latest
        steps:
          - uses: actions/download-artifact@v2
            with:
              name: bin-ubuntu-latest
              path: bin-linux
          - uses: actions/download-artifact@v2
            with:
              name: bin-macos-latest
              path: bin-macos
          - uses: actions/download-artifact@v2
            with:
              name: bin-windows-latest
              path: bin-windows
          - uses: softprops/action-gh-release@v1
            with:
              draft: true
              files: bin-*/*
    
    이렇게 실제로 쳐봤어요.

    3 병렬 컴파일된/제작

    상상했던 것과 같은 것을 만들었습니다(^o^)/

    좋은 웹페이지 즐겨찾기