Compare commits

..

No commits in common. "c132578e097aa681a9bf76eb645ba039d6967d79" and "8cc43cbde15f16e551233348501e021cee2ca6a6" have entirely different histories.

2 changed files with 37 additions and 81 deletions

View File

@ -1,78 +1,42 @@
# 复制到 itfx: .github/workflows/deploy.yml name: CI/CD Pipeline
#
# Secrets: SSH_K3S_HOST / SSH_K3S_USERNAME / SSH_K3S_PASSWORD
# 集群:
# GIT_TOKEN=... TCR_USERNAME=... TCR_PASSWORD=... ./scripts/16-setup-kaniko.sh
# ./scripts/17-test-github-access.sh # 选 GIT_FETCH_MODE / KANIKO_NODE_ROLE
#
# 构建全程在集群 Pod 内完成git + kanikoActions 只 SSH 触发并跟日志
#
name: Build and Deploy
on: on:
push: push:
branches: [master] branches:
workflow_dispatch: - master # 监视的分支
env:
GIT_URL: https://github.com/xiaoliutral/itfx.git
DOCKERFILE: src/InterfaceForward.Api/Dockerfile
IMAGE_NAME: interfaceforward_api
DEPLOY_NAME: interfaceforward-api
CONTAINER_NAME: interfaceforward-api
TCR_REGISTRY: ccr.ccs.tencentyun.com
TCR_NAMESPACE: ideship
K3S_DIR: /data/k3s
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
NAMESPACE: prod
jobs: jobs:
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Show image - name: Checkout code
id: info uses: actions/checkout@v2
run: |
TAG="${{ github.sha }}"
IMG="${{ env.TCR_REGISTRY }}/${{ env.TCR_NAMESPACE }}/${{ env.IMAGE_NAME }}:${TAG}"
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "image=${IMG}" >> "$GITHUB_OUTPUT"
echo "Will build: ${IMG}"
- name: Build image (Kaniko logs) - name: Build to Server
uses: appleboy/ssh-action@v1.2.0 uses: appleboy/ssh-action@v0.1.5
with: with:
host: ${{ secrets.SSH_K3S_HOST }} host: ${{ secrets.SSH_BUILD_HOST }}
username: ${{ secrets.SSH_K3S_USERNAME }} username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_K3S_PASSWORD }} password: ${{ secrets.SSH_PASSWORD }}
command_timeout: 50m
request_pty: true
script_stop: true
script: | script: |
set -euxo pipefail mkdir -p /data/projects
export KUBECONFIG=${{ env.KUBECONFIG }} cd /data/projects
cd ${{ env.K3S_DIR }} git clone git@github.com:xiaoliutral/itfx.git
chmod +x scripts/ci-kaniko-build.sh cd itfx
./scripts/ci-kaniko-build.sh \ git pull origin master
"${{ env.GIT_URL }}" \ docker build -t interfaceforward_api:latest -f src/InterfaceForward.Api/Dockerfile .
"${{ env.DOCKERFILE }}" \ # 标记镜像
"${{ env.IMAGE_NAME }}" \ docker tag interfaceforward_api:latest registry.nanafa.com/interfaceforward_api:latest
"${{ steps.info.outputs.tag }}" \ # 推送镜像
"${{ steps.info.outputs.tag }}" docker push registry.nanafa.com/interfaceforward_api:latest
- name: Deploy to Server
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.SSH_MANAGER_HOST }}
username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_PASSWORD }}
script: |
cd /data
docker stack deploy -c api.yml api # yml没变化不会更新
docker service update --force --image registry.nanafa.com/interfaceforward_api:latest api_itfx # 一定要和service name一致
- name: Deploy
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.SSH_K3S_HOST }}
username: ${{ secrets.SSH_K3S_USERNAME }}
password: ${{ secrets.SSH_K3S_PASSWORD }}
command_timeout: 5m
script_stop: true
script: |
set -euxo pipefail
export KUBECONFIG=${{ env.KUBECONFIG }}
IMG="${{ steps.info.outputs.image }}"
kubectl -n ${{ env.NAMESPACE }} set image deploy/${{ env.DEPLOY_NAME }} \
${{ env.CONTAINER_NAME }}=${IMG}
kubectl -n ${{ env.NAMESPACE }} rollout status deploy/${{ env.DEPLOY_NAME }} --timeout=180s
kubectl -n ${{ env.NAMESPACE }} get pods -l app=${{ env.DEPLOY_NAME }} -o wide

View File

@ -1,24 +1,16 @@
# ===== 阶段1: 基础依赖层(可缓存) ===== FROM mcr.microsoft.com/dotnet/sdk:8.0.421 AS base
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# ✅ 关键优化:只复制 .csproj 文件,让 restore 层可以缓存
COPY ["src/InterfaceForward.Api/InterfaceForward.Api.csproj", "src/InterfaceForward.Api/"]
RUN dotnet restore "src/InterfaceForward.Api/InterfaceForward.Api.csproj"
# ===== 阶段2: 构建层 =====
# ✅ 现在才复制所有代码(这一层变动频繁,但 restore 已经跑完了)
COPY . .
WORKDIR "/src/src/InterfaceForward.Api"
ARG BUILD_CONFIGURATION=Release ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY . /src
RUN dotnet restore "src/InterfaceForward.Api/InterfaceForward.Api.csproj"
WORKDIR "/src/src/InterfaceForward.Api"
RUN dotnet build "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build RUN dotnet build "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
# ===== 阶段3: 发布层 ===== FROM base AS publish
FROM build AS publish
ARG BUILD_CONFIGURATION=Release ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false RUN dotnet publish "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# ===== 阶段4: 最终运行时(轻量级) ===== # 使用运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app WORKDIR /app
COPY --from=publish /app/publish . COPY --from=publish /app/publish .