diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..49bbb6b17 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +.git +.gitignore + +**/target +**/node_modules + +**/*.log +**/*.md +**/tmp + +Dockerfile diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 000000000..46b62dc5e --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,49 @@ +name: Build and Publish Docker Image + +on: + workflow_dispatch: # Manual + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=latest,enable={{is_default_branch}} + type=sha + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..71eb285c7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +# syntax=docker/dockerfile:1.4 +# Cargo build stage +FROM rust:1.80-slim AS cargo-builder +# Install Rust dependencies +RUN --mount=type=cache,target=/var/cache/apt \ + --mount=type=cache,target=/usr/local/cargo/registry \ + apt-get update && apt-get install -y --no-install-recommends \ + libdbus-1-dev libsoup2.4-dev libjavascriptcoregtk-4.0-dev \ + libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev \ + libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev \ + gnome-video-effects +COPY . /pake +WORKDIR /pake/src-tauri +# Build cargo packages and store cache +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + cargo fetch && \ + cargo build --release && \ + mkdir -p /cargo-cache && \ + cp -R /usr/local/cargo/registry /cargo-cache/ && \ + cp -R /usr/local/cargo/git /cargo-cache/ + +# Verify the content of /cargo-cache && clean unnecessary files +RUN ls -la /cargo-cache/registry && ls -la /cargo-cache/git && rm -rfd /cargo-cache/registry/src + +# Main build stage +FROM rust:1.80-slim AS builder +# Install Rust dependencies +RUN --mount=type=cache,target=/var/cache/apt \ + --mount=type=cache,target=/usr/local/cargo/registry \ + apt-get update && apt-get install -y --no-install-recommends \ + libdbus-1-dev libsoup2.4-dev libjavascriptcoregtk-4.0-dev \ + libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev \ + libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev \ + gnome-video-effects + +# Install Node.js 20.x +RUN --mount=type=cache,target=/var/cache/apt \ + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get update && apt-get install -y nodejs + +# Copy project files +COPY . /pake +WORKDIR /pake + +# Copy Rust build artifacts +COPY --from=cargo-builder /pake/src-tauri /pake/src-tauri +COPY --from=cargo-builder /cargo-cache/git /usr/local/cargo/git +COPY --from=cargo-builder /cargo-cache/registry /usr/local/cargo/registry + +# Install dependencies and build pake-cli +RUN --mount=type=cache,target=/root/.npm \ + npm install && \ + npm run cli:build + +# Set up the entrypoint +WORKDIR /output +ENTRYPOINT ["node", "/pake/cli.js"] diff --git a/README.md b/README.md index ca2e1d87c..bb359eaa1 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,18 @@ pake url [OPTIONS]... # Feel free to play with Pake! It might take a while to prepare the environment the first time you launch Pake. pake https://weekly.tw93.fun --name Weekly --hide-title-bar + +# On Linux, you can run the Pake CLI via Docker +docker run -it --rm \ # Run interactively, remove container after exit + -v YOUR_DIR:/output \ # Files from container's /output will be in YOU_DIR + ghcr.io/tw93/pake \ + + +# For example: +docker run -it --rm \ + -v ./packages:/output \ + ghcr.io/tw93/pake \ + https://example.com --name myapp --icon ./icon.png ``` If you are new to the command line, you can compile packages online with _GitHub Actions_. See the [Tutorial]() for more information.