name: Main workflow on: push: paths-ignore: - "docs/**" - "**.md" pull_request: paths-ignore: - "docs/**" - "**.md" jobs: # Run the `rustfmt` code formatter rustfmt: name: Rustfmt [Formatter] runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable components: rustfmt override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check # Run the `clippy` linting tool clippy: name: Clippy [Linter] runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable components: clippy override: true - uses: actions-rs/clippy-check@v1 with: token: ${{ secrets.GITHUB_TOKEN }} args: --all-targets --all-features -- -D clippy::all # Run a security audit on dependencies cargo_audit: name: Cargo Audit [Security] runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - run: cargo install --force cargo-audit - run: cargo generate-lockfile - uses: actions-rs/cargo@v1 with: command: audit # Ensure that the project could be successfully compiled cargo_check: name: Compile runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - uses: actions-rs/cargo@v1 with: command: check args: --all # Run tests on Linux, macOS, and Windows # On both Rust stable and Rust nightly test: name: Test Suite needs: [cargo_check] runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macOS-latest, windows-latest] rust: [stable, nightly] steps: # Checkout the branch being tested - uses: actions/checkout@v1 # Install all the required dependencies for testing - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true # Install Node.js at a fixed version - uses: actions/setup-node@v1 with: node-version: "12.0.0" # Install Golang at a fixed version - uses: actions/setup-go@v1 with: go-version: "1.12.1" # Install Ruby at a fixed version - uses: actions/setup-ruby@v1 with: ruby-version: "2.6.3" # Install Python at a fixed version - uses: actions/setup-python@v1 with: python-version: "3.7.5" # Install dotnet at a fixed version - uses: actions/setup-dotnet@v1 with: dotnet-version: "2.2.402" # Install Mercurial (pre-installed on linux, installed from pip on macos # and from choco on windows), - name: Install Mercurial (macos) if: matrix.os == 'macOS-latest' env: HGPYTHON3: 1 run: pip install mercurial - name: Install Mercurial (windows) if: matrix.os == 'windows-latest' run: choco install hg # Run the ignored tests that expect the above setup - name: Run all tests uses: actions-rs/cargo@v1 with: command: test args: -- -Z unstable-options --include-ignored # Run the tests in the Docker image docker_test: name: Test in Docker needs: [cargo_check] runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Pull the pre-built Docker image run: docker pull starshipcommand/starship-test - name: Fix file permissions run: chmod -R a+w . - name: Build the Docker image run: docker build -f tests/Dockerfile --tag starshipcommand/starship-test --cache-from starshipcommand/starship-test . - name: Run tests in Docker run: docker run --rm -v $(pwd):/src/starship starshipcommand/starship-test # Publish starship to Crates.io cargo_publish: if: startsWith(github.ref, 'refs/tags/v') name: Publish Cargo Package runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - run: cargo login $CRATES_IO_TOKEN - run: cargo publish env: CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} # Build sources for every OS github_build: if: startsWith(github.ref, 'refs/tags/v') name: Build release binaries strategy: fail-fast: false matrix: target: - x86_64-unknown-linux-gnu - x86_64-unknown-linux-musl - x86_64-apple-darwin - x86_64-pc-windows-msvc include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest name: starship-x86_64-unknown-linux-gnu.tar.gz - target: x86_64-unknown-linux-musl os: ubuntu-latest name: starship-x86_64-unknown-linux-musl.tar.gz - target: x86_64-apple-darwin os: macOS-latest name: starship-x86_64-apple-darwin.tar.gz - target: x86_64-pc-windows-msvc os: windows-latest name: starship-x86_64-pc-windows-msvc.zip runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true target: ${{ matrix.target }} - name: Install musl tools if: matrix.target == 'x86_64-unknown-linux-musl' run: sudo apt-get install -y musl-tools - name: Build target uses: actions-rs/cargo@v1 with: command: build args: --release --target ${{ matrix.target }} - name: Prepare build artifacts [Windows] if: matrix.os == 'windows-latest' run: | cd target/${{ matrix.target }}/release strip starship.exe 7z a ../../../${{ matrix.name }} starship.exe cd - - name: Prepare build artifacts [-nix] if: matrix.os != 'windows-latest' run: | cd target/${{ matrix.target }}/release strip starship tar czvf ../../../${{ matrix.name }} starship cd - - name: Upload build artifact uses: actions/upload-artifact@v1 with: name: ${{ matrix.name }} path: ${{ matrix.name }} # Create GitHub release with Rust build targets and release notes github_release: if: startsWith(github.ref, 'refs/tags/v') name: Create GitHub Release needs: github_build runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 # These can be squashed when https://github.com/actions/download-artifact/issues/6 is closed - name: Download releases from github_build uses: actions/download-artifact@v1 with: name: starship-x86_64-unknown-linux-gnu.tar.gz path: . - name: Download releases from github_build uses: actions/download-artifact@v1 with: name: starship-x86_64-unknown-linux-musl.tar.gz path: . - name: Download releases from github_build uses: actions/download-artifact@v1 with: name: starship-x86_64-apple-darwin.tar.gz path: . - name: Download releases from github_build uses: actions/download-artifact@v1 with: name: starship-x86_64-pc-windows-msvc.zip path: . - name: Generate checksums run: for file in starship-*; do openssl dgst -sha256 -r "$file" | awk '{print $1}' > "${file}.sha256"; done - name: Generate release notes run: | # Temporary fix for https://github.com/actions/setup-go/issues/14 export PATH=$PATH:$(go env GOPATH)/bin go get -u github.com/git-chglog/git-chglog/cmd/git-chglog git-chglog -c .github/chglog/release.yml $(git describe --tags) > RELEASE.md - name: Create GitHub release ${{ matrix.target }} uses: softprops/action-gh-release@v1 with: files: | starship-x86_64-unknown-linux-gnu.tar.gz starship-x86_64-unknown-linux-gnu.tar.gz.sha256 starship-x86_64-unknown-linux-musl.tar.gz starship-x86_64-unknown-linux-musl.tar.gz.sha256 starship-x86_64-apple-darwin.tar.gz starship-x86_64-apple-darwin.tar.gz.sha256 starship-x86_64-pc-windows-msvc.zip starship-x86_64-pc-windows-msvc.zip.sha256 body_path: RELEASE.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}