Skip to content

Commit a7be846

Browse files
author
William Yang
committed
feat: add golden Docker image for students (C/Python/Java)
- Single image ghcr.io/bootcs-cn/cli:latest - Includes: clang, gcc, gdb, valgrind, libcs50, OpenJDK 17, Maven - No selection needed - one image for all courses - Auto-build on docker/ or pyproject.toml changes
1 parent 3b0ffb6 commit a7be846

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# 构建 bootcs-cli 学员开发环境镜像
2+
#
3+
# 黄金镜像:包含所有支持的语言 (C, Python, Java)
4+
# 学员只需使用一个镜像,无需选择
5+
#
6+
# 镜像标签:
7+
# - ghcr.io/bootcs-cn/cli:latest (推荐)
8+
# - ghcr.io/bootcs-cn/cli:v2.0.0 (版本号)
9+
10+
name: Build CLI Image
11+
12+
on:
13+
workflow_dispatch:
14+
inputs:
15+
push:
16+
description: "Push image to registry"
17+
required: false
18+
default: true
19+
type: boolean
20+
21+
push:
22+
branches: [main]
23+
paths:
24+
- "docker/**"
25+
- "pyproject.toml"
26+
- ".github/workflows/build-cli-image.yml"
27+
28+
release:
29+
types: [published]
30+
31+
env:
32+
REGISTRY: ghcr.io
33+
IMAGE_NAME: bootcs-cn/cli
34+
35+
jobs:
36+
build:
37+
runs-on: ubuntu-latest
38+
permissions:
39+
contents: read
40+
packages: write
41+
42+
steps:
43+
- name: Checkout repository
44+
uses: actions/checkout@v4
45+
46+
- name: Log in to Container Registry
47+
uses: docker/login-action@v3
48+
with:
49+
registry: ${{ env.REGISTRY }}
50+
username: ${{ github.actor }}
51+
password: ${{ secrets.GITHUB_TOKEN }}
52+
53+
- name: Set up Docker Buildx
54+
uses: docker/setup-buildx-action@v3
55+
56+
- name: Extract version from pyproject.toml
57+
id: version
58+
run: |
59+
VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
60+
echo "version=$VERSION" >> $GITHUB_OUTPUT
61+
echo "📦 Version: $VERSION"
62+
63+
- name: Extract metadata
64+
id: meta
65+
uses: docker/metadata-action@v5
66+
with:
67+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
68+
tags: |
69+
# latest 标签
70+
type=raw,value=latest,enable={{is_default_branch}}
71+
# 版本标签 (从 pyproject.toml)
72+
type=raw,value=v${{ steps.version.outputs.version }}
73+
# Git SHA 标签
74+
type=sha,prefix=
75+
76+
- name: Build and push image
77+
uses: docker/build-push-action@v5
78+
with:
79+
context: ./docker
80+
file: ./docker/Dockerfile
81+
push: ${{ inputs.push != false }}
82+
tags: ${{ steps.meta.outputs.tags }}
83+
labels: ${{ steps.meta.outputs.labels }}
84+
cache-from: type=gha
85+
cache-to: type=gha,mode=max
86+
87+
- name: Image summary
88+
run: |
89+
echo "## 🐳 CLI Image Built" >> $GITHUB_STEP_SUMMARY
90+
echo "" >> $GITHUB_STEP_SUMMARY
91+
echo "**Image:** \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\`" >> $GITHUB_STEP_SUMMARY
92+
echo "" >> $GITHUB_STEP_SUMMARY
93+
echo "**Supported Languages:** C, Python, Java" >> $GITHUB_STEP_SUMMARY
94+
echo "" >> $GITHUB_STEP_SUMMARY
95+
echo "### Quick Start" >> $GITHUB_STEP_SUMMARY
96+
echo "" >> $GITHUB_STEP_SUMMARY
97+
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
98+
echo "# 本地评测" >> $GITHUB_STEP_SUMMARY
99+
echo "docker run --rm -v \$(pwd):/workspace ghcr.io/bootcs-cn/cli check cs50/hello" >> $GITHUB_STEP_SUMMARY
100+
echo "" >> $GITHUB_STEP_SUMMARY
101+
echo "# 提交代码" >> $GITHUB_STEP_SUMMARY
102+
echo "docker run --rm -v \$(pwd):/workspace ghcr.io/bootcs-cn/cli submit cs50/hello" >> $GITHUB_STEP_SUMMARY
103+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY

docker/Dockerfile

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# bootcs-cli 学员开发环境镜像 (黄金镜像)
2+
#
3+
# 包含所有支持的语言: C, Python, Java
4+
# 与评测环境一致,避免"本地通过、线上失败"问题
5+
#
6+
# 使用方式:
7+
# docker run --rm -v $(pwd):/workspace ghcr.io/bootcs-cn/cli check cs50/hello
8+
# docker run --rm -v $(pwd):/workspace ghcr.io/bootcs-cn/cli submit cs50/hello
9+
#
10+
# 支持课程:
11+
# - CS50 (C, Python)
12+
# - 数据结构 (C, Python, Java)
13+
# - 编译器 (C)
14+
# - 数据库 (Python, Java)
15+
# - 分布式系统 (Java, Python)
16+
17+
FROM python:3.11-slim
18+
19+
LABEL org.opencontainers.image.source="https://github.com/bootcs-cn/bootcs-cli"
20+
LABEL org.opencontainers.image.description="bootcs-cli development environment for students"
21+
LABEL org.opencontainers.image.licenses="MIT"
22+
23+
# ============================================
24+
# 系统基础工具
25+
# ============================================
26+
RUN apt-get update && apt-get install -y --no-install-recommends \
27+
curl \
28+
git \
29+
&& rm -rf /var/lib/apt/lists/*
30+
31+
# ============================================
32+
# C 语言工具链
33+
# ============================================
34+
RUN apt-get update && apt-get install -y --no-install-recommends \
35+
clang \
36+
gcc \
37+
g++ \
38+
make \
39+
gdb \
40+
valgrind \
41+
&& rm -rf /var/lib/apt/lists/*
42+
43+
# libcs50 (CS50 课程需要)
44+
RUN git clone --depth 1 https://github.com/cs50/libcs50.git /tmp/libcs50 \
45+
&& cd /tmp/libcs50 \
46+
&& make \
47+
&& make install \
48+
&& ldconfig \
49+
&& rm -rf /tmp/libcs50
50+
51+
# ============================================
52+
# Java 工具链
53+
# ============================================
54+
RUN apt-get update && apt-get install -y --no-install-recommends \
55+
openjdk-17-jdk \
56+
maven \
57+
&& rm -rf /var/lib/apt/lists/*
58+
59+
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
60+
ENV PATH="${JAVA_HOME}/bin:${PATH}"
61+
62+
# ============================================
63+
# Python 已包含在基础镜像中
64+
# ============================================
65+
66+
# ============================================
67+
# 安装 bootcs-cli
68+
# ============================================
69+
RUN pip install --no-cache-dir bootcs
70+
71+
# ============================================
72+
# 环境配置
73+
# ============================================
74+
ENV PYTHONUNBUFFERED=1
75+
ENV LC_ALL=C.UTF-8
76+
ENV LANG=C.UTF-8
77+
78+
WORKDIR /workspace
79+
80+
ENTRYPOINT ["bootcs"]
81+
CMD ["--help"]

0 commit comments

Comments
 (0)