diff --git a/.github/workflows/build-ci.yml b/.github/workflows/build-ci.yml new file mode 100644 index 00000000..ba502a74 --- /dev/null +++ b/.github/workflows/build-ci.yml @@ -0,0 +1,197 @@ +# Based heavily on the docker build action from immich (https://github.com/immich-app/immich/) + +name: Build CI and Release + +on: + workflow_dispatch: + push: + branches: [master] + pull_request: + branches: [master] + release: + types: [published] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-pio: + name: Build PlatformIO + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: | + ~/.cache/pip + ~/.platformio/.cache + key: ${{ runner.os }}-pio + # - uses: actions/setup-python@v5 + # with: + # python-version: '3.13' + - name: Install python + run: sudo apt-get install python3 python3-pip + - name: Install PlatformIO Core + run: pip install --upgrade platformio + + - name: Build PlatformIO Project + run: pio run --environment d1_mini + + - name: Move and rename firmware + run: mv .pio/build/d1_mini/firmware.bin ./firmware_os_esp8266.bin + + - name: Upload firmware + uses: actions/upload-artifact@v4 + with: + name: firmware + path: ./firmware_os_esp8266.bin + build-docker: + name: Build Docker + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - id: lower-repo + name: Repository to lowercase + run: | + REPO=${{ github.event.repository.name }} + echo "repository=${REPO@L}" >> $GITHUB_OUTPUT + + - id: lower-owner + name: Owner to lowercase + run: | + echo "owner=${GITHUB_REPOSITORY_OWNER@L}" >> $GITHUB_OUTPUT + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + # Skip when PR from a fork + if: ${{ !github.event.pull_request.head.repo.fork }} + with: + registry: ghcr.io + username: ${{ env.ACT && github.actor || steps.lower-owner.outputs.owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Determine build cache output + id: cache-target + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + # Essentially just ignore the cache output (PR can't write to registry cache) + echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT + else + echo "cache-to=type=registry,mode=max,ref=ghcr.io/${{ steps.lower-owner.outputs.owner }}/opensprinkler-build-cache:ospi" >> $GITHUB_OUTPUT + fi + + - name: Generate docker image tags + id: metadata + uses: docker/metadata-action@v5 + with: + flavor: | + latest=auto + images: | + name=ghcr.io/${{ steps.lower-owner.outputs.owner }}/${{ steps.lower-repo.outputs.repository }} + tags: | + # Tag with branch name + type=ref,event=branch + # Tag with pr-number + type=ref,event=pr + # Tag with git tag on release + type=ref,event=tag + type=raw,value=release,enable=${{ github.event_name == 'release' }} + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: false + outputs: type=oci,dest=./image.tar + cache-from: type=registry,ref=ghcr.io/${{ steps.lower-owner.outputs.owner }}/opensprinkler-build-cache:ospi + cache-to: ${{ steps.cache-target.outputs.cache-to }} + + - name: Upload image + uses: actions/upload-artifact@v4 + with: + name: docker-image + path: ./image.tar + release-pio: + name: Release PlatformIO + runs-on: ubuntu-latest + needs: [build-pio, build-docker] + if: ${{ github.event_name == 'release' }} + steps: + - name: Download firmware + uses: actions/download-artifact@v4 + with: + name: firmware + path: ./firmware + + - name: Add firmware to release + uses: softprops/action-gh-release@v2 + with: + files: firmware/* + + release-docker: + name: Release Docker + runs-on: ubuntu-latest + needs: [build-pio, build-docker] + if: ${{ !github.event.pull_request }} + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - id: lower-repo + name: Repository to lowercase + run: | + REPO=${{ github.event.repository.name }} + echo "repository=${REPO@L}" >> $GITHUB_OUTPUT + + - id: lower-owner + name: Owner to lowercase + run: | + echo "owner=${GITHUB_REPOSITORY_OWNER@L}" >> $GITHUB_OUTPUT + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ env.ACT && github.actor || steps.lower-owner.outputs.owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate docker image tags + id: metadata + uses: docker/metadata-action@v5 + with: + flavor: | + latest=auto + images: | + name=ghcr.io/${{ steps.lower-owner.outputs.owner }}/${{ steps.lower-repo.outputs.repository }} + tags: | + # Tag with branch name + type=ref,event=branch + # Tag with pr-number + type=ref,event=pr + # Tag with git tag on release + type=ref,event=tag + type=raw,value=release,enable=${{ github.event_name == 'release' }} + + - name: Push image + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64,linux/arm/v7,linux/arm64 + # Skip pushing when PR from a fork + push: true + cache-from: type=registry,ref=ghcr.io/${{ steps.lower-owner.outputs.owner }}/opensprinkler-build-cache:ospi + tags: ${{ steps.metadata.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml deleted file mode 100644 index c6d4e80a..00000000 --- a/.github/workflows/c-cpp.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: C/C++ CI - -on: - push: - branches: [ "*" ] - pull_request: - branches: [ "*" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: make - run: sudo apt install -y libmosquittopp-dev && make diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml deleted file mode 100644 index ea010d7d..00000000 --- a/.github/workflows/docker-image.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Docker Image CI - -on: - push: - branches: [ "*" ] - pull_request: - branches: [ "*" ] - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - build-and-push-image: - runs-on: ubuntu-latest - - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - - name: Build and push Docker image - uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 - with: - context: . - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }}