mirror of
https://github.com/home-assistant/operating-system.git
synced 2026-08-05 13:03:40 +01:00
41c3b6565d
Use more specific keys for GitHub Action caches to make sure we update caches regularly. Also add board id to the downloads cache to get a more specific cache file. This avoid redownloading large dependencies of some boards.
180 lines
6.5 KiB
YAML
180 lines
6.5 KiB
YAML
# Home Assistant Operating System build workflow
|
|
|
|
name: Development build
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
boards:
|
|
description: 'List of boards to build (comma separated identifiers)'
|
|
required: false
|
|
type: string
|
|
|
|
jobs:
|
|
prepare:
|
|
name: Prepare build
|
|
runs-on: ubuntu-22.04
|
|
permissions:
|
|
contents: read
|
|
pull-requests: read
|
|
packages: write
|
|
outputs:
|
|
version_main: ${{ steps.version_main.outputs.version_main }}
|
|
version_dev: ${{ steps.version_dev.outputs.version_dev }}
|
|
matrix: ${{ steps.generate_matrix.outputs.result }}
|
|
build_container_image: ghcr.io/${{ github.repository_owner }}/haos-builder@${{ steps.build_haos_builder.outputs.digest }}
|
|
steps:
|
|
- name: Checkout source
|
|
uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Get Major/Minor version
|
|
id: version_main
|
|
run: |
|
|
major=$(cat ${GITHUB_WORKSPACE}/buildroot-external/meta | grep VERSION_MAJOR | cut -d'=' -f2)
|
|
build=$(cat ${GITHUB_WORKSPACE}/buildroot-external/meta | grep VERSION_BUILD | cut -d'=' -f2)
|
|
echo "version_main=${major}.${build}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Generate Development build version
|
|
shell: bash
|
|
id: version_dev
|
|
run: |
|
|
version_dev="dev$(date --utc +'%Y%m%d')"
|
|
echo "Development version \"${version_dev}\""
|
|
echo "version_dev=${version_dev}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Create build matrix
|
|
uses: actions/github-script@v6
|
|
id: generate_matrix
|
|
with:
|
|
script: |
|
|
const boards = require('./.github/workflows/matrix.json')
|
|
const boardFilter = "${{ github.event.inputs.boards }}"
|
|
if (boardFilter == "") {
|
|
console.log("Run full build for all boards")
|
|
return { "board": boards }
|
|
} else {
|
|
console.log("Run partial build")
|
|
const boardSet = new Set(boardFilter.split(","))
|
|
const buildBoards = boards.filter(b => boardSet.has(b.id))
|
|
return { "board": buildBoards }
|
|
}
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v2.10.0
|
|
- name: Log in to the GitHub container registry
|
|
uses: docker/login-action@v2.2.0
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.repository_owner }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
- name: Build and Push
|
|
uses: docker/build-push-action@v4.1.1
|
|
id: build_haos_builder
|
|
with:
|
|
context: .
|
|
file: Dockerfile
|
|
tags: ghcr.io/${{ github.repository_owner }}/haos-builder
|
|
cache-from: ghcr.io/${{ github.repository_owner }}/haos-builder:cache-${{ steps.version_main.outputs.version_main }}
|
|
cache-to: ghcr.io/${{ github.repository_owner }}/haos-builder:cache-${{ steps.version_main.outputs.version_main }}
|
|
push: true
|
|
|
|
build:
|
|
name: Development build for ${{ matrix.board.id }}
|
|
needs: prepare
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
|
|
runs-on: ubuntu-22.04
|
|
|
|
steps:
|
|
- name: Checkout source
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: true
|
|
persist-credentials: false
|
|
|
|
- name: 'Add release PKI certs'
|
|
env:
|
|
RAUC_CERTIFICATE: ${{ secrets.RAUC_CERTIFICATE }}
|
|
RAUC_PRIVATE_KEY: ${{ secrets.RAUC_PRIVATE_KEY }}
|
|
run: |
|
|
echo -e "-----BEGIN CERTIFICATE-----\n${RAUC_CERTIFICATE}\n-----END CERTIFICATE-----" > cert.pem
|
|
echo -e "-----BEGIN PRIVATE KEY-----\n${RAUC_PRIVATE_KEY}\n-----END PRIVATE KEY-----" > key.pem
|
|
|
|
- name: Free space on build drive
|
|
run: |
|
|
# Inspired by https://github.com/easimon/maximize-build-space/blob/v7/action.yml
|
|
sudo rm -rf /usr/local/lib/android/sdk/ndk
|
|
sudo rm -rf /opt/hostedtoolcache/CodeQL
|
|
# Make sure cache action can restore this lcoation
|
|
sudo mkdir /mnt/cache
|
|
sudo chown -R runner:runner /mnt/cache
|
|
|
|
- name: Cache downloads
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: /mnt/cache/dl
|
|
key: haos-dl-${{ matrix.board.id }}-${{ hashFiles('/mnt/cache/dl/download-files.txt') }}
|
|
restore-keys: |
|
|
haos-dl-${{ matrix.board.id }}
|
|
haos-dl
|
|
|
|
- name: Cache object files
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: /mnt/cache/cc
|
|
key: haos-cc-${{ matrix.board.architecture }}-${{ github.run_id }}
|
|
restore-keys: |
|
|
haos-cc-${{ matrix.board.architecture }}
|
|
|
|
- name: Build
|
|
run: |
|
|
BUILDER_UID="$(id -u)"
|
|
BUILDER_GID="$(id -g)"
|
|
docker run --rm --privileged -v "${GITHUB_WORKSPACE}:/build" \
|
|
-e BUILDER_UID="${BUILDER_UID}" -e BUILDER_GID="${BUILDER_GID}" \
|
|
-v "/mnt/cache:/cache" \
|
|
${{ needs.prepare.outputs.build_container_image }} \
|
|
make BUILDDIR=/build VERSION_DEV=${{ needs.prepare.outputs.version_dev }} ${{ matrix.board.defconfig }}
|
|
|
|
- name: List downloads
|
|
run: |
|
|
find /mnt/cache/dl > /mnt/cache/dl/download-files.txt
|
|
|
|
- name: Upload images
|
|
uses: burnett01/rsync-deployments@5.2
|
|
with:
|
|
rsh: -q
|
|
switches: -aW
|
|
path: output/images/haos_*
|
|
remote_path: ${{ secrets.DEV_TARGET_PATH }}/${{ needs.prepare.outputs.version_main }}.${{ needs.prepare.outputs.version_dev }}/
|
|
remote_host: ${{ secrets.DEV_HOST }}
|
|
remote_port: ${{ secrets.DEV_PORT }}
|
|
remote_user: ${{ secrets.DEV_USERNAME }}
|
|
remote_key: ${{ secrets.DEV_SSH_KEY }}
|
|
|
|
|
|
bump_version:
|
|
name: Bump dev channel version
|
|
if: ${{ github.repository == 'home-assistant/operating-system' }}
|
|
needs: [ build, prepare ]
|
|
runs-on: ubuntu-22.04
|
|
|
|
steps:
|
|
- name: Initialize git
|
|
uses: home-assistant/actions/helpers/git-init@master
|
|
with:
|
|
name: ${{ secrets.GIT_NAME }}
|
|
email: ${{ secrets.GIT_EMAIL }}
|
|
token: ${{ secrets.GIT_TOKEN }}
|
|
|
|
- name: Bump Home Assistant OS dev channel version to ${{ needs.prepare.outputs.version_main }}.${{ needs.prepare.outputs.version_dev }}
|
|
uses: home-assistant/actions/helpers/version-push@master
|
|
with:
|
|
key: "hassos[]"
|
|
key-description: "Home Assistant OS"
|
|
version: ${{ needs.prepare.outputs.version_main }}.${{ needs.prepare.outputs.version_dev }}
|
|
channel: "dev"
|