GitHub Actions — это бесплатная служба автоматизации, предоставляемая GitHub, особенно полезная в сценариях непрерывной интеграции и доставки. Она способна автоматически выполнять множество различных задач, таких как сборка, тестирование и развертывание.
Для подключения GitHub Actions достаточно создать скрипт .github/workflows/
в вашем открытом проекте на GitHub. Кроме того, официальный сайт GitHub предоставляет marketplace, где можно найти и использовать действия других разработчиков. Поэтому часто использование GitHub Actions сводится к выбору и комбинированию действий из marketplace. Конечно, у этого подхода есть свои преимущества и недостатки, что мы рассмотрим далее.
Чтобы использовать 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` будет автоматически запускать действие, что обеспечивает непрерывную интеграцию и сборку.
## Второй раздел: сборка 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` для чтения данных внутри действия;

- После настройки среды выполняются команды `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 )