본문 바로가기

개발하자

깃허브 액션으로 플러터웹 사용시 비밀접속하는 방법

반응형

깃허브 액션으로 플러터웹 사용시 비밀접속하는 방법

나는 플러터 웹 앱을 가지고 있고 데이터베이스에 접속하기 위해 파일에 API 키를 하드코딩했고, 이것은 완벽하게 잘 작동한다. 버전 관리에 이 파일을 적용하는 것을 방지하기 위해 에 추가했습니다. 그러나 GitHub 액션을 사용하여 앱을 배포할 때 스크립트는 비밀 파일을 감지하지 못하기 때문에 실패합니다.

나는 기본적으로 비밀을 저장할 수 있는 Github의 문서를 보았다.하지만 그 비밀들은 오직 yml 파일에서만 접근할 수 있는 것 같다.

이 비밀을 앱에서 어떻게 사용하면 스크립트가 성공적으로 실행되고 앱을 배포할 수 있는지 알고 싶습니다. 여기 내 폴더 구조가 있다

lib/
  services/
     database.dart /// this file uses the APIkey from secrets.dart
  secrets.dart /// contains the APIkey

내가 생각할 수 있는 이 문제를 해결할 수 있는 한 가지 방법은 파일을 사용하는 것이지만 CI 스크립트를 통해 .env 파일의 비밀 키를 추가하는 방법에 대해 잘 모릅니다. 저는 그것이 제 문제도 해결해 줄 것이라고 믿습니다.

여기 제 CI 스크립트가 있습니다

# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools

name: Deploy to Firebase Hosting on merge
"on":
  push:
    branches:
      - master
jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: "12.x"
      - uses: subosito/flutter-action@v1
        with:
          channel: "master"
      - run: flutter pub get
      - run: flutter pub run build_runner build --delete-conflicting-outputs
      - run: flutter build web --release
      - uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: "${{ secrets.GITHUB_TOKEN }}"
          firebaseServiceAccount: "${{ secrets.FIREBASE_SERVICE_ACCOUNT_VOCABHUB_34C7F }}"
          channelId: live
          projectId: vocabhub-34c7f
        env:
          FIREBASE_CLI_PREVIEWS: hostingchannels




소스 컨트롤에서 무시당하면서 파일을 사용할 수 있습니다.

여기 단계가 있습니다

  1. 로컬 컴퓨터에서 다음 명령을 사용하여 의 내용을 인코딩합니다:
  2. 출력물을 GitHub 비밀에 복사하여 붙여넣거나 이름을 지정하거나 원하는 대로 붙여넣습니다.
  3. 이 CI 단계를 단계 직전에 스크립트에 추가합니다.

GitHub 사용자 인터페이스에서 비밀을 추가하려면 다음 단계를 수행합니다:

Click on the repository's Settings tab, click on Secrets, click "New repository secret", DO NOT USE "environment secrets" because it does not work

Fill in the name of the variable e.g. SECRETS_FILE_CONTENT and its value e.g. the base-64 encoded file contents

사용자의 비밀은 UI의 하위 "저장소 비밀" 절반에 나타나야 하며, "환경 비밀"에는 나타나지 않아야 합니다. 단순한 것으로는 작동하지 않기 때문입니다.

The SECRETS_FILE_CONTENT variable name should now appear in the second box at the bottom

더 많은 컨텍스트를 제공하기 위해 저장소에 있는 gitub/workflows/ci.yml과 같은 "actions" 파일의 모양은 다음과 같습니다:

name: CI

on:
  push:
    branches: [ main, dev ]
  pull_request:
    branches: [ main ]

  # Allows to run this workflow manually from the Actions tab
  workflow_dispatch:
  
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Decode base64 secrets
        run: echo $SECRETS_FILE_CONTENTS | base64 -d > lib/path/to/secrets.dart
        env:
          SECRETS_FILE_CONTENTS: ${{ secrets.SECRETS_FILE_CONTENTS }}
      # … put your steps here
        run: flutter pub get

편집

이것은 사람들이 화력 기지에서 일할 때 숨어 있을 때도 마찬가지의 과정이다. 또는 서명 키(또는 )를 사용합니다.




Repository Secret보다는 Environment Secret를 사용하는 경우 어떤 환경을 사용할지 정의해야 합니다. 이 내용을 확인해 보십시오

jobs:
  build:
    environment: **ENVIRONMENT NAME HERE**

    steps:
      - name: blah blah
        run: echo blah blah

업데이트(2022-08-09)


jobs:
    build:
    ...
    environment: Foo
    steps:
        - uses : actions/checkout@v3
        - name : Run some customized action
          env :
            a : ${{ secrets.Bar }}
            b : $ Mona  
            c : ${{ secrets.Lisa }}
          run : |
            echo $a 
            echo $b
            echo $c

제가 답변을 드린 이후로 많은 업데이트가 있었기 때문에 정리하자면, 지금 깃허브에는 3가지 비밀이 있습니다

  1. 환경의 비밀
  2. 작업 비밀(Repository Secret)
  3. 디펜더봇 시크릿

의존 로봇이 이 범위를 벗어났습니다.

환경 비밀은 다음과 같습니다:

Settings -> Environments -> New Environments -> Environment Secrets

행동 비밀은 다음:

Settings -> Secrets -> Actions -> Repository Secrets

따라서 논리적으로 환경의 비밀 가치에 접근하려면 다음과 같은 두 가지 임의 변수를 알아야 합니다: Environment Name and Environment Secret Name 예:

내가 쓴대로라면

그리고.

그리고.

일정하다

그리고.

is Actions(Repository) Secret Name

Environment Secret를 Repository Secret로 설정하면

콘솔 출력은 다음과 같습니다:

Mark

Mona

Twain

또한 깃허브는 URI를 고려하여 "***"와 같은 비밀값을 리코딩하여 디버깅한다.


반응형