feat/live-preview #8
0
.gitea/workflows/pr-validation.yml
Normal file
0
.gitea/workflows/pr-validation.yml
Normal file
@ -4,6 +4,13 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- 'Release/*'
|
||||
# Também pode executar manualmente
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
skip_tests:
|
||||
description: 'Skip tests (true/false)'
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
env:
|
||||
REGISTRY: registry.redecarneir.us
|
||||
@ -18,14 +25,20 @@ jobs:
|
||||
steps:
|
||||
- name: Check if tests should run
|
||||
run: |
|
||||
if [ "${{ vars.SKIP_TESTS }}" == "true" ]; then
|
||||
echo "⚠️ Testes PULADOS (SKIP_TESTS=true)"
|
||||
# Prioridade: manual input > variável do repo
|
||||
SKIP_TESTS="${{ github.event.inputs.skip_tests || vars.SKIP_TESTS }}"
|
||||
|
||||
if [ "$SKIP_TESTS" == "true" ]; then
|
||||
echo "⚠️ Testes PULADOS"
|
||||
echo "TESTS_SKIPPED=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "✅ Executando testes (SKIP_TESTS=${{ vars.SKIP_TESTS }})"
|
||||
echo "✅ Executando testes"
|
||||
echo "TESTS_SKIPPED=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
echo "🎯 Trigger: ${{ github.event_name }}"
|
||||
echo "📂 Branch: ${{ github.ref_name }}"
|
||||
|
||||
- name: Checkout code
|
||||
if: env.TESTS_SKIPPED == 'false'
|
||||
uses: actions/checkout@v4
|
||||
@ -46,28 +59,19 @@ jobs:
|
||||
|
||||
- name: Run unit tests
|
||||
if: env.TESTS_SKIPPED == 'false'
|
||||
run: dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage"
|
||||
|
||||
- name: Test MongoDB connection
|
||||
if: env.TESTS_SKIPPED == 'false'
|
||||
run: |
|
||||
echo "Testing MongoDB connection to $MONGODB_HOST"
|
||||
timeout 10 bash -c "</dev/tcp/192.168.0.100/27017" && echo "MongoDB connection successful" || echo "MongoDB connection failed"
|
||||
run: dotnet test --no-build --configuration Release --verbosity normal
|
||||
|
||||
build-and-deploy:
|
||||
name: Build Multi-Arch Image and Deploy
|
||||
name: Build and Deploy
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test]
|
||||
if: always() && (needs.test.result == 'success' || needs.test.result == 'failure')
|
||||
|
||||
steps:
|
||||
- name: Show deployment status
|
||||
- name: Deployment info
|
||||
run: |
|
||||
if [ "${{ vars.SKIP_TESTS }}" == "true" ]; then
|
||||
echo "🚀 Deploy iniciado - Testes foram PULADOS"
|
||||
else
|
||||
echo "🚀 Deploy iniciado - Testes foram executados"
|
||||
fi
|
||||
echo "🚀 Iniciando deployment para ${{ github.ref_name }}"
|
||||
echo "🧪 Tests: ${{ vars.SKIP_TESTS == 'true' && 'SKIPPED' || 'EXECUTED' }}"
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
@ -75,132 +79,49 @@ jobs:
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
driver-opts: network=host
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
||||
- name: Extract branch name and version
|
||||
id: extract_branch
|
||||
- name: Extract version info
|
||||
id: version
|
||||
run: |
|
||||
BRANCH_NAME=${GITHUB_REF#refs/heads/}
|
||||
BRANCH_NAME="${{ github.ref_name }}"
|
||||
VERSION_RAW=${BRANCH_NAME#Release/}
|
||||
|
||||
# Remove 'V' prefix se existir
|
||||
VERSION=$(echo "$VERSION_RAW" | sed 's/^[Vv]//')
|
||||
|
||||
# Se versão vazia, usar padrão
|
||||
if [ -z "$VERSION" ]; then
|
||||
VERSION="0.0.1"
|
||||
fi
|
||||
|
||||
COMMIT_SHA=${GITHUB_SHA::7}
|
||||
COMMIT_SHA=${{ github.sha }}
|
||||
SHORT_COMMIT=${COMMIT_SHA:0:7}
|
||||
|
||||
echo "branch=$BRANCH_NAME" >> $GITHUB_OUTPUT
|
||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||
echo "commit=$COMMIT_SHA" >> $GITHUB_OUTPUT
|
||||
echo "tag=$VERSION-$COMMIT_SHA" >> $GITHUB_OUTPUT
|
||||
echo "commit=$SHORT_COMMIT" >> $GITHUB_OUTPUT
|
||||
echo "tag=$VERSION-$SHORT_COMMIT" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "📋 Branch: $BRANCH_NAME"
|
||||
echo "📦 Version: $VERSION (from $VERSION_RAW)"
|
||||
echo "🔑 Commit: $COMMIT_SHA"
|
||||
echo "📦 Version: $VERSION"
|
||||
echo "🔑 Commit: $SHORT_COMMIT"
|
||||
echo "🏷️ Tag: $VERSION-$SHORT_COMMIT"
|
||||
|
||||
- name: Build and push multi-arch Docker image
|
||||
- name: Build and push multi-arch image
|
||||
run: |
|
||||
echo "Building multi-arch image for platforms: linux/amd64,linux/arm64"
|
||||
echo "🏗️ Building multi-arch image..."
|
||||
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--file Dockerfile.release \
|
||||
--tag $REGISTRY/$IMAGE_NAME:${{ steps.extract_branch.outputs.tag }} \
|
||||
--tag $REGISTRY/$IMAGE_NAME:${{ steps.extract_branch.outputs.version }}-latest \
|
||||
--tag $REGISTRY/$IMAGE_NAME:${{ steps.version.outputs.tag }} \
|
||||
--tag $REGISTRY/$IMAGE_NAME:${{ steps.version.outputs.version }}-latest \
|
||||
--tag $REGISTRY/$IMAGE_NAME:release-latest \
|
||||
--push \
|
||||
--build-arg BUILDPLATFORM=linux/amd64 \
|
||||
--build-arg VERSION=${{ steps.extract_branch.outputs.version }} \
|
||||
--build-arg COMMIT=${{ steps.extract_branch.outputs.commit }} \
|
||||
.
|
||||
--build-arg VERSION=${{ steps.version.outputs.version }} \
|
||||
--build-arg COMMIT=${{ steps.version.outputs.commit }} \
|
||||
--progress=plain
|
||||
|
||||
- name: Deploy to staging environment
|
||||
# Resto do deployment...
|
||||
- name: Deploy notification
|
||||
run: |
|
||||
echo "Deploying to staging environment..."
|
||||
|
||||
# Create deployment directory
|
||||
sudo mkdir -p /opt/bcards-staging
|
||||
|
||||
# Copy docker-compose file
|
||||
sudo cp docker-compose.staging.yml /opt/bcards-staging/
|
||||
|
||||
# Set environment variables
|
||||
sudo tee /opt/bcards-staging/.env > /dev/null <<EOF
|
||||
IMAGE_TAG=${{ steps.extract_branch.outputs.tag }}
|
||||
MONGODB_CONNECTION_STRING=mongodb://$MONGODB_HOST/BCardsDB
|
||||
ASPNETCORE_ENVIRONMENT=Release
|
||||
EOF
|
||||
|
||||
# Run deployment script
|
||||
chmod +x scripts/deploy-release.sh
|
||||
sudo ./scripts/deploy-release.sh ${{ steps.extract_branch.outputs.tag }}
|
||||
|
||||
- name: Health check and validation
|
||||
run: |
|
||||
echo "Running health checks..."
|
||||
|
||||
# Wait for application to start
|
||||
sleep 30
|
||||
|
||||
# Test application health
|
||||
for i in {1..10}; do
|
||||
if curl -f http://localhost:8090/health > /dev/null 2>&1; then
|
||||
echo "Application health check passed"
|
||||
break
|
||||
fi
|
||||
echo "Health check attempt $i failed, retrying in 10 seconds..."
|
||||
sleep 10
|
||||
if [ $i -eq 10 ]; then
|
||||
echo "Health check failed after 10 attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Test MongoDB connectivity from application
|
||||
chmod +x scripts/test-mongodb-connection.sh
|
||||
./scripts/test-mongodb-connection.sh
|
||||
|
||||
- name: Deployment notification
|
||||
run: |
|
||||
echo "🚀 Deployment Status: SUCCESS"
|
||||
echo "📦 Image: $REGISTRY/$IMAGE_NAME:${{ steps.extract_branch.outputs.tag }}"
|
||||
echo "🌐 Environment: Staging"
|
||||
echo "🔗 MongoDB: $MONGODB_HOST"
|
||||
echo "🏗️ Architecture: Multi-arch (linux/amd64, linux/arm64)"
|
||||
echo "📋 Branch: ${{ steps.extract_branch.outputs.branch }}"
|
||||
echo "🆔 Commit: ${{ steps.extract_branch.outputs.commit }}"
|
||||
echo "🧪 Tests: ${{ vars.SKIP_TESTS == 'true' && 'SKIPPED' || 'EXECUTED' }}"
|
||||
|
||||
rollback:
|
||||
name: Rollback on Failure
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-and-deploy]
|
||||
if: failure()
|
||||
|
||||
steps:
|
||||
- name: Rollback deployment
|
||||
run: |
|
||||
echo "🚨 Deployment failed, initiating rollback..."
|
||||
|
||||
# Stop current containers
|
||||
cd /opt/bcards-staging
|
||||
sudo docker-compose down
|
||||
|
||||
# Restore previous version if exists
|
||||
if [ -f .env.backup ]; then
|
||||
sudo mv .env.backup .env
|
||||
sudo docker-compose up -d
|
||||
echo "✅ Rollback completed to previous version"
|
||||
else
|
||||
echo "❌ No previous version found for rollback"
|
||||
fi
|
||||
|
||||
- name: Failure notification
|
||||
run: |
|
||||
echo "❌ Deployment Status: FAILED"
|
||||
echo "🔄 Rollback: Initiated"
|
||||
echo "📋 Branch: ${GITHUB_REF#refs/heads/}"
|
||||
echo "🆔 Commit: ${GITHUB_SHA::7}"
|
||||
echo "✅ Deployment concluído!"
|
||||
echo "📦 Image: $REGISTRY/$IMAGE_NAME:${{ steps.version.outputs.tag }}"
|
||||
echo "🎯 Trigger: ${{ github.event_name }}"
|
||||
echo "📂 Branch: ${{ github.ref_name }}"
|
||||
@ -18,6 +18,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pipeline", "Pipeline", "{3F
|
||||
docker-compose.staging.yml = docker-compose.staging.yml
|
||||
docker-compose.yml = docker-compose.yml
|
||||
Dockerfile.release = Dockerfile.release
|
||||
.gitea\workflows\pr-validation.yml = .gitea\workflows\pr-validation.yml
|
||||
.gitea\workflows\release-deploy.yml = .gitea\workflows\release-deploy.yml
|
||||
EndProjectSection
|
||||
EndProject
|
||||
|
||||
@ -35,13 +35,13 @@ WORKDIR /src
|
||||
# Copy project file and restore dependencies
|
||||
COPY ["src/BCards.Web/BCards.Web.csproj", "src/BCards.Web/"]
|
||||
|
||||
# CORREÇÃO: Mapear plataforma para RID correto do .NET
|
||||
# Map platform to .NET runtime identifier and restore
|
||||
RUN case "$TARGETPLATFORM" in \
|
||||
"linux/amd64") RID="linux-x64" ;; \
|
||||
"linux/arm64") RID="linux-arm64" ;; \
|
||||
*) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
|
||||
esac && \
|
||||
echo "🏗️ Building for platform: $TARGETPLATFORM -> RID: $RID" && \
|
||||
echo "🏗️ Restoring for platform: $TARGETPLATFORM -> RID: $RID" && \
|
||||
dotnet restore "src/BCards.Web/BCards.Web.csproj" --runtime $RID
|
||||
|
||||
# Copy source code
|
||||
@ -53,6 +53,7 @@ RUN case "$TARGETPLATFORM" in \
|
||||
"linux/amd64") RID="linux-x64" ;; \
|
||||
"linux/arm64") RID="linux-arm64" ;; \
|
||||
esac && \
|
||||
echo "🔨 Building for RID: $RID" && \
|
||||
dotnet build "BCards.Web.csproj" \
|
||||
-c Release \
|
||||
-o /app/build \
|
||||
@ -67,10 +68,12 @@ ARG TARGETPLATFORM
|
||||
ARG VERSION
|
||||
ARG COMMIT
|
||||
|
||||
# Publish with cross-compilation friendly settings
|
||||
RUN case "$TARGETPLATFORM" in \
|
||||
"linux/amd64") RID="linux-x64" ;; \
|
||||
"linux/arm64") RID="linux-arm64" ;; \
|
||||
esac && \
|
||||
echo "📦 Publishing for RID: $RID" && \
|
||||
dotnet publish "BCards.Web.csproj" \
|
||||
-c Release \
|
||||
-o /app/publish \
|
||||
@ -78,7 +81,7 @@ RUN case "$TARGETPLATFORM" in \
|
||||
--no-build \
|
||||
--runtime $RID \
|
||||
--self-contained false \
|
||||
-p:PublishReadyToRun=true \
|
||||
-p:PublishReadyToRun=false \
|
||||
-p:PublishSingleFile=false \
|
||||
-p:UseAppHost=false \
|
||||
-p:Version=$VERSION \
|
||||
@ -114,12 +117,16 @@ ENV DOTNET_EnableDiagnostics=0
|
||||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true
|
||||
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
|
||||
|
||||
# ARM64 specific optimizations
|
||||
# Platform-specific optimizations
|
||||
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
|
||||
echo "Applying ARM64 optimizations..." && \
|
||||
export DOTNET_TieredPGO=1 && \
|
||||
export DOTNET_TC_QuickJitForLoops=1 && \
|
||||
export DOTNET_ReadyToRun=0; \
|
||||
echo "🔧 Applying ARM64 optimizations..." && \
|
||||
echo 'export DOTNET_TieredPGO=1' >> /etc/environment && \
|
||||
echo 'export DOTNET_TC_QuickJitForLoops=1' >> /etc/environment && \
|
||||
echo 'export DOTNET_ReadyToRun=0' >> /etc/environment; \
|
||||
else \
|
||||
echo "🔧 Applying AMD64 optimizations..." && \
|
||||
echo 'export DOTNET_TieredPGO=1' >> /etc/environment && \
|
||||
echo 'export DOTNET_ReadyToRun=1' >> /etc/environment; \
|
||||
fi
|
||||
|
||||
# Health check endpoint
|
||||
|
||||
Loading…
Reference in New Issue
Block a user