name: Build, release, upload to GH & server on: workflow_dispatch: workflow_call: inputs: matrix: required: true type: string maintainer: required: true type: string package: required: true type: string licence: required: false type: string homepage: required: false type: string depends: required: false type: string section: required: false type: string priority: required: false type: string description: required: false type: string secrets: GPG_PRIVATE_KEY: required: true PASSPHRASE: required: true SSH_KEY_TORRENTS: required: true KNOWN_HOSTS_UPLOAD: required: true jobs: prepare: runs-on: ubuntu-latest steps: - name: Prepare release ID id: prep run: | for x in $(echo ${{ inputs.matrix }}); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq echo ::set-output name=matrix::$(for x in $(echo ${{ inputs.matrix }}); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq) echo ::set-output name=created::$(date -u +'%Y%m%d-%H%M') outputs: created: ${{ steps.prep.outputs.created }} # refer to as ${{needs.prepare.outputs.created}} matrix: ${{steps.prep.outputs.matrix}} build: needs: [ prepare ] runs-on: ubuntu-latest strategy: fail-fast: false matrix: node: ${{fromJson(needs.prepare.outputs.matrix)}} steps: - name: Checkout uses: actions/checkout@v3.1.0 with: path: source - name: Build ${{ matrix.node }} run: | ARCH=$(echo ${{ matrix.node }} | cut -d":" -f1) PKG_NAME=${{ inputs.package }}_${{needs.prepare.outputs.created}}_${ARCH} mkdir -p output/${PKG_NAME}/DEBIAN cat <<-END > output/${PKG_NAME}/DEBIAN/control Package: ${{ inputs.package }} Version: ${{needs.prepare.outputs.created}} Architecture: ${ARCH} END if [[ -n "${{ inputs.maintainer }}" ]]; then echo "Maintainer: ${{ inputs.maintainer }}" >> output/${PKG_NAME}/DEBIAN/control fi if [[ -n "${{ inputs.depends }}" ]]; then echo "Depends: ${{ inputs.depends }}" >> output/${PKG_NAME}/DEBIAN/control fi if [[ -n "${{ inputs.section }}" ]]; then echo "Section: ${{ inputs.section }}" >> output/${PKG_NAME}/DEBIAN/control fi if [[ -n "${{ inputs.priority }}" ]]; then echo "Priority: ${{ inputs.priority }}" >> output/${PKG_NAME}/DEBIAN/control fi if [[ -n "${{ inputs.description }}" ]]; then echo "Description: ${{ inputs.description }}" >> output/${PKG_NAME}/DEBIAN/control fi if [[ -f source/debian.conf ]]; then while read p; do FILE=$(echo $p | cut -d":" -f1) LOCATION=$(echo $p | cut -d":" -f2 | cut -d"/" -f2-) if [[ -n $LOCATION && -n $FILE ]]; then mkdir -p "output/${PKG_NAME}/$LOCATION" cp -R source/$FILE "output/${PKG_NAME}/$LOCATION" fi done < source/debian.conf fi fakeroot dpkg-deb -b output/${PKG_NAME}/ cd output/${PKG_NAME}/ tar cvfz ../${PKG_NAME}.tar.gz . - name: Upload deb as artifact ${{ matrix.node }} uses: actions/upload-artifact@v3 with: name: deb path: output/*.deb - name: Upload tarball as artifact ${{ matrix.node }} uses: actions/upload-artifact@v3 with: name: tar path: output/*.tar.gz release: needs: [ prepare, build ] if: "${{ always() }}" runs-on: ubuntu-latest steps: - name: Install dependencies run: | echo 'man-db man-db/auto-update boolean false' | sudo debconf-set-selections sudo apt-get -q -y install reprepro - uses: actions/download-artifact@v3 name: Download deb artifacts with: name: deb path: output - uses: actions/download-artifact@v3 name: Download tarball artifacts with: name: tar path: output - name: Checkout uses: actions/checkout@v3.1.0 with: path: repository ref: repository - name: Import GPG key id: import_gpg uses: crazy-max/ghaction-import-gpg@v5 with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} passphrase: ${{ secrets.PASSPHRASE }} - name: Configure git identity working-directory: repository run: | echo "Testing signing" | gpg --sign --armor gpg -K echo "#" git config user.name github-actions git config user.email github-actions@github.com - name: Deploy packages run: | PACKAGES_DIR="$(pwd)"/output REPO_DIR="$(pwd)"/repository [[ ! -d "${PACKAGES_DIR}" ]] && echo "Packages dir ${PACKAGES_DIR} is not there." && exit 2 mkdir -p "${REPO_DIR}" "${REPO_DIR}"/pool # Configure reprepro mkdir -p ${REPO_DIR}/conf cat <${REPO_DIR}/conf/distributions Origin: armbian.github.io/configurator Label: armbian.github.io/configurator Codename: stable Architectures: amd64 arm64 armhf Components: main Description: Armbian development repo SignWith: DF00FAF1C577104B50BF1D0093D6889F9F0E78D5 EOD # Determine a list of binary debs to include in the repo # reprepro does not accept identical package(-names) with different contents (sha1) # our build does generate different contents (in different runs) and I'd like to keep old versions around LIST_DEBS_NEW="" for ONE_DEB in ${PACKAGES_DIR}/*.deb; do echo "Considering adding to repo: $ONE_DEB" BASE_ONE_DEB=$(basename ${ONE_DEB}) EXISTING_DEB_IN_REPO=$(find ${REPO_DIR}/pool -type f -name ${BASE_ONE_DEB}) if [[ "a${EXISTING_DEB_IN_REPO}" == "a" ]]; then echo "- New .deb to include in repo: ${BASE_ONE_DEB}" LIST_DEBS_NEW="${LIST_DEBS_NEW} ${ONE_DEB}" else echo "- Existing .deb: ${BASE_ONE_DEB}" fi done echo "** Final list of DEBs to include: ${LIST_DEBS_NEW}" if [[ "a${LIST_DEBS_NEW}a" == "aa" ]]; then echo "No new packages, nothing to do." else echo "New packages, running reprepro..." reprepro -b "${REPO_DIR}" includedeb stable ${LIST_DEBS_NEW} echo "Repository generated at ${REPO_DIR}/" fi cd ${REPO_DIR} git add . git commit -m "Updating repo" || true git push origin repository || true # - 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: Deploy to server # 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/ images/ ;bye" sftp://users.armbian.com - name: "GH specific release" uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" automatic_release_tag: "${{needs.prepare.outputs.created}}" prerelease: false title: "${{needs.prepare.outputs.created}}" files: | output/*.deb output/*.tar.gz