tercul-frontend/.github/workflows/docker-build.yml
Damir Mukimov c940582efe
feat: Add GitHub Actions workflows for frontend CI/CD (#5)
* feat: Add GitHub Actions workflows for frontend CI/CD

- Add lint.yml: TypeScript and ESLint checks
- Add build.yml: Vite application build pipeline
- Add docker-build.yml: Multi-arch container image builds
- Add deploy.yml: Production deployment to Docker Swarm
- Add dependabot.yml: Automated dependency updates

Follows Single Responsibility Principle with focused workflows.
Includes security best practices, caching, and deployment automation.

* fix: Add missing Dockerfile and lint script for CI/CD workflows

- Add Dockerfile for multi-stage Node.js build with production optimizations
- Add lint script to package.json that runs TypeScript type checking
- Enable health check endpoint in Docker container
- Configure proper user permissions and security practices

Fixes docker-build workflow failures and enables complete CI/CD pipeline.

* fix: Enable Corepack for Yarn 4.x compatibility in Docker build

- Enable Corepack in Dockerfile to support packageManager field
- Fix lint script to use TypeScript checking instead of invalid yarn check
- Remove manual yarn installation from Dockerfile since Corepack handles it

* fix: Enable Corepack in CI workflows to resolve Yarn version conflicts

* chore: Update to latest GitHub Actions versions

- Update actions/checkout to v6
- Update actions/setup-node to v6
- Update actions/upload-artifact to v5
- Update Node.js to version 22 (Active LTS)
- Update Docker base images to node:22-alpine

* Fix Corepack/Yarn caching issue in CI workflows

- Remove cache: yarn from setup-node action to prevent yarn usage before corepack enable
- Enable corepack immediately after Node.js setup
- Add manual yarn caching using actions/cache@v4 with proper cache directory path
- This resolves the packageManager field conflict in CI

* Fix BlogEdit.tsx import and component issues

- Fix import path from @/api/blog-api to @/lib/api/blog-api
- Replace TagManager component with simple tag input since BlogEdit uses plain state
- Remove unused handleTagsChange function
- This resolves the build error where blog-api file was not found

* Fix Yarn 4.x deprecated commands in Dockerfile

- Replace --frozen-lockfile with --immutable in builder stage
- Replace --frozen-lockfile --production with --immutable + autoclean in production stage
- This resolves the Yarn 4.9.0 deprecation warnings and build failures

* fix: optimize Dockerfile to use Yarn PnP instead of node-modules

- Use Yarn Plug'n'Play (PnP) for faster installs and smaller image size
- Keep .yarnrc.yml configuration instead of overriding it
- Copy PnP files (.pnp.cjs, .pnp.loader.mjs, .yarn cache) to production stage
- Use yarn workspaces focus --production for production dependencies
- Corepack manages Yarn version while PnP handles dependency resolution

* fix: correct CI/CD workflow issues

- Fix lint.yml to use 'yarn check' instead of 'yarn lint' (ESLint not configured)
- Fix Dockerfile to use 'yarn install --production' for single package repo
- Update workflow name to reflect actual functionality
2025-11-27 06:58:03 +01:00

66 lines
1.7 KiB
YAML

name: Docker Build
on:
push:
branches: [main]
tags: ["v*"]
pull_request:
branches: [main]
jobs:
build-image:
name: Build Docker Image
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
attestations: write
id-token: write
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}-frontend
tags: |
type=ref,event=branch
type=ref,event=pr
type=ref,event=tag
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha,format=long
- name: Build and push
id: push
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
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
- name: Generate artifact attestation
if: github.event_name != 'pull_request'
uses: actions/attest-build-provenance@v3
with:
subject-name: ghcr.io/${{ github.repository }}-frontend
subject-digest: ${{ steps.push.outputs.digest }}
push-to-registry: true