diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..0751991 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,189 @@ +name: Release + + +env: + MIN_SUPPORTED_RUST_VERSION: "1.51.0" + CICD_INTERMEDIATES_DIR: "_cicd-intermediates" + +on: + 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-18.04 , target: arm-unknown-linux-gnueabihf , use-cross: true } + - { os: ubuntu-18.04 , target: aarch64-unknown-linux-gnu , use-cross: true } + - { os: ubuntu-18.04 , target: i686-unknown-linux-gnu , use-cross: true } + - { os: ubuntu-18.04 , target: x86_64-unknown-linux-gnu } + - { os: macos-10.15 , 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-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: Extract crate information + shell: bash + run: | + echo "PROJECT_NAME=$(sed -n 's/^name = "\(.*\)"/\1/p' Cargo.toml)" >> $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: --release --target=${{ matrix.job.target }} + + - name: Strip debug information from executable + id: strip + shell: bash + run: | + # Figure out suffix of binary + EXE_suffix="" + case ${{ matrix.job.target }} in + *-pc-windows-*) EXE_suffix=".exe" ;; + esac; + + # Figure out what strip tool to use if any + 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; + + # Setup paths + BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/" + mkdir -p "${BIN_DIR}" + BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}" + BIN_PATH="${BIN_DIR}/${BIN_NAME}" + + # Copy the release build binary to the result location + cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}" + + # Also strip if possible + if [ -n "${STRIP}" ]; then + "${STRIP}" "${BIN_PATH}" + fi + + # Let subsequent steps know where to find the (stripped) bin + echo ::set-output name=BIN_PATH::${BIN_PATH} + echo ::set-output name=BIN_NAME::${BIN_NAME} + + - name: Create tarball + id: package + shell: bash + run: | + 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} + echo ::set-output name=PKG_NAME::${PKG_NAME} + + PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package" + ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" + mkdir -p "${ARCHIVE_DIR}" + mkdir -p "${ARCHIVE_DIR}/autocomplete" + + # Binary + cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR" + + # README, LICENSE and CHANGELOG files + cp "README.md" "LICENSE" "$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 ::set-output name=PKG_PATH::"${PKG_STAGING}/${PKG_NAME}" + + - name: Create Debian package + id: debian-package + shell: bash + if: startsWith(matrix.job.os, 'ubuntu') + run: | + cargo install cargo-deb + cargo deb + + case ${{ matrix.job.target }} in + aarch64-*-linux-*) DPKG_ARCH=arm64 ;; + arm-*-linux-*hf) DPKG_ARCH=armhf ;; + i686-*-linux-*) DPKG_ARCH=i686 ;; + x86_64-*-linux-*) DPKG_ARCH=amd64 ;; + *) DPKG_ARCH=notset ;; + esac; + + DPKG_NAME="${PROJECT_NAME}_${PROJECT_VERSION}_${DPKG_ARCH}.deb" + DPKG_PATH="target/debian/${PKG_BASENAME}.deb" + DPKG_PATH="target/debian/${DPKG_NAME}" + + echo ::set-output name=DPKG_NAME::${DPKG_NAME} + echo ::set-output name=DPKG_PATH::${DPKG_PATH} + + - name: "Artifact upload: tarball" + uses: actions/upload-artifact@master + with: + name: ${{ steps.package.outputs.PKG_NAME }} + path: ${{ steps.package.outputs.PKG_PATH }} + + - name: "Artifact upload: Debian package" + uses: actions/upload-artifact@master + if: steps.debian-package.outputs.DPKG_NAME + with: + name: ${{ steps.debian-package.outputs.DPKG_NAME }} + path: ${{ steps.debian-package.outputs.DPKG_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 ::set-output name=IS_RELEASE::${IS_RELEASE} + + - name: Publish archives and packages + uses: softprops/action-gh-release@v1 + if: steps.is-release.outputs.IS_RELEASE + with: + files: | + ${{ steps.package.outputs.PKG_PATH }} + ${{ steps.debian-package.outputs.DPKG_PATH }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index d547606..a67e433 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -23,17 +23,8 @@ jobs: override: true - name: Run cargo build - run: cargo build --all --release && strip target/release/atuin && mv target/release/atuin target/release/atuin_linux + run: cargo build --all --release && strip target/release/atuin - - name: Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - files: | - target/release/atuin_linux - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - test: runs-on: ubuntu-latest @@ -80,30 +71,3 @@ jobs: - name: Format run: cargo fmt -- --check - - build-mac: - runs-on: macos-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Install latest rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - target: x86_64-apple-darwin - default: true - override: true - - - name: Build for mac - run: cargo build --all --release && strip target/release/atuin && mv target/release/atuin target/release/atuin_darwin - - - name: Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - files: | - target/release/atuin_darwin - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/install.sh b/install.sh index 3175968..0b7239f 100755 --- a/install.sh +++ b/install.sh @@ -26,24 +26,24 @@ LATEST_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/ell LATEST_VERSION=$(echo $LATEST_RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/') __atuin_install_arch(){ - echo "Arch Linux detected!" - echo "Attempting AUR install" + echo "Arch Linux detected!" + echo "Attempting AUR install" - if command -v yaourt &> /dev/null; then - echo "Found yaourt" - yaourt -S atuin - elif command -v yay &> /dev/null; then - echo "Found yay" - yay -S atuin - elif command -v pakku &> /dev/null; then - echo "Found pakku" - pakku -S atuin - elif command -v pamac &> /dev/null; then - echo "Found pamac" - pamac install atuin - else - echo "Failed to install atuin! Please try manually: https://aur.archlinux.org/packages/atuin/" - fi + if command -v yaourt &> /dev/null; then + echo "Found yaourt" + yaourt -S atuin + elif command -v yay &> /dev/null; then + echo "Found yay" + yay -S atuin + elif command -v pakku &> /dev/null; then + echo "Found pakku" + pakku -S atuin + elif command -v pamac &> /dev/null; then + echo "Found pamac" + pamac install atuin + else + echo "Failed to install atuin! Please try manually: https://aur.archlinux.org/packages/atuin/" + fi } @@ -58,17 +58,6 @@ __atuin_install_ubuntu(){ rm -f "$TEMP_DEB" } -__atuin_install_fedora(){ - echo "Fedora detected" - # TODO: select correct AARCH too - ARTIFACT_URL="https://github.com/account/project/releases/download/$LATEST_VERSION/atuin_$LATEST_VERSION_amd64.rpm" - - TEMP_DEB="$(mktemp)" && - wget -O "$TEMP_DEB" $ARTIFACT_URL - sudo dpkg -i "$TEMP_DEB" - rm -f "$TEMP_DEB" -} - __atuin_install_linux(){ echo "Detected Linux!" echo "Checking distro..." @@ -88,8 +77,6 @@ __atuin_install_linux(){ __atuin_install_arch elif [ $OS == "Ubuntu" ] || [ $OS == "Debian" ] || [ $OS == "Linuxmint" ] || [ $OS == "Parrot" ] || [ $OS == "Kali" ]; then __atuin_install_ubuntu - elif [ $OS == "Fedora" ]; then - __atuin_install_fedora else # TODO: download a binary or smth __atuin_install_unsupported