mirror of
https://github.com/armbian/scripts.git
synced 2026-01-06 10:32:48 -08:00
402 lines
15 KiB
YAML
402 lines
15 KiB
YAML
name: Build with Docker
|
|
on:
|
|
workflow_dispatch:
|
|
workflow_call:
|
|
inputs:
|
|
parallel:
|
|
required: false
|
|
type: number
|
|
description: How many runners for matrix
|
|
boardtype:
|
|
required: false
|
|
type: string
|
|
sourcerepo:
|
|
required: true
|
|
type: string
|
|
packagesrepo:
|
|
required: false
|
|
type: string
|
|
variant:
|
|
required: true
|
|
type: string
|
|
runner:
|
|
required: true
|
|
type: string
|
|
part:
|
|
required: true
|
|
type: number
|
|
of:
|
|
required: true
|
|
type: number
|
|
include:
|
|
required: false
|
|
type: string
|
|
exclude:
|
|
required: false
|
|
type: string
|
|
uploading:
|
|
type: string
|
|
fromsources:
|
|
required: false
|
|
type: string
|
|
secrets:
|
|
CR_PAT:
|
|
required: false
|
|
GPG_KEY1:
|
|
required: true
|
|
GPG_PASSPHRASE1:
|
|
required: true
|
|
GPG_KEY2:
|
|
required: true
|
|
GPG_PASSPHRASE2:
|
|
required: true
|
|
SCRIPTS_ACCESS_TOKEN:
|
|
required: true
|
|
SSH_KEY_TORRENTS:
|
|
required: true
|
|
KNOWN_HOSTS_UPLOAD:
|
|
required: true
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
jobs:
|
|
|
|
Prepare:
|
|
|
|
if: ${{ github.repository_owner == 'Armbian' }}
|
|
name: targets
|
|
runs-on: small
|
|
outputs:
|
|
matrix: ${{steps.list_dirs.outputs.matrix}}
|
|
runner: ${{steps.list_dirs.outputs.runner}}
|
|
parallel: ${{steps.list_dirs.outputs.parallel}}
|
|
steps:
|
|
|
|
- name: Runner prepare
|
|
uses: armbian/actions/runner-prepare@main
|
|
|
|
- name: Set ENV vars
|
|
run: |
|
|
SOURCEREPO=${{ inputs.sourcerepo }}
|
|
echo "REPO=${SOURCEREPO:-nightly}" >> $GITHUB_ENV
|
|
PACKAGESREPO=${{ inputs.packagesrepo }}
|
|
echo "BETA=${PACKAGESREPO:-yes}" >> $GITHUB_ENV
|
|
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v3.1.0
|
|
with:
|
|
fetch-depth: 1
|
|
repository: armbian/build
|
|
path: build
|
|
ref: ${{ env.REPO }}
|
|
clean: false
|
|
|
|
- name: Make build list
|
|
if: ${{ inputs.boardtype != '' }}
|
|
id: make-list
|
|
uses: armbian/actions/make-list@main
|
|
with:
|
|
type: ${{ inputs.boardtype }}
|
|
|
|
- name: Upload build list
|
|
if: ${{ inputs.boardtype != '' }}
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
path: targets.txt
|
|
name: targets
|
|
if-no-files-found: ignore
|
|
|
|
- name: Remove previous artefacts if any
|
|
run: |
|
|
|
|
sudo rm -rf changes 2>/dev/null || true
|
|
|
|
- name: Download changes
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: changes
|
|
|
|
- name: Prepare matrix
|
|
id: list_dirs
|
|
run: |
|
|
|
|
var="${{ inputs.variant }}"
|
|
if [[ "$var" == *stable || "$var" == *rc ]]; then
|
|
FILENAME="build/config/targets.conf | grep ${var%:*} | grep \"yes\|adv\""
|
|
else
|
|
FILENAME="build/config/targets-${var%:*}-beta.conf"
|
|
fi
|
|
[[ -n "${{ inputs.boardtype }}" ]] && FILENAME="targets.txt | grep ${var%:*}"
|
|
# if we want to split more
|
|
TEMP=$(mktemp -d || exit 1)
|
|
|
|
LIST="cat "${FILENAME}" | grep -v \"^$\" | grep -v \"^#\" | awk '{if (\$6 == \"yes\" || \$6 == \"adv\") print \$0;}' | ${{ inputs.include }} ${{ inputs.exclude }} cut -f1 -d ' ' | pr -t -n4 | tr -s '[:blank:]' ':' | cut -d\":\" -f2,3"
|
|
|
|
eval $LIST > $TEMP/data.txt
|
|
MATRIX="split --number=l/${{ inputs.part }}/${{ inputs.of }} <<< cat $TEMP/data.txt"
|
|
[ -s changes ] || unset MATRIX
|
|
|
|
#echo ::set-output name=matrix::$(for x in $(eval $MATRIX); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq)
|
|
#value=$(for x in $(eval $MATRIX); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq -c)
|
|
echo "matrix=$(for x in $(eval $MATRIX); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq -c)" >> $GITHUB_OUTPUT
|
|
|
|
if [[ -z "${{ inputs.runner }}" ]]; then
|
|
#echo ::set-output name=runner::$(echo '["ubuntu-latest"]' | jq) || true
|
|
echo "runner=ubuntu-latest" >> $GITHUB_OUTPUT
|
|
else
|
|
#echo ::set-output name=runner::$(echo '["${{ inputs.runner }}"]' | jq) || true
|
|
echo "runner=${{ inputs.runner }}" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
if [[ -z "${{ inputs.parallel }}" ]]; then
|
|
#echo ::set-output name=parallel::128 || true
|
|
echo "parallel=128" >> $GITHUB_OUTPUT
|
|
else
|
|
#echo ::set-output name=parallel::${{ inputs.parallel }} || true
|
|
echo "parallel=${{ inputs.parallel }}" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
image:
|
|
|
|
needs: Prepare
|
|
if: ${{ needs.Prepare.outputs.matrix != '[]' && needs.Prepare.outputs.matrix != '' }}
|
|
strategy:
|
|
fail-fast: false
|
|
max-parallel: ${{fromJson(needs.Prepare.outputs.parallel)}}
|
|
matrix:
|
|
node: ${{fromJson(needs.Prepare.outputs.matrix)}}
|
|
|
|
runs-on: ${{needs.Prepare.outputs.runner}}
|
|
steps:
|
|
|
|
- name: Runner prepare
|
|
uses: armbian/actions/runner-prepare@main
|
|
|
|
- name: Set environment variables
|
|
run: |
|
|
|
|
SOURCEREPO=${{ inputs.sourcerepo }}
|
|
echo "REPO=${SOURCEREPO:-nightly}" >> $GITHUB_ENV
|
|
PACKAGESREPO=${{ inputs.packagesrepo }}
|
|
echo "BETA=${PACKAGESREPO:-yes}" >> $GITHUB_ENV
|
|
echo ${{needs.Prepare.outputs.runner}}
|
|
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v3.1.0
|
|
with:
|
|
fetch-depth: 1
|
|
repository: armbian/build
|
|
path: build
|
|
ref: ${{ env.REPO }}
|
|
clean: false
|
|
|
|
- name: Checkout support scripts
|
|
uses: actions/checkout@v3.1.0
|
|
with:
|
|
fetch-depth: 1
|
|
repository: armbian/scripts
|
|
path: scripts
|
|
clean: false
|
|
|
|
# - name: Make build list
|
|
# if: ${{ inputs.boardtype != '' }}
|
|
# id: make-list
|
|
# uses: armbian/actions/make-list@main
|
|
# with:
|
|
# type: ${{ inputs.boardtype }}
|
|
|
|
- name: Download build list
|
|
if: ${{ inputs.boardtype != '' }}
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: targets
|
|
|
|
- name: Copy templates
|
|
run: |
|
|
|
|
mkdir -p build/userpatches
|
|
sudo cp scripts/configs/* build/userpatches/
|
|
|
|
- name: Pull Docker image
|
|
run: |
|
|
|
|
[[ -z $(command -v docker) ]] && sudo apt-get -yy install docker containerd docker.io
|
|
sudo docker kill $(sudo docker ps -q) 2>/dev/null || true
|
|
sudo docker image rm $(sudo docker images | grep -v latest | grep armbian | awk 'NR>1 {print $3}') 2> /dev/null || true
|
|
sudo docker pull ghcr.io/armbian/build:latest"-$(dpkg --print-architecture)"
|
|
|
|
- name: Import GPG key
|
|
|
|
uses: crazy-max/ghaction-import-gpg@v5
|
|
with:
|
|
gpg_private_key: ${{ secrets.GPG_KEY1 }}
|
|
passphrase: ${{ secrets.GPG_PASSPHRASE1 }}
|
|
workdir: scripts
|
|
git_user_signingkey: true
|
|
git_commit_gpgsign: true
|
|
|
|
- name: Assemble
|
|
run: |
|
|
|
|
# use local resources if possible
|
|
if [[ $(curl -s http://ifconfig.me) == "93.103.15.56" ]]; then
|
|
sudo rm -rf build/cache/toolchain/*
|
|
sudo mkdir -p build/cache/toolchain build/cache/rootfs || true
|
|
! sudo mountpoint -q cache/toolchain && sudo mount nas:/tank/armbian/toolchain.armbian.com build/cache/toolchain -o rsize=32768,wsize=32768,timeo=5,retrans=2,actimeo=60,retry=3 || true
|
|
#! sudo mountpoint -q cache/rootfs && sudo mount nas:/tank/armbian/cache.armbian.com/rootfs build/cache/rootfs -o rsize=32768,wsize=32768,timeo=5,retrans=2,actimeo=60,retry=3 || true
|
|
fi
|
|
|
|
#if [[ $(curl -s http://ifconfig.me) == "188.227.12.36" || $(curl -s http://ifconfig.me) == "206.82.251.151" ]]; then
|
|
# sudo rm -rf build/cache/sources
|
|
# sudo mkdir -p build/cache/toolchain build/cache/rootfs || true
|
|
# # sudo mount -a
|
|
# ! sudo mountpoint -q build/cache/toolchain && sudo mount --bind /mnt/armbian/cache/toolchain/ build/cache/toolchain -o rsize=32768,wsize=32768,timeo=5,retrans=2,actimeo=60,retry=3 || true
|
|
# ! sudo mountpoint -q build/cache/rootfs && sudo mount --bind /mnt/armbian/cache/rootfs/ build/cache/rootfs/ -o rsize=32768,wsize=32768,timeo=5,retrans=2,actimeo=60,retry=3 || true
|
|
#fi
|
|
|
|
var="${{ inputs.variant }}"
|
|
RC="no"
|
|
if [[ "$var" == *stable || "$var" == *rc ]]; then
|
|
FILENAME="build/config/targets.conf | grep ${var%:*} | grep \"yes\|adv\""
|
|
MAKE_FOLDERS=archive
|
|
#OLD="ghcr.io/armbian/build:$(cat build/VERSION | cut -d"." -f1-2)"-$(dpkg --print-architecture)
|
|
#sudo docker tag $OLD ghcr.io/armbian/build:$(cat scripts/VERSION)-$(dpkg --print-architecture)
|
|
# we use nightly repository, but change back to stable right before closing image
|
|
echo "#!""/bin/bash" | sudo tee build/userpatches/customize-image.sh
|
|
echo "sed -i 's/beta/apt/' /etc/apt/sources.list.d/armbian.list" | sudo tee -a build/userpatches/customize-image.sh
|
|
echo "sed -i 's/https/http/' /etc/apt/sources.list.d/armbian.list" | sudo tee -a build/userpatches/customize-image.sh
|
|
echo "sed -i 's/IMAGE_TYPE=.*/IMAGE_TYPE=stable/' /etc/armbian-image-release" | sudo tee -a build/userpatches/customize-image.sh
|
|
echo "sed -i 's/IMAGE_TYPE=.*/IMAGE_TYPE=stable/' /etc/armbian-release" | sudo tee -a build/userpatches/customize-image.sh
|
|
if [[ "$var" == *rc ]]; then
|
|
MAKE_FOLDERS=rc
|
|
fi
|
|
else
|
|
FILENAME="build/config/targets-${var%:*}-beta.conf"
|
|
MAKE_FOLDERS=nightly
|
|
fi
|
|
|
|
# install headers on all images but minimal
|
|
[[ "${BUILD_MINIMAL}" != yes ]] && INSTALL_HEADERS="yes"
|
|
|
|
# when making all from the list
|
|
if [[ "${{ inputs.fromsources }}" == yes ]]; then
|
|
SKIP_EXTERNAL_TOOLCHAINS="no"
|
|
IGNORE_UPDATES="no"
|
|
UPLOAD_FOLDER="images/"
|
|
BSPFREEZE="yes"
|
|
# we are not building kernel
|
|
REPOSITORY_INSTALL="kernel"
|
|
elif [[ -n "${{ inputs.boardtype }}" ]]; then
|
|
FILENAME="targets.txt | grep ${var%:*}"
|
|
SKIP_EXTERNAL_TOOLCHAINS="no"
|
|
IGNORE_UPDATES="no"
|
|
REPOSITORY_INSTALL="kernel,armbian-config,armbian-firmware,armbian-zsh"
|
|
UPLOAD_FOLDER="images-csc/"
|
|
else
|
|
SKIP_EXTERNAL_TOOLCHAINS="yes"
|
|
IGNORE_UPDATES="yes"
|
|
BSPFREEZE="yes"
|
|
REPOSITORY_INSTALL="u-boot,kernel,armbian-bsp-cli,armbian-bsp-desktop,armbian-desktop,armbian-config,armbian-firmware,armbian-zsh"
|
|
UPLOAD_FOLDER="images/"
|
|
fi
|
|
#### we need to install all from repo since we don't drag compilers here
|
|
#### REPOSITORY_INSTALL="u-boot,kernel,armbian-config,armbian-firmware,armbian-zsh"
|
|
|
|
echo "DEPLOYFOLDER=$MAKE_FOLDERS" >> $GITHUB_ENV
|
|
var="${{ inputs.variant }}"
|
|
|
|
CHUNK="${{ matrix.node }}"
|
|
LINE=$(echo $CHUNK | cut -d":" -f1)
|
|
BOARD=$(echo $CHUNK | cut -d":" -f2)
|
|
echo "BOARD=$BOARD" >> $GITHUB_ENV
|
|
echo "VERSION=$(cat build/VERSION)" >> $GITHUB_ENV
|
|
|
|
# community builds are weekly
|
|
if [[ -n "${{ inputs.boardtype }}" ]]; then
|
|
echo "VERSION=$(date +%Y%U)" >> $GITHUB_ENV
|
|
fi
|
|
|
|
LINIJA="cat ${FILENAME} | grep -v \"^$\" | grep -v \"^#\" | ${{ inputs.include }} ${{ inputs.exclude }} sed -n ''$LINE'p'"
|
|
read -r BOARD BRANCH RELEASE BUILD_TARGET BUILD_STABILITY BUILD_IMAGE DESKTOP_ENVIRONMENT DESKTOP_ENVIRONMENT_CONFIG_NAME DESKTOP_APPGROUPS_SELECTED \
|
|
<<< $(eval $LINIJA)
|
|
DESKTOP_APPGROUPS_SELECTED="${DESKTOP_APPGROUPS_SELECTED//,/ }"
|
|
BUILD_DESKTOP="no"
|
|
BUILD_MINIMAL="no"
|
|
[[ ${BUILD_TARGET} == "desktop" ]] && BUILD_DESKTOP="yes"
|
|
[[ ${BUILD_TARGET} == "minimal" ]] && BUILD_MINIMAL="yes"
|
|
|
|
cd build
|
|
[[ ! -f .ignore_changes ]] && sudo touch .ignore_changes
|
|
|
|
sudo sed -i "s/-it --rm/-i --rm/" userpatches/config-docker.conf
|
|
./compile.sh docker \
|
|
BETA="${{ env.BETA }}" \
|
|
RELEASE="${RELEASE}" \
|
|
KERNEL_ONLY="no" \
|
|
BSPFREEZE="${BSPFREEZE}" \
|
|
INSTALL_HEADERS="${INSTALL_HEADERS}" \
|
|
SKIP_EXTERNAL_TOOLCHAINS="$SKIP_EXTERNAL_TOOLCHAINS" \
|
|
IGNORE_UPDATES="${IGNORE_UPDATES}" \
|
|
SYNC_CLOCK="no" \
|
|
DESKTOP_ENVIRONMENT_CONFIG_NAME="$DESKTOP_ENVIRONMENT_CONFIG_NAME" \
|
|
BUILD_DESKTOP="$BUILD_DESKTOP" \
|
|
BUILD_MINIMAL="$BUILD_MINIMAL" \
|
|
DESKTOP_ENVIRONMENT="${DESKTOP_ENVIRONMENT}" \
|
|
KERNEL_CONFIGURE="no" \
|
|
BOARD="$BOARD" \
|
|
LOG_SUBPATH="debug/$BOARD" \
|
|
BRANCH="$BRANCH" \
|
|
MAKE_FOLDERS="$MAKE_FOLDERS" \
|
|
IMAGE_PRESENT="no" \
|
|
BUILD_ALL="no" \
|
|
USE_TORRENT="yes" \
|
|
USE_MAINLINE_GOOGLE_MIRROR="yes" \
|
|
ARMBIAN_CACHE_TOOLCHAIN_PATH="${ARMBIAN_CACHE_TOOLCHAIN_PATH}" \
|
|
ARMBIAN_CACHE_ROOTFS_PATH="${ARMBIAN_CACHE_ROOTFS_PATH}" \
|
|
REPOSITORY_INSTALL="$REPOSITORY_INSTALL" \
|
|
DESKTOP_APPGROUPS_SELECTED="$DESKTOP_APPGROUPS_SELECTED" \
|
|
EXPERT="yes"
|
|
|
|
sudo chown -R $USER.$USER output/images/$BOARD 2> /dev/null || true
|
|
sudo chmod 644 output/images/$BOARD/*/*.xz 2> /dev/null || true
|
|
echo ${{ secrets.GPG_PASSPHRASE1 }} | gpg --passphrase-fd 0 --armor --detach-sign --pinentry-mode loopback --batch --yes output/images/$BOARD/$MAKE_FOLDERS/*.img.xz
|
|
|
|
- name: Install SSH key for storage
|
|
uses: shimataro/ssh-key-action@v2
|
|
with:
|
|
key: ${{ secrets.SSH_KEY_TORRENTS }}
|
|
known_hosts: ${{ secrets.KNOWN_HOSTS_UPLOAD }}
|
|
if_key_exists: replace
|
|
|
|
- name: "Upload artefacts 1"
|
|
uses: ncipollo/release-action@v1
|
|
if: ${{ github.repository_owner == 'Armbian' && inputs.uploading != 'true' && github.event.inputs.choice != 'stable' && github.event.inputs.choice != 'rc' }}
|
|
with:
|
|
artifacts: "build/output/images/${{ env.BOARD }}/${{ env.DEPLOYFOLDER }}/*"
|
|
#tag: "latest"
|
|
tag: "${{ env.VERSION }}"
|
|
omitBody: true
|
|
omitName: true
|
|
allowUpdates: true
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: "Upload artefacts 2"
|
|
if: inputs.uploading == 'true'
|
|
uses: ncipollo/release-action@v1
|
|
with:
|
|
artifacts: "build/output/images/${{ env.BOARD }}/${{ env.DEPLOYFOLDER }}/*"
|
|
tag: "${{ env.VERSION }}"
|
|
omitBody: true
|
|
replacesArtifacts: true
|
|
omitName: true
|
|
allowUpdates: true
|
|
token: ${{ secrets.CR_PAT }}
|
|
|
|
- name: Deploy to server
|
|
if: ${{ github.repository_owner == 'Armbian' && (github.event.inputs.choice == 'stable' || github.event.inputs.choice == 'rc') }}
|
|
run: |
|
|
ls -l build/output/images/*/*/
|
|
sudo apt-get -y -qq install lftp
|
|
lftp -u upload, -e "set net:timeout 4;set net:max-retries 6;mirror --Remove-source-files -R --no-empty-dirs --parallel=8 --no-perms $(pwd)/build/output/images/ ${UPLOAD_FOLDER} ;bye" sftp://users.armbian.com
|
|
|