|
31 | 31 | checks: write |
32 | 32 |
|
33 | 33 | steps: |
| 34 | + - name: Free Disk Space (Ubuntu) |
| 35 | + uses: jlumbroso/free-disk-space@main |
| 36 | + with: |
| 37 | + tool-cache: true |
| 38 | + android: true |
| 39 | + dotnet: true |
| 40 | + haskell: true |
| 41 | + large-packages: true |
| 42 | + docker-images: true |
| 43 | + swap-storage: true |
| 44 | + |
34 | 45 | - name: Checkout |
35 | 46 | uses: actions/checkout@v4 |
| 47 | + with: |
| 48 | + lfs: true # 必须开启 LFS 以便检出 CPLEX 安装包 |
36 | 49 |
|
37 | 50 | - name: Install Nix 2.31.1 |
38 | 51 | run: | |
|
43 | 56 | # 验证安装 |
44 | 57 | nix --version |
45 | 58 |
|
| 59 | + - name: Magic Nix Cache |
| 60 | + uses: DeterminateSystems/magic-nix-cache-action@main |
| 61 | + |
46 | 62 | - name: Configure Nix |
47 | 63 | run: | |
48 | 64 | # 加载 Nix 环境 |
@@ -420,28 +436,32 @@ jobs: |
420 | 436 | exit 1 |
421 | 437 | fi |
422 | 438 | |
423 | | - # 测试Python和UV(使用临时文件系统挂载) |
| 439 | + # 测试Python和UV (不使用 --user root,验证权限修复是否成功) |
424 | 440 | echo "Testing Python:" |
425 | | - docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "export PATH=\${PATH} && python --version" || echo "Python not found" |
| 441 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python --version" || echo "Python not found" |
426 | 442 | |
427 | 443 | echo "Testing UV:" |
428 | | - docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "export PATH=\${PATH} && uv --version" || echo "UV not found" |
| 444 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "uv --version" || echo "UV not found" |
429 | 445 | |
430 | 446 | # 测试安全限制 |
431 | 447 | echo "Testing security restrictions:" |
432 | | - docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"try: import os; print('ERROR: os should be restricted'); exit(1); except ImportError: print('OK: os is restricted')\"" || echo "Security test failed" |
| 448 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"try: import os; print('ERROR: os should be restricted'); exit(1); except ImportError: print('OK: os is restricted')\"" || echo "Security test failed" |
433 | 449 | |
434 | 450 | # 测试Gurobi可用性 |
435 | 451 | echo "Testing Gurobi availability:" |
436 | | - docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"import gurobipy; print('OK: Gurobi available')\"" || echo "Gurobi test failed" |
| 452 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"import gurobipy; print('OK: Gurobi available')\"" || echo "Gurobi test failed" |
437 | 453 | |
438 | 454 | # 测试OR-Tools可用性 |
439 | 455 | echo "Testing OR-Tools availability:" |
440 | | - docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"import ortools; from ortools.linear_solver import pywraplp; print('OK: OR-Tools available')\"" || echo "OR-Tools test failed" |
| 456 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "python -c \"import ortools; from ortools.linear_solver import pywraplp; print('OK: OR-Tools available')\"" || echo "OR-Tools test failed" |
| 457 | + |
| 458 | + # 测试CPLEX可用性 |
| 459 | + echo "Testing CPLEX availability:" |
| 460 | + docker run --rm --tmpfs /tmp:noexec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /verify-cplex.sh || echo "CPLEX test failed" |
441 | 461 | |
442 | 462 | # 测试PuLP可用性 |
443 | 463 | echo "Testing PuLP availability:" |
444 | | - docker run --rm --tmpfs /tmp:exec,nosuid,size=100m --user root ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "cd /tmp && python -c \"import pulp; prob = pulp.LpProblem('test', pulp.LpMaximize); x = pulp.LpVariable('x', 0, 10); prob += x; prob.solve(pulp.PULP_CBC_CMD(msg=0)); print('OK: PuLP and CBC solver available')\"" || echo "PuLP test failed" |
| 464 | + docker run --rm --tmpfs /tmp:exec,nosuid,size=100m ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest /bin/bash -c "cd /tmp && python -c \"import pulp; prob = pulp.LpProblem('test', pulp.LpMaximize); x = pulp.LpVariable('x', 0, 10); prob += x; prob.solve(pulp.PULP_CBC_CMD(msg=0)); print('OK: PuLP and CBC solver available')\"" || echo "PuLP test failed" |
445 | 465 | |
446 | 466 | # 测试科学计算包 |
447 | 467 | echo "Testing scientific packages:" |
@@ -471,7 +491,7 @@ jobs: |
471 | 491 | echo "**Features:**" >> $GITHUB_STEP_SUMMARY |
472 | 492 | echo "- ✅ Secure Python 3.12 environment" >> $GITHUB_STEP_SUMMARY |
473 | 493 | echo "- ✅ UV package manager" >> $GITHUB_STEP_SUMMARY |
474 | | - echo "- ✅ Optimization solvers: Gurobi, OR-Tools, PuLP" >> $GITHUB_STEP_SUMMARY |
| 494 | + echo "- ✅ Optimization solvers: Gurobi, CPLEX, OR-Tools, PuLP" >> $GITHUB_STEP_SUMMARY |
475 | 495 | echo "- ✅ Scientific computing packages" >> $GITHUB_STEP_SUMMARY |
476 | 496 | echo "- ✅ Non-root user execution" >> $GITHUB_STEP_SUMMARY |
477 | 497 | echo "- ✅ Resource limits and security restrictions" >> $GITHUB_STEP_SUMMARY |
|
0 commit comments