diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 135ecc8..02e982c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,4 +44,4 @@ jobs: toolchain: stable components: clippy - - run: cargo clippy + - run: cargo clippy -- -D warnings diff --git a/.github/workflows/mean_bean_ci.yml b/.github/workflows/mean_bean_ci.yml new file mode 100644 index 0000000..8f6f155 --- /dev/null +++ b/.github/workflows/mean_bean_ci.yml @@ -0,0 +1,123 @@ +name: Mean Bean CI + +on: [push, pull_request] + +jobs: + install-cross: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 50 + + - uses: XAMPPRocky/get-github-release@v1 + id: cross + with: + owner: rust-embedded + repo: cross + matches: ${{ matrix.platform }} + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/upload-artifact@v1 + with: + name: cross-${{ matrix.platform }} + path: ${{ steps.cross.outputs.install_path }} + strategy: + matrix: + platform: [linux-musl] + + macos: + runs-on: macos-latest + strategy: + fail-fast: true + matrix: + channel: [stable] + target: + - x86_64-apple-darwin + + steps: + - name: Setup | Checkout + uses: actions/checkout@v2 + - name: Setup | Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + profile: minimal + target: ${{ matrix.target }} + - run: ci/set_rust_version.bash ${{ matrix.channel }} ${{ matrix.target }} + - name: Test + uses: actions-rs/cargo@v1 + with: + command: test + args: --target ${{ matrix.target }} + use-cross: false + + linux: + runs-on: ubuntu-latest + needs: install-cross + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 50 + + - name: Download Cross + uses: actions/download-artifact@v1 + with: + name: cross-linux-musl + path: /tmp/ + - run: chmod +x /tmp/cross + - run: ci/set_rust_version.bash ${{ matrix.channel }} ${{ matrix.target }} + - run: ci/build.bash /tmp/cross ${{ matrix.target }} + # These targets have issues with being tested so they are disabled + # by default. You can try disabling to see if they work for + # your project. + - run: ci/test.bash /tmp/cross ${{ matrix.target }} + if: | + !contains(matrix.target, 'android') && + !contains(matrix.target, 'bsd') && + !contains(matrix.target, 'solaris') && + matrix.target != 'armv5te-unknown-linux-musleabi' && + matrix.target != 'sparc64-unknown-linux-gnu' + + strategy: + fail-fast: true + matrix: + channel: [stable] + target: + - arm-unknown-linux-gnueabi + - armv7-unknown-linux-gnueabihf + - i686-unknown-linux-musl + - x86_64-unknown-linux-musl + + windows: + runs-on: windows-latest + # Windows technically doesn't need this, but if we don't block windows on it + # some of the windows jobs could fill up the concurrent job queue before + # one of the install-cross jobs has started, so this makes sure all + # artifacts are downloaded first. + needs: install-cross + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 50 + - run: ci/set_rust_version.bash ${{ matrix.channel }} ${{ matrix.target }} + shell: bash + - run: ci/build.bash cargo ${{ matrix.target }} + shell: bash + - run: ci/test.bash cargo ${{ matrix.target }} + shell: bash + + strategy: + fail-fast: true + matrix: + channel: [stable] + target: + # MSVC + - i686-pc-windows-msvc + - x86_64-pc-windows-msvc + # GNU: You typically only need to test Windows GNU if you're + # specifically targetting it, and it can cause issues with some + # dependencies if you're not so it's disabled by self. + # - i686-pc-windows-gnu + # - x86_64-pc-windows-gnu diff --git a/.github/workflows/mean_bean_deploy.yml b/.github/workflows/mean_bean_deploy.yml new file mode 100644 index 0000000..f2a0b00 --- /dev/null +++ b/.github/workflows/mean_bean_deploy.yml @@ -0,0 +1,192 @@ +on: + push: + # # Sequence of patterns matched against refs/tags + tags: + - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 + +name: Mean Bean Deploy +env: + BIN: bore + +jobs: + # This job downloads and stores `cross` as an artifact, so that it can be + # redownloaded across all of the jobs. Currently this copied pasted between + # `mean_bean_ci.yml` and `mean_bean_deploy.yml`. Make sure to update both places when making + # changes. + install-cross: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 50 + + - uses: XAMPPRocky/get-github-release@v1 + id: cross + with: + owner: rust-embedded + repo: cross + matches: ${{ matrix.platform }} + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/upload-artifact@v1 + with: + name: cross-${{ matrix.platform }} + path: ${{ steps.cross.outputs.install_path }} + strategy: + matrix: + platform: [linux-musl] + + macos: + runs-on: macos-latest + strategy: + matrix: + target: + # macOS + - x86_64-apple-darwin + - aarch64-apple-darwin + steps: + - name: Get tag + id: tag + uses: dawidd6/action-get-tag@v1 + + - name: Setup | Checkout + uses: actions/checkout@v2 + + # Cache files between builds + - name: Setup | Cache Cargo + uses: actions/cache@v2 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.target }} + + - name: Setup | Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + profile: minimal + target: ${{ matrix.target }} + + - name: Build | Build + uses: actions-rs/cargo@v1 + with: + command: build + args: --release --target ${{ matrix.target }} + + - run: tar -czvf ${{ env.BIN }}.tar.gz --directory=target/${{ matrix.target }}/release ${{ env.BIN }} + - uses: XAMPPRocky/create-release@v1.0.2 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + draft: false + prerelease: false + + - uses: actions/upload-release-asset@v1 + id: upload-release-asset + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ${{ env.BIN }}.tar.gz + asset_name: ${{ env.BIN }}-${{steps.tag.outputs.tag}}-${{ matrix.target }}.tar.gz + asset_content_type: application/gzip + + linux: + runs-on: ubuntu-latest + needs: install-cross + strategy: + matrix: + target: + - arm-unknown-linux-gnueabi + - armv7-unknown-linux-gnueabihf + - i686-unknown-linux-musl + - x86_64-unknown-linux-musl + steps: + - name: Get tag + id: tag + uses: dawidd6/action-get-tag@v1 + + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v1 + with: + name: cross-linux-musl + path: /tmp/ + - run: chmod +x /tmp/cross + + - run: ci/set_rust_version.bash stable ${{ matrix.target }} + - run: ci/build.bash /tmp/cross ${{ matrix.target }} RELEASE + - run: tar -czvf ${{ env.BIN }}.tar.gz --directory=target/${{ matrix.target }}/release ${{ env.BIN }} + + - uses: XAMPPRocky/create-release@v1.0.2 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + draft: false + prerelease: false + + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ${{ env.BIN }}.tar.gz + asset_name: ${{ env.BIN }}-${{steps.tag.outputs.tag}}-${{ matrix.target }}.tar.gz + asset_content_type: application/gzip + + windows: + runs-on: windows-latest + needs: install-cross + strategy: + matrix: + target: + # MSVC + - i686-pc-windows-msvc + - x86_64-pc-windows-msvc + # GNU + # - i686-pc-windows-gnu + # - x86_64-pc-windows-gnu + steps: + - name: Get tag + id: tag + uses: dawidd6/action-get-tag@v1 + + - uses: actions/checkout@v2 + - run: bash ci/set_rust_version.bash stable ${{ matrix.target }} + - run: bash ci/build.bash cargo ${{ matrix.target }} RELEASE + - run: | + cd ./target/${{ matrix.target }}/release/ + 7z a "${{ env.BIN }}.zip" "${{ env.BIN }}.exe" + mv "${{ env.BIN }}.zip" $GITHUB_WORKSPACE + shell: bash + # We're using using a fork of `actions/create-release` that detects + # whether a release is already available or not first. + - uses: XAMPPRocky/create-release@v1.0.2 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + # Draft should **always** be false. GitHub doesn't provide a way to + # get draft releases from its API, so there's no point using it. + draft: false + prerelease: false + - uses: actions/upload-release-asset@v1 + id: upload-release-asset + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ${{ env.BIN }}.zip + asset_name: ${{ env.BIN }}-${{steps.tag.outputs.tag}}-${{ matrix.target }}.zip + asset_content_type: application/zip diff --git a/README.md b/README.md index c5d0720..62df8aa 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A modern, simple TCP tunnel in Rust that exposes local ports to a remote server, ![Video demo](https://i.imgur.com/vDeGsmx.gif) ```shell -# Installation (requires Rust) +# Installation (requires Rust, see alternatives below) cargo install bore-cli # On your local machine @@ -23,6 +23,8 @@ Similar to [localtunnel](https://github.com/localtunnel/localtunnel) and [ngrok] ## Installation +The easiest way to install bore is from prebuilt binaries. These are available on the [releases page](https://github.com/ekzhang/bore/releases) for macOS, Windows, and Linux. Just unzip the appropriate file for your platform and move the bore executable into a folder on your PATH. + You can build the `bore` CLI command from source using [Cargo](https://doc.rust-lang.org/cargo/), the Rust package manager. This command installs the `bore` binary at a user-accessible path. ```shell diff --git a/ci/build.bash b/ci/build.bash new file mode 100755 index 0000000..99e546f --- /dev/null +++ b/ci/build.bash @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Script for building your rust projects. +set -e + +source ci/common.bash + +# $1 {path} = Path to cross/cargo executable +CROSS=$1 +# $1 {string} = e.g. x86_64-pc-windows-msvc +TARGET_TRIPLE=$2 +# $3 {boolean} = Are we building for deployment? +RELEASE_BUILD=$3 + +required_arg $CROSS 'CROSS' +required_arg $TARGET_TRIPLE '' + +if [ -z "$RELEASE_BUILD" ]; then + $CROSS build --target $TARGET_TRIPLE + $CROSS build --target $TARGET_TRIPLE --all-features +else + $CROSS build --target $TARGET_TRIPLE --all-features --release +fi diff --git a/ci/common.bash b/ci/common.bash new file mode 100644 index 0000000..6b0a21a --- /dev/null +++ b/ci/common.bash @@ -0,0 +1,6 @@ +required_arg() { + if [ -z "$1" ]; then + echo "Required argument $2 missing" + exit 1 + fi +} diff --git a/ci/set_rust_version.bash b/ci/set_rust_version.bash new file mode 100755 index 0000000..d822cd5 --- /dev/null +++ b/ci/set_rust_version.bash @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +rustup default $1 +rustup target add $2 diff --git a/ci/test.bash b/ci/test.bash new file mode 100755 index 0000000..f85e248 --- /dev/null +++ b/ci/test.bash @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Script for building your rust projects. +set -e + +source ci/common.bash + +# $1 {path} = Path to cross/cargo executable +CROSS=$1 +# $1 {string} = +TARGET_TRIPLE=$2 + +required_arg $CROSS 'CROSS' +required_arg $TARGET_TRIPLE '' + +$CROSS test --target $TARGET_TRIPLE +$CROSS test --target $TARGET_TRIPLE --all-features