feat: add Dockerfile and upgrade Jenkinsfile to full CI/CD
- Multi-stage .NET 10 Dockerfile (build + runtime) - Jenkinsfile: Docker build → push to registry → deploy with docker-compose
This commit is contained in:
parent
ac61ace37f
commit
855a7b6880
6
.dockerignore
Normal file
6
.dockerignore
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
*.user
|
||||||
|
*.suo
|
||||||
|
.vs/
|
||||||
|
.idea/
|
||||||
20
Dockerfile
Normal file
20
Dockerfile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
COPY ["Directory.Build.props", "."]
|
||||||
|
COPY ["src/RAG.Api/RAG.Api.csproj", "src/RAG.Api/"]
|
||||||
|
COPY ["src/RAG.Application/RAG.Application.csproj", "src/RAG.Application/"]
|
||||||
|
COPY ["src/RAG.Infrastructure/RAG.Infrastructure.csproj", "src/RAG.Infrastructure/"]
|
||||||
|
COPY ["src/RAG.Domain/RAG.Domain.csproj", "src/RAG.Domain/"]
|
||||||
|
RUN dotnet restore "src/RAG.Api/RAG.Api.csproj"
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN dotnet publish "src/RAG.Api/RAG.Api.csproj" -c Release -o /app/publish --no-restore
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=build /app/publish .
|
||||||
|
|
||||||
|
EXPOSE 5211 50051
|
||||||
|
|
||||||
|
ENTRYPOINT ["dotnet", "RAG.Api.dll"]
|
||||||
84
Jenkinsfile
vendored
84
Jenkinsfile
vendored
@ -2,47 +2,85 @@ pipeline {
|
|||||||
agent any
|
agent any
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT = '1'
|
CI_REGISTRY = '192.168.1.154:31010'
|
||||||
DOTNET_ROOT = '/var/jenkins_home/.dotnet'
|
DOCKER_IMAGE = 'docker/rag-backend'
|
||||||
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = '1'
|
DOCKER_TAG = "${BUILD_NUMBER}"
|
||||||
PATH = "${env.DOTNET_ROOT}:${env.PATH}"
|
DEPLOY_DIR = '/home/xiangning/deploy/rag-backend'
|
||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
stage('Setup .NET') {
|
|
||||||
steps {
|
|
||||||
sh '''
|
|
||||||
if [ ! -f "$DOTNET_ROOT/dotnet" ]; then
|
|
||||||
echo "=== Installing .NET 10 SDK ==="
|
|
||||||
mkdir -p $DOTNET_ROOT
|
|
||||||
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 10.0 --install-dir $DOTNET_ROOT
|
|
||||||
fi
|
|
||||||
dotnet --version
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Restore') {
|
stage('Checkout') {
|
||||||
steps {
|
steps {
|
||||||
echo '=== Restore NuGet Packages ==='
|
echo '=== Checkout ==='
|
||||||
sh 'dotnet restore'
|
checkout scm
|
||||||
|
sh 'git log --oneline -5'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Build') {
|
stage('Build') {
|
||||||
steps {
|
steps {
|
||||||
echo '=== Build Solution ==='
|
echo '=== Build Docker Image ==='
|
||||||
sh 'dotnet build --no-restore'
|
sh """
|
||||||
|
echo "Registry: ${CI_REGISTRY}"
|
||||||
|
echo "Image: ${DOCKER_IMAGE}:${DOCKER_TAG}"
|
||||||
|
docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} .
|
||||||
|
docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Push') {
|
||||||
|
steps {
|
||||||
|
echo '=== Push to Registry ==='
|
||||||
|
sh """
|
||||||
|
echo 'dockerxn001624.' | docker login -u docker --password-stdin ${CI_REGISTRY}
|
||||||
|
docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${CI_REGISTRY}/${DOCKER_IMAGE}:${DOCKER_TAG}
|
||||||
|
docker tag ${DOCKER_IMAGE}:latest ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
|
||||||
|
docker push ${CI_REGISTRY}/${DOCKER_IMAGE}:${DOCKER_TAG}
|
||||||
|
docker push ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy') {
|
||||||
|
steps {
|
||||||
|
echo '=== Deploy ==='
|
||||||
|
sh """
|
||||||
|
mkdir -p ${DEPLOY_DIR}
|
||||||
|
cd ${DEPLOY_DIR}
|
||||||
|
cat > docker-compose.yml << 'DCOF'
|
||||||
|
services:
|
||||||
|
rag-backend:
|
||||||
|
image: ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
|
||||||
|
container_name: rag-backend
|
||||||
|
ports:
|
||||||
|
- "5211:5211"
|
||||||
|
- "50051:50051"
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
- Kestrel__Endpoints__Http__Url=http://+:5211
|
||||||
|
- Kestrel__Endpoints__Grpc__Url=http://+:50051
|
||||||
|
volumes:
|
||||||
|
- ./logs:/app/logs
|
||||||
|
DCOF
|
||||||
|
docker compose pull
|
||||||
|
docker compose down --remove-orphans || true
|
||||||
|
docker compose up -d
|
||||||
|
docker image prune -f
|
||||||
|
docker compose ps
|
||||||
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
post {
|
post {
|
||||||
success {
|
success {
|
||||||
echo 'Build succeeded!'
|
echo '=== CI/CD SUCCESS ==='
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
echo 'Build failed!'
|
echo '=== CI/CD FAILED ==='
|
||||||
}
|
}
|
||||||
always {
|
always {
|
||||||
deleteDir()
|
deleteDir()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user