Complete CI/CD for Flutter Apps
Tags: actionshackathon21, github, opensource, flutter
Published: 2021-11-24 19:10:45

---
title: Complete CI/CD for Flutter Apps
published: true
description: My submission to the GitHub Actions x DEV Hackathon 2021!
tags: actionshackathon21, github, opensource, flutter
---

### My Workflow
[Note]: # (Please make sure the project links to the appropriate GitHub Actions repository, and includes [an open source license](https://choosealicense.com/) and README.)
This GitHub Action workflow can be used to fully automate your build, test and deployment processes for Flutter.
**All** Flutter build targets are supported with this workflow: android, iOS and web.
When pushing without a tag this workflow will analyze and test your Flutter app.
When pushing with a tag (starting with 'v' in this case) this workflow additionally creates a release including all artifacts needed for deployment.
These artifacts can then be used to deploy your apps.
I have added the firebase hosting deploy as an example for web deployment. 

This can be further extended to deploy the iOS and Android app to a test platform like testflight or directly to the platform specific stores (don't forget to sign your apps 😄).

This workflow is a great starting point for any Flutter app and can be tweaked to your personal preference.

### Submission Category: 
DIY Deployments, Phone Friendly

### Yaml File or Link to Code

```yaml
name: Build Flutter apps

on:
  push:
    branches:
      - main
    tags:
      - v*


jobs:
  build:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v2
      - uses: subosito/flutter-action@v1.5.3
        with:
          channel: 'stable'

      - name: Install Dependencies
        run: flutter packages get

      - name: Analyze
        run: flutter analyze lib test

      - name: Run tests
        run: flutter test --no-pub --coverage --test-randomize-ordering-seed random packages test

      - name: Build Android App
        if: startsWith(github.ref, 'refs/tags/v')
        run: flutter build apk

      - name: Build iOS App
        if: startsWith(github.ref, 'refs/tags/v')
        run: |
            flutter build ios --no-codesign
            cd build/ios/iphoneos
            mkdir Payload
            cd Payload
            ln -s ../Runner.app
            cd ..
            zip -r app.ipa Payload

      - name: Build web
        if: startsWith(github.ref, 'refs/tags/v')
        run: |
          flutter build web
          cd build/web
          zip -r web-app.zip .

      - name: Archive Production Artifact
        if: startsWith(github.ref, 'refs/tags/v')
        uses: actions/upload-artifact@master
        with:
          name: web
          path: build/web

      - name: Release Apps
        if: startsWith(github.ref, 'refs/tags/v')
        uses: ncipollo/release-action@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          artifacts: 'build/app/outputs/**/*.apk,build/ios/iphoneos/app.ipa,build/web/web-app.zip'

  deploy:
    if: startsWith(github.ref, 'refs/tags/v')
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Download Artifact
        uses: actions/download-artifact@master
        with:
          name: web
          path: build/web

      - name: Deploy to Firebase hosting
        uses: w9jds/firebase-action@master
        with:
          args: deploy --message \"${{ github.event.head_commit.message }}\" --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}  
```

### Additional Resources / Info

We currently use this workflow for our own Flutter app that is not yet published and not yet open-source, but are planning on doing so in the near future!