mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-07-07 06:43:29 +00:00
185 lines
5.6 KiB
YAML
185 lines
5.6 KiB
YAML
name: CI
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches:
|
|
- main
|
|
paths-ignore:
|
|
- '**/.md'
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
CARGO_INCREMENTAL: 1
|
|
SPACEDRIVE_CUSTOM_APT_FLAGS: --no-install-recommends
|
|
|
|
jobs:
|
|
typescript:
|
|
name: TypeScript
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 17
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@v2.2.2
|
|
with:
|
|
version: 7.x.x
|
|
run_install: false
|
|
|
|
- name: Get pnpm store directory
|
|
id: pnpm-cache
|
|
run: |
|
|
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
|
|
- uses: actions/cache@v3
|
|
name: Setup pnpm cache
|
|
with:
|
|
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pnpm-store-
|
|
|
|
- name: Install pnpm dependencies
|
|
run: pnpm --frozen-lockfile i
|
|
|
|
- name: Perform typechecks
|
|
run: pnpm typecheck
|
|
|
|
build-core:
|
|
name: Build Core (${{ matrix.platform }})
|
|
runs-on: ${{ matrix.platform }}
|
|
needs: typescript
|
|
strategy:
|
|
fail-fast: true
|
|
matrix:
|
|
platform: [ubuntu-latest, macos-latest, windows-latest]
|
|
steps:
|
|
- name: Log in to the Container registry
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name != 'pull_request'
|
|
uses: docker/login-action@v1
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.repository_owner }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v3
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 17
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@v2.0.1
|
|
with:
|
|
version: 7
|
|
run_install: false
|
|
|
|
- name: Install Rust stable
|
|
uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: stable
|
|
profile: minimal
|
|
override: true
|
|
components: rustfmt, rust-src
|
|
|
|
- name: Cache Rust Dependencies
|
|
uses: Swatinem/rust-cache@v1
|
|
with:
|
|
sharedKey: core-v1-${{ hashFiles('**/Cargo.lock') }}
|
|
|
|
- name: Run 'setup-system.sh' script
|
|
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'macos-latest'
|
|
run: ./.github/scripts/setup-system.sh
|
|
|
|
- name: Run 'setup-system.ps1' script
|
|
if: matrix.platform == 'windows-latest'
|
|
run: ./.github/scripts/setup-system.ps1 -ci
|
|
|
|
- name: Get pnpm store directory
|
|
id: pnpm-cache
|
|
run: |
|
|
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)"
|
|
- uses: actions/cache@v3
|
|
name: Setup pnpm cache
|
|
with:
|
|
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
|
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pnpm-store-
|
|
- name: Install pnpm dependencies
|
|
run: pnpm --frozen-lockfile i
|
|
|
|
- name: Cache Prisma codegen
|
|
id: cache-prisma
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: ./core/src/prisma.rs
|
|
key: prisma-${{ hashFiles('./core/prisma/Cargo.toml', './core/prisma/schema.prisma', './core/prisma/src/main.rs') }}
|
|
|
|
- name: Generate Prisma client
|
|
working-directory: core
|
|
if: steps.cache-prisma.outputs.cache-hit != 'true'
|
|
run: cargo run -p prisma-cli --release -- generate
|
|
|
|
- name: Cargo fetch
|
|
run: cargo fetch
|
|
|
|
- name: Check Core
|
|
run: cargo check -p sdcore --release
|
|
|
|
- name: Bundle Desktop
|
|
run: pnpm desktop tauri build
|
|
|
|
- name: Build Server
|
|
if: matrix.platform == 'ubuntu-latest'
|
|
run: |
|
|
cargo build -p server --release
|
|
cp ./target/release/server ./apps/server/server
|
|
|
|
- name: Determine image name & tag
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name != 'pull_request'
|
|
run: |
|
|
if [ "$GITHUB_EVENT_NAME" == "release" ]; then
|
|
export IMAGE_TAG=${GITHUB_REF##*/}
|
|
else
|
|
export IMAGE_TAG=$(git rev-parse --short "$GITHUB_SHA")
|
|
fi
|
|
export GITHUB_REPOSITORY_LOWER=$(echo $GITHUB_REPOSITORY | awk '{print tolower($0)}')
|
|
export IMAGE_NAME="ghcr.io/$GITHUB_REPOSITORY_LOWER/server"
|
|
echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_ENV
|
|
echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV
|
|
echo "Building $IMAGE_NAME:$IMAGE_TAG"
|
|
|
|
- name: Build Docker image
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name != 'pull_request'
|
|
run: |
|
|
docker build ./apps/server --tag $IMAGE_NAME:$IMAGE_TAG
|
|
|
|
- name: Push Docker image
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name != 'pull_request'
|
|
run: |
|
|
docker push $IMAGE_NAME:$IMAGE_TAG
|
|
|
|
- name: Tag & push image as latest staging image
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name != 'pull_request' && github.event_name != 'release'
|
|
run: |
|
|
docker tag $IMAGE_NAME:$IMAGE_TAG $IMAGE_NAME:staging
|
|
docker push $IMAGE_NAME:staging
|
|
|
|
- name: Tag & push image as latest production image
|
|
if: matrix.platform == 'ubuntu-latest' && github.event_name == 'release'
|
|
run: |
|
|
docker tag $IMAGE_NAME:$IMAGE_TAG $IMAGE_NAME:production
|
|
docker push $IMAGE_NAME:production
|
|
|
|
- name: Publish artifacts
|
|
uses: ./.github/actions/publish-artifacts
|