fix(trader): use safe type assertions to prevent panic across all exchanges #379
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PR Docker Build Check | |
| # PR 时只做轻量级构建检查,不推送镜像 | |
| # 策略: 快速验证 amd64 + 抽样检查 arm64 (backend only) | |
| on: | |
| pull_request: | |
| branches: | |
| - main | |
| - dev | |
| paths: | |
| - 'docker/**' | |
| - 'Dockerfile*' | |
| - 'go.mod' | |
| - 'go.sum' | |
| - '**.go' | |
| - 'web/**' | |
| - '.github/workflows/docker-build.yml' | |
| - '.github/workflows/pr-docker-check.yml' | |
| jobs: | |
| # 快速检查: 所有镜像的 amd64 版本 | |
| docker-build-amd64: | |
| name: Build Check (amd64) | |
| runs-on: ubuntu-22.04 | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - name: backend | |
| dockerfile: ./docker/Dockerfile.backend | |
| test_run: true # 需要测试运行 | |
| - name: frontend | |
| dockerfile: ./docker/Dockerfile.frontend | |
| test_run: true | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build ${{ matrix.name }} image (amd64) | |
| id: build | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ${{ matrix.dockerfile }} | |
| platforms: linux/amd64 | |
| push: false | |
| load: true # 加载到本地 Docker,用于测试运行 | |
| tags: nofx-${{ matrix.name }}:pr-test | |
| cache-from: type=gha,scope=${{ matrix.name }}-amd64 | |
| cache-to: type=gha,mode=max,scope=${{ matrix.name }}-amd64 | |
| build-args: | | |
| BUILD_DATE=${{ github.event.pull_request.updated_at }} | |
| VCS_REF=${{ github.event.pull_request.head.sha }} | |
| VERSION=pr-${{ github.event.pull_request.number }} | |
| - name: Test run container (smoke test) | |
| if: matrix.test_run | |
| timeout-minutes: 2 | |
| run: | | |
| echo "🧪 Testing container startup..." | |
| # 启动容器 | |
| docker run -d --name test-${{ matrix.name }} \ | |
| --health-cmd="exit 0" \ | |
| nofx-${{ matrix.name }}:pr-test | |
| # 等待容器启动 (最多 30 秒) | |
| for i in {1..30}; do | |
| if docker ps | grep -q test-${{ matrix.name }}; then | |
| echo "✅ Container started successfully" | |
| docker logs test-${{ matrix.name }} | |
| docker stop test-${{ matrix.name }} || true | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "❌ Container failed to start" | |
| docker logs test-${{ matrix.name }} || true | |
| exit 1 | |
| - name: Check image size | |
| run: | | |
| SIZE=$(docker image inspect nofx-${{ matrix.name }}:pr-test --format='{{.Size}}') | |
| SIZE_MB=$((SIZE / 1024 / 1024)) | |
| echo "📦 Image size: ${SIZE_MB} MB" | |
| # 警告阈值 | |
| if [ "${{ matrix.name }}" = "backend" ] && [ $SIZE_MB -gt 500 ]; then | |
| echo "⚠️ Warning: Backend image is larger than 500MB" | |
| elif [ "${{ matrix.name }}" = "frontend" ] && [ $SIZE_MB -gt 200 ]; then | |
| echo "⚠️ Warning: Frontend image is larger than 200MB" | |
| else | |
| echo "✅ Image size is reasonable" | |
| fi | |
| # ARM64 原生构建检查: 使用 GitHub 原生 ARM64 runner (快速!) | |
| docker-build-arm64-native: | |
| name: Build Check (arm64 native - backend) | |
| runs-on: ubuntu-22.04-arm # 原生 ARM64 runner | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # 原生 ARM64 不需要 QEMU,直接构建 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build backend image (arm64 native) | |
| uses: docker/build-push-action@v5 | |
| timeout-minutes: 15 # 原生构建更快! | |
| with: | |
| context: . | |
| file: ./docker/Dockerfile.backend | |
| platforms: linux/arm64 | |
| push: false | |
| load: true # 加载到本地,用于测试 | |
| tags: nofx-backend:pr-test-arm64 | |
| cache-from: type=gha,scope=backend-arm64 | |
| cache-to: type=gha,mode=max,scope=backend-arm64 | |
| build-args: | | |
| BUILD_DATE=${{ github.event.pull_request.updated_at }} | |
| VCS_REF=${{ github.event.pull_request.head.sha }} | |
| VERSION=pr-${{ github.event.pull_request.number }} | |
| - name: Test run ARM64 container | |
| timeout-minutes: 2 | |
| run: | | |
| echo "🧪 Testing ARM64 container startup..." | |
| # 启动容器 | |
| docker run -d --name test-backend-arm64 \ | |
| --health-cmd="exit 0" \ | |
| nofx-backend:pr-test-arm64 | |
| # 等待启动 | |
| for i in {1..30}; do | |
| if docker ps | grep -q test-backend-arm64; then | |
| echo "✅ ARM64 container started successfully" | |
| docker logs test-backend-arm64 | |
| docker stop test-backend-arm64 || true | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "❌ ARM64 container failed to start" | |
| docker logs test-backend-arm64 || true | |
| exit 1 | |
| - name: ARM64 build summary | |
| run: | | |
| echo "✅ Backend ARM64 native build successful!" | |
| echo "Using GitHub native ARM64 runner - no QEMU needed!" | |
| echo "Build time is ~3x faster than emulation" | |
| # 汇总检查结果 | |
| check-summary: | |
| name: Docker Build Summary | |
| needs: [docker-build-amd64, docker-build-arm64-native] | |
| runs-on: ubuntu-22.04 | |
| if: always() | |
| permissions: | |
| pull-requests: write # 用于发布评论 | |
| steps: | |
| - name: Check build results | |
| id: check | |
| run: | | |
| echo "## 🐳 Docker Build Check Results" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| # 检查 amd64 构建 | |
| if [[ "${{ needs.docker-build-amd64.result }}" == "success" ]]; then | |
| echo "✅ **AMD64 builds**: All passed" >> $GITHUB_STEP_SUMMARY | |
| AMD64_OK=true | |
| else | |
| echo "❌ **AMD64 builds**: Failed" >> $GITHUB_STEP_SUMMARY | |
| AMD64_OK=false | |
| fi | |
| # 检查 arm64 构建 | |
| if [[ "${{ needs.docker-build-arm64-native.result }}" == "success" ]]; then | |
| echo "✅ **ARM64 build** (native): Backend passed (frontend will be verified after merge)" >> $GITHUB_STEP_SUMMARY | |
| ARM64_OK=true | |
| else | |
| echo "❌ **ARM64 build** (native): Backend failed" >> $GITHUB_STEP_SUMMARY | |
| ARM64_OK=false | |
| fi | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| if [ "$AMD64_OK" = true ] && [ "$ARM64_OK" = true ]; then | |
| echo "### 🎉 All checks passed!" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "After merge:" >> $GITHUB_STEP_SUMMARY | |
| echo "- Full multi-arch builds (amd64 + arm64) will run in parallel" >> $GITHUB_STEP_SUMMARY | |
| echo "- Estimated time: 15-20 minutes" >> $GITHUB_STEP_SUMMARY | |
| exit 0 | |
| else | |
| echo "### ❌ Build checks failed" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "Please check the build logs above and fix the errors." >> $GITHUB_STEP_SUMMARY | |
| exit 1 | |
| fi | |
| - name: Comment on PR | |
| if: always() && github.event.pull_request.head.repo.full_name == github.repository | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const amd64Status = '${{ needs.docker-build-amd64.result }}'; | |
| const arm64Status = '${{ needs.docker-build-arm64-native.result }}'; | |
| const successIcon = '✅'; | |
| const failIcon = '❌'; | |
| const comment = [ | |
| '## 🐳 Docker Build Check Results', | |
| '', | |
| `**AMD64 builds**: ${amd64Status === 'success' ? successIcon : failIcon} ${amd64Status}`, | |
| `**ARM64 build** (native runner): ${arm64Status === 'success' ? successIcon : failIcon} ${arm64Status}`, | |
| '', | |
| amd64Status === 'success' && arm64Status === 'success' | |
| ? '### 🎉 All Docker builds passed!\n\n✨ Using GitHub native ARM64 runners - 3x faster than emulation!\n\nAfter merge, full multi-arch builds will run in ~10-12 minutes.' | |
| : '### ⚠️ Some builds failed\n\nPlease check the Actions tab for details.', | |
| '', | |
| '<sub>Checked: Backend (amd64 + arm64 native), Frontend (amd64) | Powered by GitHub ARM64 Runners</sub>' | |
| ].join('\n'); | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: context.payload.pull_request.number, | |
| body: comment | |
| }); |