name: CICD # spell-checker:ignore CICD MSVC MacOS SHAs clippy esac gnueabihf mkdir musl rustfmt softprops toolchain env: PROJECT_NAME: lsd on: [push, pull_request] jobs: style: name: Style runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ ubuntu-latest, macos-latest, windows-latest ] steps: - uses: actions/checkout@v1 - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal # minimal component installation (ie, no documentation) components: rustfmt, clippy - name: "`fmt` testing" uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check - name: "`clippy` testing" uses: actions-rs/cargo@v1 with: command: clippy args: -- -D warnings build_linux: name: Build/linux runs-on: ubuntu-latest strategy: fail-fast: false matrix: target: - arm-unknown-linux-gnueabihf - i686-unknown-linux-gnu - i686-unknown-linux-musl - x86_64-unknown-linux-gnu - x86_64-unknown-linux-musl steps: - uses: actions/checkout@v1 - name: Initialize workflow variables id: vars shell: bash run: | # determine EXE suffix EXE_suffix=""; case ${{ matrix.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 branch/reference info # ref: 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} PKG_NAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.target }}${EXE_suffix} 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=PKG_NAME::${PKG_NAME} 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=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} echo ::set-output name=DEPLOY::${DEPLOY} # target-specific options # * test only binary for arm-type targets unset CARGO_TEST_OPTIONS; case ${{ matrix.target }} in arm-*) CARGO_TEST_OPTIONS="--bin ${PROJECT_NAME}";; esac; echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} # * strip final executable? STRIP="strip"; case ${{ matrix.target }} in arm-*) STRIP="";; *-pc-windows-*) 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 'package' - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable target: ${{ matrix.target }} override: true profile: minimal # minimal component installation (ie, no documentation) - name: Build uses: actions-rs/cargo@v1 with: use-cross: true command: build args: --release --target=${{ matrix.target }} - name: Test uses: actions-rs/cargo@v1 with: use-cross: true command: test args: --target=${{ matrix.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} - name: Archive executable artifacts uses: actions/upload-artifact@master with: name: ${{ env.PROJECT_NAME }}-${{ matrix.target }} path: target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }} - name: Package shell: bash run: | cp 'target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' 'package/${{ steps.vars.outputs.PKG_NAME }}' if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" 'package/${{ steps.vars.outputs.PKG_NAME }}'; fi - name: Publish uses: softprops/action-gh-release@v1 if: steps.vars.outputs.DEPLOY with: files: package/${{ steps.vars.outputs.PKG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build_mac: name: Build/mac runs-on: macos-latest strategy: fail-fast: false matrix: target: - i686-apple-darwin - x86_64-apple-darwin steps: - uses: actions/checkout@v1 - name: Initialize workflow variables id: vars shell: bash run: | # determine EXE suffix EXE_suffix=""; case ${{ matrix.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 branch/reference info # ref: 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} PKG_NAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.target }}${EXE_suffix} 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=PKG_NAME::${PKG_NAME} 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=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} echo ::set-output name=DEPLOY::${DEPLOY} # target-specific options # * test only binary for arm-type targets unset CARGO_TEST_OPTIONS; case ${{ matrix.target }} in arm-*) CARGO_TEST_OPTIONS="--bin ${PROJECT_NAME}";; esac; echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} # * strip final executable? STRIP="strip"; case ${{ matrix.target }} in arm-*) STRIP="";; *-pc-windows-*) 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 'package' - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable target: ${{ matrix.target }} override: true profile: minimal # minimal component installation (ie, no documentation) - name: Build uses: actions-rs/cargo@v1 with: use-cross: true command: build args: --release --target=${{ matrix.target }} - name: Test uses: actions-rs/cargo@v1 with: use-cross: true command: test args: --target=${{ matrix.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} - name: Archive executable artifacts uses: actions/upload-artifact@master with: name: ${{ env.PROJECT_NAME }}-${{ matrix.target }} path: target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }} - name: Package shell: bash run: | cp 'target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' 'package/${{ steps.vars.outputs.PKG_NAME }}' if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" 'package/${{ steps.vars.outputs.PKG_NAME }}'; fi - name: Publish uses: softprops/action-gh-release@v1 if: steps.vars.outputs.DEPLOY with: files: package/${{ steps.vars.outputs.PKG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build_windows: name: Build/windows runs-on: windows-latest strategy: fail-fast: false matrix: target: # - i686-pc-windows-gnu - i686-pc-windows-msvc # - x86_64-pc-windows-gnu - x86_64-pc-windows-msvc steps: - uses: actions/checkout@v1 - name: Initialize workflow variables id: vars shell: bash run: | # determine EXE suffix EXE_suffix=""; case ${{ matrix.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 branch/reference info # ref: 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} PKG_NAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.target }}${EXE_suffix} 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=PKG_NAME::${PKG_NAME} 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=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} echo ::set-output name=DEPLOY::${DEPLOY} # target-specific options # * test only binary for arm-type targets unset CARGO_TEST_OPTIONS; case ${{ matrix.target }} in arm-*) CARGO_TEST_OPTIONS="--bin ${PROJECT_NAME}";; esac; echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} # * strip final executable? STRIP="strip"; case ${{ matrix.target }} in arm-*) STRIP="";; *-pc-windows-*) 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 'package' - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable target: ${{ matrix.target }} override: true profile: minimal # minimal component installation (ie, no documentation) - name: Build uses: actions-rs/cargo@v1 with: use-cross: true command: build args: --release --target=${{ matrix.target }} - name: Test uses: actions-rs/cargo@v1 with: use-cross: true command: test args: --target=${{ matrix.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} - name: Archive executable artifacts uses: actions/upload-artifact@master with: name: ${{ env.PROJECT_NAME }}-${{ matrix.target }} path: target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }} - name: Package shell: bash run: | cp 'target/${{ matrix.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' 'package/${{ steps.vars.outputs.PKG_NAME }}' if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" 'package/${{ steps.vars.outputs.PKG_NAME }}'; fi - name: Publish uses: softprops/action-gh-release@v1 if: steps.vars.outputs.DEPLOY with: files: package/${{ steps.vars.outputs.PKG_NAME }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}