From b5ebb33627d3907300b5f58a8a05d8f2880f905f Mon Sep 17 00:00:00 2001 From: Sergio <77530549+sergi0g@users.noreply.github.com> Date: Fri, 6 Sep 2024 21:46:43 +0300 Subject: [PATCH] Optimize workflows (#25) feat: optimize workflows --------- Co-authored-by: Stavros --- .github/workflows/ci.yml | 47 ++++++++++++ .github/workflows/nightly.yml | 75 ++++++++++++------- .github/workflows/{build.yml => release.yml} | 68 +++++++++-------- Dockerfile | 40 +++++++--- build.sh | 13 +++- src/static/apple-touch-icon.png | Bin 5872 -> 0 bytes src/static/favicon.ico | Bin 1029 -> 0 bytes src/static/favicon.svg | 29 ------- 8 files changed, 171 insertions(+), 101 deletions(-) create mode 100644 .github/workflows/ci.yml rename .github/workflows/{build.yml => release.yml} (61%) delete mode 100644 src/static/apple-touch-icon.png delete mode 100644 src/static/favicon.ico delete mode 100644 src/static/favicon.svg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0351d88 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: CI +on: + pull_request: + push: + branches: "main" + +jobs: + build-binary: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Set up Bun + uses: oven-sh/setup-bun@v1 + + - name: Install deps + run: cd web && bun install + + - name: Build + run: ./build.sh cargo build --verbose + + build-image: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + push: false + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 6d8f8a5..1ae7dd9 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,46 +1,48 @@ name: Nightly Release on: - push: - branches: main + workflow_dispatch: jobs: - build-binary: - strategy: - matrix: - platform: - - release_for: linux-aarch64 - os: ubuntu-latest - target: aarch64-unknown-linux-musl - bin: cup - name: cup-linux-aarch64 - command: build - - - release_for: linux-x86_64 - os: ubuntu-latest - target: x86_64-unknown-linux-musl - bin: cup - name: cup-linux-x86_64 - command: build - - runs-on: ${{ matrix.platform.os }} + build-binaries: + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup rust + - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Install cross run: cargo install cross --git https://github.com/cross-rs/cross - - name: Build binary - run: cross ${{ matrix.platform.command }} --target ${{ matrix.platform.target }} + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Set up Bun + uses: oven-sh/setup-bun@v1 - - name: Upload CLI + - name: Install deps + run: cd web && bun install + + - name: Build amd64 binary + run: | + ./build.sh cross build --target x86_x64-unknown-linux-musl --release + mv target/x86_x64-unknown-linux-musl/release/cup ./cup-linux-amd64 + + - name: Build arm64 binary + run: | + ./build.sh cross build --target aarch64-unknown-linux-musl --release + mv target/aarch64-unknown-linux-musl/release/cup ./cup-linux-arm64 + + - name: Upload binaries uses: actions/upload-artifact@v4 with: - name: ${{ matrix.platform.name }} - path: target/${{ matrix.platform.target }}/debug/${{ matrix.platform.bin }} + name: binaries + path: | + cup-linux-amd64 + cup-linux-arm64 build-image: runs-on: ubuntu-latest @@ -69,4 +71,21 @@ jobs: push: true tags: ghcr.io/sergi0g/cup:nightly cache-from: type=gha - cache-to: type=gha,mode=max \ No newline at end of file + cache-to: type=gha,mode=max + + nightly-release: + runs-on: ubuntu-latest + needs: build-binaries + steps: + - name: Download binaries + uses: actions/download-artifact@v4 + with: + name: binaries + path: binaries + + - uses: pyTooling/Actions/releaser@r0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + tag: nightly + rm: true + files: binaries/* diff --git a/.github/workflows/build.yml b/.github/workflows/release.yml similarity index 61% rename from .github/workflows/build.yml rename to .github/workflows/release.yml index 2dcd01d..5ca6fae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,6 @@ name: Release on: - push: - tags: ["v*.*.*"] + workflow_dispatch: jobs: get-tag: @@ -12,34 +11,50 @@ jobs: - name: Get current tag id: tag run: | - TAG=$(echo "$GITHUB_REF" | sed 's/^refs\/tags\///') + TAG=v$(head -n 4 Cargo.toml | grep version | awk '{print $3}' | tr -d '"') echo "Current tag: $TAG" echo "tag=$TAG" >> $GITHUB_OUTPUT - build-binary: - strategy: - matrix: - arch: - - aarch64 - - x86_64 + + build-binaries: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup rust + - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Install cross run: cargo install cross --git https://github.com/cross-rs/cross - - name: Build binary - run: cross build --target ${{ matrix.arch }}-unknown-linux-musl --release + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 - - name: Upload binary + - name: Set up Bun + uses: oven-sh/setup-bun@v1 + + - name: Install deps + run: cd web && bun install + + - name: Build amd64 binary + run: | + ./build.sh cross build --target x86_x64-unknown-linux-musl --release + mv target/x86_x64-unknown-linux-musl/release/cup ./cup-linux-amd64 + + - name: Build arm64 binary + run: | + ./build.sh cross build --target aarch64-unknown-linux-musl --release + mv target/aarch64-unknown-linux-musl/release/cup ./cup-linux-arm64 + + - name: Upload binaries uses: actions/upload-artifact@v4 with: - name: cup-linux-${{ matrix.arch }} - path: target/${{ matrix.arch }}-unknown-linux-musl/release/cup + name: binaries + path: | + cup-linux-amd64 + cup-linux-arm64 build-image: needs: get-tag @@ -73,24 +88,13 @@ jobs: release: runs-on: ubuntu-latest - needs: [get-tag, build-image, build-binary] + needs: [get-tag, build-image, build-binaries] steps: - - name: Download arm64 binary + - name: Download binaries uses: actions/download-artifact@v4 with: - name: cup-linux-aarch64 - path: cup-linux-aarch64 - - - name: Download x86 binary - uses: actions/download-artifact@v4 - with: - name: cup-linux-x86_64 - path: cup-linux-x86_64 - - # - name: Extract and rename binaries - # run: | - # unzip /home/runner/work/cup/cup/cup-linux-aarch64 && mv /home/runner/work/cup/cup/cup cup-linux-aarch64 - # unzip /home/runner/work/cup/cup/cup-linux-x86_64 && mv /home/runner/work/cup/cup/cup cup-linux-x86_64 + name: binaries + path: binaries - name: Create release uses: softprops/action-gh-release@v2 @@ -100,6 +104,4 @@ jobs: prerelease: true tag_name: ${{ needs.get-tag.outputs.tag }} name: ${{ needs.get-tag.outputs.tag }} - files: | - cup-linux-aarch64 - cup-linux-x86_64 + files: binaries/* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index c47cd04..fb4126e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,42 @@ -FROM rust:alpine AS build -WORKDIR / +### Build UI ### +FROM node:20 AS web +# Install bun +RUN curl -fsSL https://bun.sh/install | bash + +# Copy web folder +COPY ./web /web +WORKDIR /web + +# Install requirements +RUN ~/.bun/bin/bun install + +# Build frontend +RUN ~/.bun/bin/bun run build + +### Build Cup ### +FROM rust:1.80.1-alpine AS build + +# Requirements RUN apk add musl-dev -RUN USER=root cargo new --bin cup +# Copy files WORKDIR /cup -COPY Cargo.toml Cargo.lock . -RUN cargo build --release -RUN rm -rf src/ +COPY Cargo.toml . +COPY Cargo.lock . +COPY ./src ./src -COPY src src -# This is a very bad workaround, but cargo only triggers a rebuild this way for some reason -RUN printf "\n" >> src/main.rs +# Copy UI from web builder +COPY --from=web /web/dist src/static + +# Build RUN cargo build --release +### Main ### FROM scratch + +# Copy binary COPY --from=build /cup/target/release/cup /cup + ENTRYPOINT ["/cup"] \ No newline at end of file diff --git a/build.sh b/build.sh index f4688a3..7a8710b 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,16 @@ #!/bin/sh -rm -rf src/static +# This is kind of like a shim that makes sure the frontend is rebuilt when running a build. For example you can run `./build.sh cargo build --release` + +# Frontend cd web/ + +# Build bun run build + +# Copy UI to src folder cp -r dist/ ../src/static -cargo build $@ \ No newline at end of file + +# Run command from argv + +$@ \ No newline at end of file diff --git a/src/static/apple-touch-icon.png b/src/static/apple-touch-icon.png deleted file mode 100644 index ac6ec921024a44485de346584bb68284766d5f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5872 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 - - - - - - - - - - - - - - - - -