mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 17:13:38 +08:00
feat: 添加构建和部署环境配置的 GitHub Action,包括 Docker 和 kubectl 的安装与配置,支持阿里云镜像源,提供详细的日志输出和错误处理。
This commit is contained in:
30
setup-env/examples/basic-workflow.yml
Normal file
30
setup-env/examples/basic-workflow.yml
Normal file
@@ -0,0 +1,30 @@
|
||||
# 基本使用示例
|
||||
name: Basic Build and Deploy
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置构建环境
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: 构建应用
|
||||
run: |
|
||||
echo "开始构建应用..."
|
||||
docker build -t my-app:${{ github.sha }} .
|
||||
echo "构建完成!"
|
||||
|
||||
- name: 推送镜像
|
||||
run: |
|
||||
docker push my-app:${{ github.sha }}
|
||||
echo "镜像推送完成!"
|
107
setup-env/examples/full-deployment.yml
Normal file
107
setup-env/examples/full-deployment.yml
Normal file
@@ -0,0 +1,107 @@
|
||||
# 完整部署示例
|
||||
name: Full Build and Deploy Pipeline
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
environment:
|
||||
description: '部署环境'
|
||||
required: true
|
||||
default: 'dev'
|
||||
type: choice
|
||||
options:
|
||||
- dev
|
||||
- staging
|
||||
- prod
|
||||
|
||||
env:
|
||||
REGISTRY: docker-registry.bjxgj.com
|
||||
IMAGE_NAME: my-application
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
image-tag: ${{ steps.meta.outputs.tags }}
|
||||
cache-hit: ${{ steps.setup.outputs.cache-hit }}
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置构建环境
|
||||
id: setup
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-registry: ${{ env.REGISTRY }}
|
||||
docker-username: ci-action
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
cache-key: 'build-${{ github.sha }}'
|
||||
use-aliyun-mirror: 'true'
|
||||
|
||||
- name: 生成镜像元数据
|
||||
id: meta
|
||||
run: |
|
||||
IMAGE_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}"
|
||||
echo "tags=$IMAGE_TAG" >> $GITHUB_OUTPUT
|
||||
echo "Generated image tag: $IMAGE_TAG"
|
||||
|
||||
- name: 构建 Docker 镜像
|
||||
run: |
|
||||
docker build \
|
||||
--tag ${{ steps.meta.outputs.tags }} \
|
||||
--label "org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" \
|
||||
--label "org.opencontainers.image.revision=${{ github.sha }}" \
|
||||
--label "org.opencontainers.image.created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
|
||||
.
|
||||
|
||||
- name: 推送镜像
|
||||
run: |
|
||||
docker push ${{ steps.meta.outputs.tags }}
|
||||
|
||||
- name: 构建摘要
|
||||
run: |
|
||||
echo "## 🐳 构建信息" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **镜像**: ${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **缓存命中**: ${{ steps.setup.outputs.cache-hit }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Docker 版本**: ${{ steps.setup.outputs.docker-version }}" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
environment: ${{ inputs.environment }}
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置部署环境
|
||||
id: setup
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
kube-config: ${{ secrets[format('KUBE_CONFIG_{0}', inputs.environment)] }}
|
||||
cache-key: 'deploy-${{ inputs.environment }}'
|
||||
|
||||
- name: 部署到 Kubernetes
|
||||
run: |
|
||||
# 替换镜像标签
|
||||
sed -i "s|{{IMAGE_TAG}}|${{ needs.build.outputs.image-tag }}|g" k8s/deployment.yaml
|
||||
|
||||
# 应用配置
|
||||
kubectl apply -f k8s/ -n ${{ inputs.environment }}
|
||||
|
||||
# 等待部署完成
|
||||
kubectl rollout status deployment/my-application -n ${{ inputs.environment }} --timeout=300s
|
||||
|
||||
- name: 验证部署
|
||||
run: |
|
||||
# 检查 Pod 状态
|
||||
kubectl get pods -n ${{ inputs.environment }} -l app=my-application
|
||||
|
||||
# 检查服务状态
|
||||
kubectl get svc -n ${{ inputs.environment }} -l app=my-application
|
||||
|
||||
- name: 部署摘要
|
||||
run: |
|
||||
echo "## ☸️ 部署信息" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **环境**: ${{ inputs.environment }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **镜像**: ${{ needs.build.outputs.image-tag }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **kubectl 版本**: ${{ steps.setup.outputs.kubectl-version }}" >> $GITHUB_STEP_SUMMARY
|
110
setup-env/examples/multi-environment.yml
Normal file
110
setup-env/examples/multi-environment.yml
Normal file
@@ -0,0 +1,110 @@
|
||||
# 多环境部署示例
|
||||
name: Multi-Environment Deploy
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
tags: [ 'v*' ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
image-tag: ${{ steps.meta.outputs.tags }}
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置构建环境
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
cache-key: 'multi-env-build'
|
||||
|
||||
- name: 生成镜像标签
|
||||
id: meta
|
||||
run: |
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/}
|
||||
else
|
||||
VERSION=${GITHUB_SHA::7}
|
||||
fi
|
||||
IMAGE_TAG="docker-registry.bjxgj.com/my-app:$VERSION"
|
||||
echo "tags=$IMAGE_TAG" >> $GITHUB_OUTPUT
|
||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: 构建并推送
|
||||
run: |
|
||||
docker build -t ${{ steps.meta.outputs.tags }} .
|
||||
docker push ${{ steps.meta.outputs.tags }}
|
||||
|
||||
deploy-dev:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref == 'refs/heads/main'
|
||||
environment: development
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置开发环境
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
kube-config: ${{ secrets.KUBE_CONFIG_DEV }}
|
||||
cache-key: 'deploy-dev'
|
||||
|
||||
- name: 部署到开发环境
|
||||
run: |
|
||||
sed -i "s|{{IMAGE_TAG}}|${{ needs.build.outputs.image-tag }}|g" k8s/dev/deployment.yaml
|
||||
kubectl apply -f k8s/dev/ -n development
|
||||
kubectl rollout status deployment/my-app -n development
|
||||
|
||||
deploy-staging:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
environment: staging
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置预发布环境
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
kube-config: ${{ secrets.KUBE_CONFIG_STAGING }}
|
||||
cache-key: 'deploy-staging'
|
||||
|
||||
- name: 部署到预发布环境
|
||||
run: |
|
||||
sed -i "s|{{IMAGE_TAG}}|${{ needs.build.outputs.image-tag }}|g" k8s/staging/deployment.yaml
|
||||
kubectl apply -f k8s/staging/ -n staging
|
||||
kubectl rollout status deployment/my-app -n staging
|
||||
|
||||
deploy-production:
|
||||
needs: [build, deploy-staging]
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
environment: production
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置生产环境
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
kube-config: ${{ secrets.KUBE_CONFIG_PROD }}
|
||||
cache-key: 'deploy-production'
|
||||
use-aliyun-mirror: 'false' # 生产环境使用官方源
|
||||
|
||||
- name: 部署到生产环境
|
||||
run: |
|
||||
sed -i "s|{{IMAGE_TAG}}|${{ needs.build.outputs.image-tag }}|g" k8s/prod/deployment.yaml
|
||||
kubectl apply -f k8s/prod/ -n production
|
||||
kubectl rollout status deployment/my-app -n production
|
||||
|
||||
- name: 健康检查
|
||||
run: |
|
||||
kubectl get pods -n production -l app=my-app
|
||||
# 可以添加更多健康检查逻辑
|
132
setup-env/examples/troubleshooting.yml
Normal file
132
setup-env/examples/troubleshooting.yml
Normal file
@@ -0,0 +1,132 @@
|
||||
# 故障排除和调试示例
|
||||
name: Troubleshooting Example
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
debug_mode:
|
||||
description: '启用调试模式'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
debug-setup:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 配置环境(调试模式)
|
||||
id: setup
|
||||
uses: xgj/actions/setup-env@v1
|
||||
with:
|
||||
docker-password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
kube-config: ${{ secrets.KUBE_CONFIG }}
|
||||
cache-key: 'debug-env'
|
||||
env:
|
||||
# 启用详细日志
|
||||
ACTIONS_STEP_DEBUG: ${{ inputs.debug_mode }}
|
||||
ACTIONS_RUNNER_DEBUG: ${{ inputs.debug_mode }}
|
||||
|
||||
- name: 环境信息检查
|
||||
run: |
|
||||
echo "=== 系统信息 ==="
|
||||
uname -a
|
||||
cat /etc/os-release
|
||||
|
||||
echo -e "\n=== 已安装工具版本 ==="
|
||||
echo "Docker: ${{ steps.setup.outputs.docker-version }}"
|
||||
echo "kubectl: ${{ steps.setup.outputs.kubectl-version }}"
|
||||
echo "Git: $(git --version)"
|
||||
|
||||
echo -e "\n=== 缓存状态 ==="
|
||||
echo "Cache Hit: ${{ steps.setup.outputs.cache-hit }}"
|
||||
|
||||
echo -e "\n=== Docker 状态 ==="
|
||||
docker version || echo "Docker 命令失败"
|
||||
docker info || echo "Docker info 失败"
|
||||
|
||||
echo -e "\n=== kubectl 状态 ==="
|
||||
kubectl version --client || echo "kubectl 客户端版本获取失败"
|
||||
kubectl config current-context || echo "kubectl 上下文获取失败"
|
||||
|
||||
- name: 网络连接测试
|
||||
run: |
|
||||
echo "=== 网络连接测试 ==="
|
||||
|
||||
# 测试 Docker 仓库连接
|
||||
echo "测试 Docker 仓库连接..."
|
||||
curl -I https://docker-registry.bjxgj.com/v2/ || echo "Docker 仓库连接失败"
|
||||
|
||||
# 测试 Kubernetes API
|
||||
if [[ -n "${{ secrets.KUBE_CONFIG }}" ]]; then
|
||||
echo "测试 Kubernetes API 连接..."
|
||||
kubectl cluster-info --request-timeout=10s || echo "Kubernetes API 连接失败"
|
||||
fi
|
||||
|
||||
# 测试外部网络
|
||||
echo "测试外部网络连接..."
|
||||
curl -I https://github.com || echo "GitHub 连接失败"
|
||||
curl -I https://mirrors.aliyun.com || echo "阿里云镜像连接失败"
|
||||
|
||||
- name: 权限检查
|
||||
run: |
|
||||
echo "=== 权限检查 ==="
|
||||
|
||||
# 检查文件权限
|
||||
ls -la ~/.kube/ || echo "kubectl 配置目录不存在"
|
||||
ls -la ~/.docker/ || echo "Docker 配置目录不存在"
|
||||
|
||||
# 检查用户权限
|
||||
id
|
||||
groups
|
||||
|
||||
# 检查 sudo 权限
|
||||
sudo -n true && echo "具有 sudo 权限" || echo "无 sudo 权限"
|
||||
|
||||
- name: 清理和重试(失败时)
|
||||
if: failure()
|
||||
run: |
|
||||
echo "=== 清理环境 ==="
|
||||
|
||||
# 清理 Docker 配置
|
||||
rm -rf ~/.docker/config.json || true
|
||||
|
||||
# 清理 kubectl 配置
|
||||
rm -rf ~/.kube/config || true
|
||||
|
||||
# 清理缓存
|
||||
rm -rf /tmp/setup-env-* || true
|
||||
|
||||
echo "环境已清理,建议重新运行"
|
||||
|
||||
- name: 收集日志
|
||||
if: always()
|
||||
run: |
|
||||
echo "=== 收集系统日志 ==="
|
||||
|
||||
# 收集系统日志
|
||||
sudo dmesg | tail -50 || echo "无法获取系统日志"
|
||||
|
||||
# 收集 Docker 日志
|
||||
sudo journalctl -u docker --no-pager --lines=20 || echo "无法获取 Docker 日志"
|
||||
|
||||
# 收集网络信息
|
||||
ip addr show || echo "无法获取网络信息"
|
||||
ss -tuln || echo "无法获取端口信息"
|
||||
|
||||
- name: 生成故障报告
|
||||
if: failure()
|
||||
run: |
|
||||
echo "## 🚨 故障报告" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### 环境信息" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **运行器**: ${{ runner.os }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **缓存命中**: ${{ steps.setup.outputs.cache-hit }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Docker 版本**: ${{ steps.setup.outputs.docker-version }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **kubectl 版本**: ${{ steps.setup.outputs.kubectl-version }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### 建议解决方案" >> $GITHUB_STEP_SUMMARY
|
||||
echo "1. 检查网络连接" >> $GITHUB_STEP_SUMMARY
|
||||
echo "2. 验证 secrets 配置" >> $GITHUB_STEP_SUMMARY
|
||||
echo "3. 清除缓存重试" >> $GITHUB_STEP_SUMMARY
|
||||
echo "4. 联系运维团队" >> $GITHUB_STEP_SUMMARY
|
Reference in New Issue
Block a user