name: Automated build env: CI_INTERMEDIATES_DIR: "_ci-intermediates" on: release: types: [created] push: tags: - 'v*' jobs: build: name: ${{ matrix.job.os }} (${{ matrix.job.target }}) runs-on: ${{ matrix.job.os }} strategy: fail-fast: false matrix: job: - {os: ubuntu-20.04, target: arm-unknown-linux-gnueabihf, use-cross: true} - {os: ubuntu-20.04, target: arm-unknown-linux-musleabihf, use-cross: true} - {os: ubuntu-20.04, target: aarch64-unknown-linux-musl, use-cross: true} - {os: ubuntu-20.04, target: aarch64-unknown-linux-gnu, use-cross: true} - {os: ubuntu-20.04, target: x86_64-unknown-linux-musl, use-cross: true} - {os: ubuntu-20.04, target: x86_64-unknown-linux-gnu} - {os: macos-latest, target: aarch64-apple-darwin} - {os: macos-13, target: x86_64-apple-darwin} steps: - name: Checkout source code uses: actions/checkout@v2 - name: Install prerequisites shell: bash run: | case ${{ matrix.job.target }} in arm-unknown-linux-*) 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: Extract crate information shell: bash run: | echo "PROJECT_NAME=joshuto" >> $GITHUB_ENV echo "PROJECT_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV echo "PROJECT_MAINTAINER=$(sed -n 's/^authors = \["\(.*\)"\]/\1/p' Cargo.toml)" >> $GITHUB_ENV echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable target: ${{ matrix.job.target }} override: true profile: minimal # minimal component installation (ie, no documentation) - name: Show version information (Rust, cargo, GCC) 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: ${{ matrix.job.use-cross }} command: build args: --locked --release --target=${{ matrix.job.target }} - name: Create tarball id: package shell: bash run: | # Figure out suffix of binary EXE_suffix="" case ${{ matrix.job.target }} in *-pc-windows-*) EXE_suffix=".exe" ;; esac; BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}" PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac; PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }} PKG_NAME=${PKG_BASENAME}${PKG_suffix} PKG_STAGING="${{ env.CI_INTERMEDIATES_DIR }}/package" ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" mkdir -p "${ARCHIVE_DIR}" # Binary cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "$ARCHIVE_DIR" # base compressed package pushd "${PKG_STAGING}/" >/dev/null case ${{ matrix.job.target }} in *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;; *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;; esac; popd >/dev/null # Let subsequent steps know where to find the compressed package echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_ENV echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_ENV echo "PKG_STAGING=${PKG_STAGING}" >> $GITHUB_ENV - name: "Generate checksum" id: checksum shell: bash run: | SUM_NAME=${{ env.PKG_NAME }}.sha256sum SUM_PATH=${PKG_STAGING}/${SUM_NAME} OS="$(uname -s)" if [ "$OS" == "Linux" ]; then sha256sum ${PKG_PATH} > ${SUM_PATH} elif [ "$OS" == "Darwin" ]; then shasum -a 256 ${PKG_PATH} > ${SUM_PATH} fi echo "SUM_NAME=${SUM_NAME}" >> $GITHUB_ENV echo "SUM_PATH=${SUM_PATH}" >> $GITHUB_ENV - name: "Artifact upload: tarball" uses: actions/upload-artifact@master with: name: ${{ env.PKG_NAME }} path: ${{ env.PKG_PATH }} - name: "Artifact upload: checksum" uses: actions/upload-artifact@master with: name: ${{ env.SUM_NAME }} path: ${{ env.SUM_PATH }} - name: Check for release id: is-release shell: bash run: | unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_ENV - name: Publish archives and packages uses: softprops/action-gh-release@v1 if: env.IS_RELEASE with: files: | ${{ env.PKG_PATH }} ${{ env.SUM_PATH }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}