1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Flutter-GB.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Полное описание использования GitHub Actions для сборки и публикации приложений на Flutter

GitHub Actions — это бесплатная служба автоматизации, предоставляемая GitHub, особенно полезная в сценариях непрерывной интеграции и доставки. Она способна автоматически выполнять множество различных задач, таких как сборка, тестирование и развертывание.

1. Краткое введение

Для подключения GitHub Actions достаточно создать скрипт .github/workflows/ в вашем открытом проекте на GitHub. Кроме того, официальный сайт GitHub предоставляет marketplace, где можно найти и использовать действия других разработчиков. Поэтому часто использование GitHub Actions сводится к выбору и комбинированию действий из marketplace. Конечно, у этого подхода есть свои преимущества и недостатки, что мы рассмотрим далее.

image-20220330110809824

Чтобы использовать GitHub Actions в своём репозитории на GitHub, вам сначала нужно создать директорию .github/workflows/, а затем создать различные файлы .yml в папке workflows для ответа на различные события, такие как git push, pull request и так далее. Например:```yaml name: GitHub Actions Demo on: [push] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - run: echo "🔍 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - name: Checkout repository code uses: actions/checkout@v2 - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner." - name: List files in the repository run: | ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}."


- **name**: Это указывает на имя файла рабочего процесса, которое будет отображаться как название в разделе Actions на GitHub;
- **on**: Здесь указано событие, которое запустит этот рабочий процесс; может содержать список событий, таких как `push`;
- **jobs**: Каждый рабочий процесс состоит из одного или нескольких задач, здесь всего одна задача, которая используется для представления различных работ;
- **Explore-GitHub-Actions**: Это идентификатор задачи, который можно переименовать по своему усмотрению; он будет отображаться во время выполнения действия;
- **runs-on**: Задачи должны выполняться на виртуальной машине; здесь используется `ubuntu-latest`, но также можно использовать `windows-latest` или `macos-latest`;
- **steps**: В каждой задаче шаги представляют собой последовательность действий, которые требуется выполнить;
- **run**: Предназначен для предоставления команд для выполнения; например, здесь используется `echo` для вывода логов;
- **name**: Имя шага является необязательным полем внутри шагов; оно используется для маркировки в журнале.- **uses**: Используется для выполнения официальных или сторонних действий, например, здесь используется официальное действие `actions/checkout@v2`, которое выкачивает наш репозиторий, после чего рабочий процесс может получить доступ к файлам в репозитории; После добавления файла `.github/workflows/ci.yml` в репозиторий GitHub, каждый `push` будет автоматически запускать действие, что обеспечивает непрерывную интеграцию и сборку.![](http://img.cdn.guoshuyu.cn/20220627_Flutter-GB/image2)

## Второй раздел: сборка Flutter и публикация APK на GitHub Release

Прежде чем мы перейдем к использованию GitHub Actions для сборки Flutter и публикации APK на GitHub Release, давайте рассмотрим следующий пример скрипта GitHub Actions, используемого в проекте [gsy_github_app_flutter](https://github.com/CarGuo/gsy_github_app_flutter):

```yaml
name: CI

on:
  push:
    branches:
      - master
    tags:
      - '*'
  pull_request:
    paths-ignore:
      - '**/*.md'
      - '**/*.txt'
      - '**/*.png'
      - '**/*.jpg'
``````markdown
jobs:
   build:
     name: Build
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v2
       - uses: actions/setup-java@v2
         with:
           distribution: 'zulu'
           java-version: 11
       - uses: subosito/flutter-action@v1
         with:
           flutter-version: '2.8.1'
       - uses: finnp/create-file-action@master
         env:
           FILE_NAME: lib/common/config/ignoreConfig.dart
           FILE_DATA: class NetConfig { static const CLIENT_ID = "${{ secrets.CLIENT_ID }}"; static const CLIENT_SECRET = "${{ secrets.CLIENT_SECRET }}";}
       - run: flutter pub get
       - run: flutter build apk --release --target-platform=android-arm64 --no-shrink
apk:
     name: Генерация APK
     if: startsWith(github.ref, 'refs/tags/')
     runs-on: ubuntu-latest
     steps:
       - name: Выгрузка репозитория
         uses: actions/checkout@v2
       - name: Настройка JDK
         uses: actions/setup-java@v2
         with:
           distribution: 'zulu'
           java-version: 8
       - uses: subosito/flutter-action@v1
         with:
           flutter-version: '2.5.3'
       - uses: finnp/create-file-action@master
         env:
           FILE_NAME: lib/common/config/ignoreConfig.dart
           FILE_DATA: class NetConfig { static const CLIENT_ID = "${{ secrets.CLIENT_ID }}"; static const CLIENT_SECRET = "${{ secrets.CLIENT_SECRET }}";}
       - run: flutter pub get
       - run: flutter build apk --release --target-platform=android-arm64 --no-shrink
       - name: Загрузка APK
         uses: actions/upload-artifact@v2
         with:
           name: apk
           path: build/app/outputs/apk/release/app-release.apk
   release:
     name: Выпуск APK
     needs: apk
     if: startsWith(github.ref, 'refs/tags/')
     runs-on: ubuntu-latest
     steps:
       - name: Скачивание APK из сборки
         uses: actions/download-artifact@v2
         with:
           name: apk
       - name: Отображение структуры скачанных файлов
         run: ls -R
       - name: Создание выпуска
         id: create_release
         uses: actions/create-release@v1.1.4
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
           tag_name: ${{ github.ref }}
           release_name: ${{ github.ref }}

В этом тексте были исправлены знаки препинания, пробелы и некоторые другие мелкие ошибки. - имя: Загрузка APK выпуска id: upload_release_asset использует: actions/upload-release-asset@v1.0.1 окружение: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} с: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./app-release.apk asset_name: app-release.apk asset_content_type: application/zip

| Ключевое слово              | Распространение           | Официальный сайт                                             | Лицензия                                                     |
|------------------------------|---------------------------|--------------------------------------------------------------|--------------------------------------------------------------|
| `temurin`                    | Eclipse Temurin           | [Ссылка](https://adoptium.net/)                             | [Ссылка](https://adoptium.net/about.html)                   |
| `zulu`                       | Zulu OpenJDK              | [Ссылка](https://www.azul.com/downloads/zulu-community/?package=jdk)|[Ссылка](https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/)|
| `adopt` или `adopt-hotspot`   | Adopt OpenJDK Hotspot     | [Ссылка](https://adoptopenjdk.net/)                         | [Ссылка](https://adoptopenjdk.net/about.html)               |
| `adopt-openj9`               | Adopt OpenJDK OpenJ9      | [Ссылка](https://adoptopenjdk.net/)                         | [Ссылка](https://adoptopenjdk.net/about.html)               |
| `liberica`                   | Liberica JDK              | [Ссылка](https://bell-sw.com/)                              | [Ссылка](https://bell-sw.com/liberica_eula/)                |
| `microsoft`                  | Microsoft Build of OpenJDK| [Ссылка](https://www.microsoft.com/openjdk)                | [Ссылка](https://docs.microsoft.com/java/openjdk/faq)       |

- Далее конфигурируется среда Flutter с помощью стороннего модуля `subosito/flutter-action@v1`, указывается версия Flutter через `flutter-version: '2.8.1'`;- Далее используется сторонний модуль `finnp/create-file-action@master` для создания файла. В проекте [gsy_github_app_flutter](https://github.com/CarGuo/gsy_github_app_flutter) есть конфигурационный файл, который пользователю требуется создать самостоятельно, вводя свои ID и SECRET. Поэтому здесь используем `create-file-action` для создания файла и заполнения его содержимым;

- В части заполнения содержимого имеется параметр `secrets.xxx`. Во время сборки необходимо настроить некоторые ключевые данные в действии, поэтому, как показано ниже, вы можете добавить соответствующие данные в разделе `Secrets` настройки `Settings`, чтобы затем использовать `secrets.xxx` для чтения данных внутри действия;

  ![image-20220330114509039](http://img.cdn.guoshuyu.cn/2bkjzq/image3)

- После настройки среды выполняются команды `flutter pub get` и `flutter build apk` для выполнения сборки.

После объяснения логики выполнения задачи сборки можно заметить, что под задачей сборки располагается ещё одна задача apk, которая в основном совпадает с задачей сборки, но имеет следующие отличия:

- Добавлено условие `if: startsWith(github.ref, 'refs/tags/')`, то есть эта задача будет выполняться только при наличии тэга;
- Добавлен модуль `actions/upload-artifact@v2` для загрузки созданного `build/app/outputs/apk/release/app-release.apk` и последующего использования этой сборки в задаче release.

После завершения задачи apk начинается выполнение задачи release, которая также активируется только при наличии тэга:- Задача начинается с загрузки ранее загруженной apk с помощью `actions/download-artifact@v2`;
- Затем создаётся выпуск с помощью `actions/create-release@v1.1.4`, где `secrets.GITHUB_TOKEN` является встроенным секретом от GitHub, которым можно пользоваться сразу;
- Наконец, apk загружается в созданный выпуск с помощью `actions/upload-release-asset@v1.0.1`, завершая процесс выпуска действия.

**Как видно, весь процесс представляет собой комбинацию различных действий**, что позволяет легко и гибко настраивать логику сборки. Например, если ваш проект представляет собой простой проект SDK Android, вы всё равно можете использовать следующую конфигурацию для управления выпусками:

```yaml
name: CI
on:
  push:
    branches:
      - master
    paths-ignore:
      - '.idea/**'
      - '.gitattributes'
      - '.github/**.json'
      - '.gitignore'
      - '.gitmodules'
      - '**.md'
      - '**/*.txt'
      - '**/*.png'
      - '**/*.jpg'
      - 'LICENSE'
      - 'NOTICE'
  pull_request:
    paths-ignore:
      - '.idea/**'
      - '.gitattributes'
      - '.github/**.json'
      - '.gitignore'
      - '.gitmodules'
      - '**.md'
      - '**/*.txt'
      - '**/*.png'
      - '**/*.jpg'
      - 'LICENSE'
      - 'NOTICE'

jobs:
  публикация:
    name: Публикация в MavenLocal
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: 17
      - uses: gradle/gradle-build-action@v2
        with:
          arguments: publishToMavenLocal

Теперь текст полностью переведён и корректно оформлен.```md Для сборки iOS приложений вам потребуется использовать среду macos-latest, а также правильно настроить сертификаты разработчика. Процесс может быть сложным, но вы можете найти полезные руководства, такие как "Полный гайд по сборке iOS приложения с помощью Flutter командной строкой".


Также исправлен раздел сборки:

```yaml
  сборка:
    имя: Сборка
    выполняется_на: ubuntu-latest
    шаги:
      - использует: actions/checkout@v3
      - использует: actions/setup-java@v3
        с:
          распределение: zulu
          версия_java: 17
      - использует: gradle/gradle-build-action@v2
        с:
          аргументы: app:assembleDebug
```## III. Проблемы приватности и безопасности

Наконец, стоит отметить, что ранее были случаи утечки чувствительных данных через GitHub Actions, например, токены GitHub. Например, в вышеупомянутых скриптах требуется секретный ключ для выполнения задач. Если используемые вами сторонние действия получили ваш секретный ключ и использовали его незаконным образом, это могло бы привести к утечкам данных.

Поэтому рекомендуется всегда проверять безопасность сторонних скриптов перед использованием. Однако, поскольку теги и ветки могут быть изменены, лучше всего использовать хеш коммита вместо ссылки на ветку или тег для проверки безопасности используемых действий.

Кроме того, некоторые злоумышленники могут попытаться получить доступ к конфиденциальной информации через pull request:

1. Разветвите открытый репозиторий, который использует GitHub Actions;
2. Создайте pull request на основе этого проекта;
3. Создайте злонамеренный workflow для события pull_request_target, затем сделайте отдельный коммит в форке;
4. Обновите базовую ветку pull request до хеша коммита из третьего шага.Злонамеренный workflow будет выполнен, и злоумышленник сможет получить доступ к чувствительным данным процесса выполнения. Это позволит ему получить права записи на целевой репозиторий, а также доступ ко всем службам, связанным с этим репозиторием через GitHub.

Соответственно, хотя GitHub Actions очень удобны, при принятии коммерческих решений следует аккуратно подходить к вопросам безопасности.


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master