From 8e5b2d9d645db18130b589eadaf29bea809f9fe4 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Mon, 27 May 2024 21:59:40 +0200 Subject: [PATCH] chore: add CI --- .github/workflows/main.yml | 54 +++++++++++++++ .github/workflows/release.yml | 127 ++++++++++++++++++++++++++++++++++ Cargo.toml | 4 ++ LICENSE | 2 +- README.md | 6 +- 5 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/main.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..6bba200 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,54 @@ +name: Test and Build + +on: + push: + branches: ['main'] + +env: + CARGO_TERM_COLOR: always + +jobs: + tests: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - build: linux + os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - build: macos + os: macos-latest + target: aarch64-apple-darwin + - build: windows + os: windows-latest + target: x86_64-pc-windows-msvc + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Build + run: cargo build --verbose + + - name: Run tests + run: cargo test --verbose + + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Check formatting + run: cargo fmt --all --check + + - name: Check clippy + run: cargo clippy --all-targets --all-features -- -D warnings diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d096931 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,127 @@ +name: Release + +# inspired by https://github.com/BurntSushi/ripgrep/blob/master/.github/workflows/release.yml + +# Only do the release on x.y.z tags. +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +env: + CARGO_TERM_COLOR: always + +jobs: + create-release: + name: create-release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Get the release version from the tag + if: env.VERSION == '' + run: echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV + + - name: Show the version + run: | + echo "version is: $VERSION" + + - name: Check that tag version and Cargo.toml version are the same + shell: bash + run: | + if ! grep -q "version = \"$VERSION\"" Cargo.toml; then + echo "version does not match Cargo.toml" >&2 + exit 1 + fi + + - name: Create GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh release create $VERSION --draft --verify-tag --title $VERSION + + outputs: + version: ${{ env.VERSION }} + + build-release: + name: build-release + needs: ['create-release'] + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - build: linux + os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - build: macos + os: macos-latest + target: aarch64-apple-darwin + - build: windows + os: windows-latest + target: x86_64-pc-windows-msvc + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Set target variables + shell: bash + run: | + echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV + echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV + + - name: Build release binary + shell: bash + run: | + cargo build --verbose --release + if [ "${{ matrix.os }}" = "windows-latest" ]; then + bin="target/${{ matrix.target }}/release/vw.exe" + else + bin="target/${{ matrix.target }}/release/vw" + fi + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Strip release binary (macos) + if: matrix.os == 'macos-latest' + shell: bash + run: strip "$BIN" + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=vaultwalker-$version-${{ matrix.target }}" >> $GITHUB_ENV + + - name: Creating directory for archive + shell: bash + run: | + mkdir -p "$ARCHIVE"/complete + cp "$BIN" "$ARCHIVE"/ + cp {README.md,LICENSE} "$ARCHIVE"/ + + - name: Build archive (Windows) + shell: bash + if: matrix.os == 'windows-latest' + run: | + 7z a "$ARCHIVE.zip" "$ARCHIVE" + certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256" + echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV + + - name: Build archive (Unix) + shell: bash + if: matrix.os != 'windows-latest' + run: | + tar czf "$ARCHIVE.tar.gz" "$ARCHIVE" + shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256" + echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV + + - name: Upload release archive + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload "$${{ needs.create-release.outputs.version }}" ${{ env.ASSET }} ${{ env.ASSET_SUM }} diff --git a/Cargo.toml b/Cargo.toml index e6dc4f6..4dc26d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,10 @@ keywords = ["vault", "hashicorp", "cli"] categories = ["command-line-utilities"] edition = "2021" +[[bin]] +path = "src/main.rs" +name = "vw" + [dependencies] quick-error = "2.0.1" serde_json = "1.0.100" diff --git a/LICENSE b/LICENSE index bcfc050..7243324 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Pierre Millot +Copyright (c) 2024 Pierre Millot Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 4097da7..41f1eaf 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,19 @@ A command line interface to browse and edit [Vault](https://www.vaultproject.io/ If you have the vault cli already installed, you can simply use: ```sh -vaultwalker secret/my_company +vw secret/my_company ``` By default it will fetch the vault server address in `$VAULT_ADDR` and the token in the file `~/.vault-token`. If you want to provide your own login you can use: ```sh -vaultwalker --host --token secret/my_company +vw --host --token secret/my_company ``` To see all available options use: ```sh -vaultwalker -h +vw -h ``` ## Features