From cc8a2be6f5d1d5c528bd577f27f0f47958ba16e5 Mon Sep 17 00:00:00 2001 From: Roy Ivy III Date: Thu, 28 May 2020 16:01:24 -0500 Subject: [PATCH] maint/CICD ~ add support for DPKG generation and extra ARM-CPU build targets --- .github/workflows/CICD.yml | 87 ++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 18 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 0261dbe44..b7a46702e 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -4,9 +4,8 @@ name: CICD # spell-checker:ignore (env/flags) Ccodegen Coverflow RUSTFLAGS # spell-checker:ignore (jargon) SHAs deps softprops toolchain # spell-checker:ignore (names) CodeCOV MacOS MinGW Peltoche rivy -# spell-checker:ignore (shell/tools) choco clippy dmake esac fakeroot gmake grcov halium lcov libssl mkdir popd printf pushd rustc rustfmt rustup shopt xargs -# spell-checker:ignore (misc) alnum coreutils gnueabihf issuecomment maint nullglob onexitbegin onexitend uutils - +# spell-checker:ignore (shell/tools) choco clippy dmake dpkg esac fakeroot gmake grcov halium lcov libssl mkdir popd printf pushd rustc rustfmt rustup shopt xargs +# spell-checker:ignore (misc) aarch alnum armhf coreutils gnueabihf issuecomment maint nullglob onexitbegin onexitend uutils env: PROJECT_NAME: coreutils @@ -130,7 +129,10 @@ jobs: job: # { os, target, cargo-options, features, use-cross, toolchain } - { os: ubuntu-latest , target: arm-unknown-linux-gnueabihf , features: feat_os_unix_gnueabihf , use-cross: use-cross } + - { os: ubuntu-latest , target: aarch64-unknown-linux-gnu , features: feat_os_unix_gnueabihf , use-cross: use-cross } - { os: ubuntu-16.04 , target: x86_64-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } + # - { os: ubuntu-18.04 , target: i586-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } + # - { os: ubuntu-18.04 , target: i586-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } - { os: ubuntu-18.04 , target: i686-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } - { os: ubuntu-18.04 , target: i686-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross } - { os: ubuntu-18.04 , target: x86_64-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } @@ -148,6 +150,7 @@ jobs: ## install/setup prerequisites case '${{ matrix.job.target }}' in arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; + aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; esac - name: Initialize workflow variables id: vars @@ -186,7 +189,14 @@ jobs: echo ::set-output name=REF_TAG::${REF_TAG} echo ::set-output name=REF_SHAS::${REF_SHAS} # parse target - unset TARGET_ARCH ; case '${{ matrix.job.target }}' in arm-unknown-linux-gnueabihf) TARGET_ARCH=arm ;; i686-*) TARGET_ARCH=i686 ;; x86_64-*) TARGET_ARCH=x86_64 ;; esac; + unset TARGET_ARCH + case '${{ matrix.job.target }}' in + aarch64-*) TARGET_ARCH=arm64 ;; + arm-*-*hf) TARGET_ARCH=armhf ;; + i586-*) TARGET_ARCH=i586 ;; + i686-*) TARGET_ARCH=i686 ;; + x86_64-*) TARGET_ARCH=x86_64 ;; + esac; echo set-output name=TARGET_ARCH::${TARGET_ARCH} echo ::set-output name=TARGET_ARCH::${TARGET_ARCH} unset TARGET_OS ; case '${{ matrix.job.target }}' in *-linux-*) TARGET_OS=linux ;; *-apple-*) TARGET_OS=macos ;; *-windows-*) TARGET_OS=windows ;; esac; @@ -203,9 +213,34 @@ jobs: echo ::set-output name=PKG_BASENAME::${PKG_BASENAME} echo ::set-output name=PKG_NAME::${PKG_NAME} # deployable tag? (ie, leading "vM" or "M"; M == version number) - unset DEPLOYABLE ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOYABLE='true' ; fi - echo set-output name=DEPLOYABLE::${DEPLOYABLE:-/false} - echo ::set-output name=DEPLOYABLE::${DEPLOYABLE} + unset DEPLOY ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOY='true' ; fi + echo set-output name=DEPLOY::${DEPLOY:-/false} + echo ::set-output name=DEPLOY::${DEPLOY} + # DPKG architecture? + unset DPKG_ARCH + case ${{ matrix.job.target }} in + x86_64-*-linux-*) DPKG_ARCH=amd64 ;; + *-linux-*) DPKG_ARCH=${TARGET_ARCH} ;; + esac + echo set-output name=DPKG_ARCH::${DPKG_ARCH} + echo ::set-output name=DPKG_ARCH::${DPKG_ARCH} + # DPKG version? + unset DPKG_VERSION ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DPKG_VERSION=${REF_TAG/#[vV]/} ; fi + echo set-output name=DPKG_VERSION::${DPKG_VERSION} + echo ::set-output name=DPKG_VERSION::${DPKG_VERSION} + # DPKG base name/conflicts? + DPKG_BASENAME=${PROJECT_NAME} + DPKG_CONFLICTS=${PROJECT_NAME}-musl + case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac; + echo set-output name=DPKG_BASENAME::${DPKG_BASENAME} + echo set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS} + echo ::set-output name=DPKG_BASENAME::${DPKG_BASENAME} + echo ::set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS} + # DPKG name + unset DPKG_NAME; + if [[ -n $DPKG_ARCH && -n $DPKG_VERSION ]]; then DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb" ; fi + echo set-output name=DPKG_NAME::${DPKG_NAME} + echo ::set-output name=DPKG_NAME::${DPKG_NAME} # target-specific options # * CARGO_FEATURES_OPTION CARGO_FEATURES_OPTION='' ; @@ -216,18 +251,17 @@ jobs: CARGO_USE_CROSS='true' ; case '${{ matrix.job.use-cross }}' in ''|0|f|false|n|no) unset CARGO_USE_CROSS ;; esac; echo set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS:-/false} echo ::set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS} - # # * `arm` cannot be tested on ubuntu-* hosts (b/c testing is currently primarily done via comparison of target outputs with built-in outputs and the `arm` target is not executable on the host) - JOB_DO_TESTING="true" - case '${{ matrix.job.target }}' in arm-*) unset JOB_DO_TESTING ;; esac; - echo set-output name=JOB_DO_TESTING::${JOB_DO_TESTING:-/false} - echo ::set-output name=JOB_DO_TESTING::${JOB_DO_TESTING} - # # * test only binary for arm-type targets - unset CARGO_TEST_OPTIONS - unset CARGO_TEST_OPTIONS ; case '${{ matrix.job.target }}' in arm-*) CARGO_TEST_OPTIONS="--bin ${PROJECT_NAME}" ;; esac; + # * test only library and/or binaries for arm-type targets + unset CARGO_TEST_OPTIONS ; case '${{ matrix.job.target }}' in aarch64-* | arm-*) CARGO_TEST_OPTIONS="--bins" ;; esac; echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} - # * strip executable? - STRIP="strip" ; case '${{ matrix.job.target }}' in arm-unknown-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; *-pc-windows-msvc) STRIP="" ;; esac; + # * executable for `strip`? + STRIP="strip" + case ${{ matrix.job.target }} in + aarch64-*-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;; + arm-*-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; + *-pc-windows-msvc) STRIP="" ;; + esac; echo set-output name=STRIP::${STRIP:-/false} echo ::set-output name=STRIP::${STRIP} - name: Create all needed build/work directories @@ -236,6 +270,7 @@ jobs: ## create build/work space mkdir -p '${{ steps.vars.outputs.STAGING }}' mkdir -p '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}' + mkdir -p '${{ steps.vars.outputs.STAGING }}/dpkg' - name: rust toolchain ~ install uses: actions-rs/toolchain@v1 with: @@ -307,12 +342,28 @@ jobs: *) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;; esac popd >/dev/null + # dpkg + if [ -n "${{ steps.vars.outputs.DPKG_NAME }}" ]; then + DPKG_DIR="${{ steps.vars.outputs.STAGING }}/dpkg" + # binary + install -Dm755 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" + if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" ; fi + # README and LICENSE + (shopt -s nullglob; for f in [R]"EADME"{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done) + (shopt -s nullglob; for f in [L]"ICENSE"{-*,}{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done) + # control file + mkdir -p "${DPKG_DIR}/DEBIAN" + printf "Package: ${{ steps.vars.outputs.DPKG_BASENAME }}\nVersion: ${{ steps.vars.outputs.DPKG_VERSION }}\nSection: utils\nPriority: optional\nMaintainer: ${{ env.PROJECT_AUTH }}\nArchitecture: ${{ steps.vars.outputs.DPKG_ARCH }}\nProvides: ${{ env.PROJECT_NAME }}\nConflicts: ${{ steps.vars.outputs.DPKG_CONFLICTS }}\nDescription: ${{ env.PROJECT_DESC }}\n" > "${DPKG_DIR}/DEBIAN/control" + # build dpkg + fakeroot dpkg-deb --build "${DPKG_DIR}" "${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}" + fi - name: Publish uses: softprops/action-gh-release@v1 - if: steps.vars.outputs.DEPLOYABLE + if: steps.vars.outputs.DEPLOY with: files: | ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }} + ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}