mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-10-30 22:54:07 +00:00 
			
		
		
		
	Maint/CI ~ add GitHub-Actions CI (aka GHA)
This commit is contained in:
		
							
								
								
									
										287
									
								
								.github/workflows/CICD.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								.github/workflows/CICD.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,287 @@ | ||||
| name: CICD | ||||
|  | ||||
| env: | ||||
|   PROJECT_NAME: bat | ||||
|   PROJECT_DESC: "A `cat` clone with wings" | ||||
|   PROJECT_AUTH: "sharkdp" | ||||
|   RUST_MIN_SRV: "1.40.0" | ||||
|  | ||||
| on: [push, pull_request] | ||||
|  | ||||
| jobs: | ||||
|   min_version: | ||||
|     name: MinSRV # Minimum supported rust version | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: Install `rust` toolchain (v${{ env.RUST_MIN_SRV }}) | ||||
|       uses: actions-rs/toolchain@v1 | ||||
|       with: | ||||
|         toolchain: ${{ env.RUST_MIN_SRV }} | ||||
|         default: true | ||||
|         profile: minimal # minimal component installation (ie, no documentation) | ||||
|     - name: Test | ||||
|       uses: actions-rs/cargo@v1 | ||||
|       with: | ||||
|         command: test | ||||
|  | ||||
|   build: | ||||
|     name: Build | ||||
|     runs-on: ${{ matrix.job.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         job: | ||||
|           # { os, target, cargo-options, features, use-cross, toolchain } | ||||
|           - { os: ubuntu-latest  , target: arm-unknown-linux-gnueabihf , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: aarch64-unknown-linux-gnu   , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: i586-unknown-linux-gnu      , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: i686-unknown-linux-gnu      , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: i686-unknown-linux-musl     , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: x86_64-unknown-linux-gnu    , use-cross: use-cross } | ||||
|           - { os: ubuntu-18.04   , target: x86_64-unknown-linux-musl   , use-cross: use-cross } | ||||
|           - { os: ubuntu-16.04   , target: x86_64-unknown-linux-gnu    , use-cross: use-cross } | ||||
|           - { os: macos-latest   , target: x86_64-apple-darwin         } | ||||
|           - { os: windows-latest , target: i686-pc-windows-gnu         } | ||||
|           - { os: windows-latest , target: i686-pc-windows-msvc        } | ||||
|           - { os: windows-latest , target: x86_64-pc-windows-gnu       }  ## note: requires rust >= 1.43.0 to link correctly | ||||
|           - { os: windows-latest , target: x86_64-pc-windows-msvc      } | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: Install any prerequisites | ||||
|       shell: bash | ||||
|       run: | | ||||
|         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 | ||||
|       shell: bash | ||||
|       run: | | ||||
|         # toolchain | ||||
|         TOOLCHAIN="stable" ## default to "stable" toolchain | ||||
|         # * specify alternate TOOLCHAIN for *-pc-windows-gnu targets; gnu targets on Windows are broken for the standard *-pc-windows-msvc toolchain (refs: <https://github.com/rust-lang/rust/issues/47048>, <https://github.com/rust-lang/rust/issues/53454>, <https://github.com/rust-lang/cargo/issues/6754>) | ||||
|         case ${{ matrix.job.target }} in *-pc-windows-gnu) TOOLCHAIN="stable-${{ matrix.job.target }}" ;; esac; | ||||
|         # * use requested TOOLCHAIN if specified | ||||
|         if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi | ||||
|         echo set-output name=TOOLCHAIN::${TOOLCHAIN} | ||||
|         echo ::set-output name=TOOLCHAIN::${TOOLCHAIN} | ||||
|         # staging directory | ||||
|         STAGING='_staging' | ||||
|         echo set-output name=STAGING::${STAGING} | ||||
|         echo ::set-output name=STAGING::${STAGING} | ||||
|         # determine EXE suffix | ||||
|         EXE_suffix="" ; case ${{ matrix.job.target }} in *-pc-windows-*) EXE_suffix=".exe" ;; esac; | ||||
|         echo set-output name=EXE_suffix::${EXE_suffix} | ||||
|         echo ::set-output name=EXE_suffix::${EXE_suffix} | ||||
|         # parse commit reference info | ||||
|         REF_NAME=${GITHUB_REF#refs/*/} | ||||
|         unset REF_BRANCH ; case ${GITHUB_REF} in refs/heads/*) REF_BRANCH=${GITHUB_REF#refs/heads/} ;; esac; | ||||
|         unset REF_TAG ; case ${GITHUB_REF} in refs/tags/*) REF_TAG=${GITHUB_REF#refs/tags/} ;; esac; | ||||
|         REF_SHAS=${GITHUB_SHA:0:8} | ||||
|         echo set-output name=REF_NAME::${REF_NAME} | ||||
|         echo set-output name=REF_BRANCH::${REF_BRANCH} | ||||
|         echo set-output name=REF_TAG::${REF_TAG} | ||||
|         echo set-output name=REF_SHAS::${REF_SHAS} | ||||
|         echo ::set-output name=REF_NAME::${REF_NAME} | ||||
|         echo ::set-output name=REF_BRANCH::${REF_BRANCH} | ||||
|         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; | ||||
|         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; | ||||
|         echo set-output name=TARGET_OS::${TARGET_OS} | ||||
|         echo ::set-output name=TARGET_OS::${TARGET_OS} | ||||
|         # package name | ||||
|         PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac; | ||||
|         PKG_BASENAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.job.target }} | ||||
|         PKG_NAME=${PKG_BASENAME}${PKG_suffix} | ||||
|         echo set-output name=PKG_suffix::${PKG_suffix} | ||||
|         echo set-output name=PKG_BASENAME::${PKG_BASENAME} | ||||
|         echo set-output name=PKG_NAME::${PKG_NAME} | ||||
|         echo ::set-output name=PKG_suffix::${PKG_suffix} | ||||
|         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 DEPLOY ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOY='true' ; fi | ||||
|         echo set-output name=DEPLOY::${DEPLOY:-<empty>/false} | ||||
|         echo ::set-output name=DEPLOY::${DEPLOY} | ||||
|         # DPKG architecture? | ||||
|         unset DPKG_ARCH ; case ${{ matrix.job.target }} in i686-*-linux-*) DPKG_ARCH=i686 ;; x86_64-*-linux-*) DPKG_ARCH=amd64 ;; 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_USE_CROSS (truthy) | ||||
|         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:-<empty>/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:-<empty>/false} | ||||
|         echo ::set-output name=JOB_DO_TESTING::${JOB_DO_TESTING} | ||||
|         # # * test only library units tests and binary for arm-type targets | ||||
|         unset CARGO_TEST_OPTIONS | ||||
|         unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac; | ||||
|         echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} | ||||
|         echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} | ||||
|         # * executable for `strip`? | ||||
|         STRIP="strip" ; case ${{ matrix.job.target }} in arm-unknown-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;; *-pc-windows-msvc) STRIP="" ;; esac; | ||||
|         echo set-output name=STRIP::${STRIP} | ||||
|         echo ::set-output name=STRIP::${STRIP} | ||||
|     - name: Create all needed build/work directories | ||||
|       shell: bash | ||||
|       run: | | ||||
|         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: | ||||
|         toolchain: ${{ steps.vars.outputs.TOOLCHAIN }} | ||||
|         target: ${{ matrix.job.target }} | ||||
|         override: true | ||||
|         profile: minimal # minimal component installation (ie, no documentation) | ||||
|     - name: Info | ||||
|       shell: bash | ||||
|       run: | | ||||
|         gcc --version || true | ||||
|         rustup -V | ||||
|         rustup toolchain list | ||||
|         rustup default | ||||
|         cargo -V | ||||
|         rustc -V | ||||
|     - name: Build | ||||
|       uses: actions-rs/cargo@v1 | ||||
|       with: | ||||
|         use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }} | ||||
|         command: build | ||||
|         args: --release --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }} | ||||
|     - name: Test | ||||
|       uses: actions-rs/cargo@v1 | ||||
|       with: | ||||
|         use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }} | ||||
|         command: test | ||||
|         args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }} | ||||
|     - name: Archive executable artifacts | ||||
|       uses: actions/upload-artifact@master | ||||
|       with: | ||||
|         name: ${{ env.PROJECT_NAME }}-${{ matrix.job.target }} | ||||
|         path: target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }} | ||||
|     - name: Package | ||||
|       shell: bash | ||||
|       run: | | ||||
|         # binary | ||||
|         cp 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/' | ||||
|         # `strip` binary (if needed) | ||||
|         if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' ; fi | ||||
|         # README and LICENSE | ||||
|         # * spell-checker:ignore EADME ICENSE | ||||
|         (shopt -s nullglob; for f in [R]"EADME"{,.*}; do cp $f '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/' ; done) | ||||
|         (shopt -s nullglob; for f in [L]"ICENSE"{-*,}{,.*}; do cp $f '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/' ; done) | ||||
|         # base compressed package | ||||
|         pushd '${{ steps.vars.outputs.STAGING }}/' >/dev/null | ||||
|         case ${{ matrix.job.target }} in | ||||
|           *-pc-windows-*) 7z -y a '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* | tail -2 ;; | ||||
|           *) 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.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 }} | ||||
|  | ||||
|   coverage: | ||||
|     name: Code Coverage | ||||
|     runs-on: ${{ matrix.job.os }} | ||||
|     strategy: | ||||
|       fail-fast: true | ||||
|       matrix: | ||||
|         # job: [ { os: ubuntu-latest }, { os: macos-latest }, { os: windows-latest } ] | ||||
|         job: | ||||
|           - { os: ubuntu-latest , toolchain: nightly-2020-04-29 } | ||||
|           - { os: macos-latest , toolchain: nightly-2020-04-29 } | ||||
|           - { os: windows-latest , toolchain: nightly-2020-04-29-x86_64-pc-windows-gnu } | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: Initialize workflow variables | ||||
|       id: vars | ||||
|       shell: bash | ||||
|       run: | | ||||
|         # toolchain | ||||
|         TOOLCHAIN="nightly" ## default to "nightly" toolchain | ||||
|         # * use requested TOOLCHAIN if specified | ||||
|         if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi | ||||
|         # * use requested TOOLCHAIN if specified | ||||
|         if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi | ||||
|         echo set-output name=TOOLCHAIN::${TOOLCHAIN} | ||||
|         echo ::set-output name=TOOLCHAIN::${TOOLCHAIN} | ||||
|         # target-specific options | ||||
|         # * CODECOV_FLAGS | ||||
|         CODECOV_FLAGS=$( echo "${{ matrix.job.os }}" | sed 's/[^[:alnum:]]/_/g' ) | ||||
|         echo set-output name=CODECOV_FLAGS::${CODECOV_FLAGS} | ||||
|         echo ::set-output name=CODECOV_FLAGS::${CODECOV_FLAGS} | ||||
|     - name: rust toolchain ~ install | ||||
|       uses: actions-rs/toolchain@v1 | ||||
|       with: | ||||
|         toolchain: ${{ steps.vars.outputs.TOOLCHAIN }} | ||||
|         override: true | ||||
|         profile: minimal # minimal component installation (ie, no documentation) | ||||
|     - name: Test | ||||
|       uses: actions-rs/cargo@v1 | ||||
|       with: | ||||
|         command: test | ||||
|         args: --no-fail-fast | ||||
|       env: | ||||
|         CARGO_INCREMENTAL: '0' | ||||
|         RUSTFLAGS: '-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads' | ||||
|     - name: Generate coverage data | ||||
|       id: coverage | ||||
|       uses: actions-rs/grcov@v0.1 | ||||
|     - name: Upload coverage results (to Codecov.io) | ||||
|       uses: codecov/codecov-action@v1 | ||||
|       with: | ||||
|         file: ${{ steps.coverage.outputs.report }} | ||||
|         flags: ${{ steps.vars.outputs.CODECOV_FLAGS }} | ||||
|         name: codecov-umbrella | ||||
|         fail_ci_if_error: false | ||||
		Reference in New Issue
	
	Block a user