Skip to content

Manual Build Sandbox Image #7

Manual Build Sandbox Image

Manual Build Sandbox Image #7

name: Manual Build Sandbox Image
on:
workflow_dispatch:
inputs:
build_type:
description: "Image type, e.g., base"
required: true
default: "base"
platform:
description: "Docker architecture platform (used for multi-arch builds)"
required: true
default: "linux/amd64"
type: choice
options:
- linux/amd64
- linux/arm64
single_arch:
description: "Single architecture build (forces amd64, no multi-arch manifest merge)"
required: true
default: "false"
type: choice
options:
- "true"
- "false"
jobs:
build:
runs-on: ubuntu-latest
environment: prod
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Login to DockerHub
- name: Log in to DockerHub
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
if: ${{ env.DOCKER_USERNAME != '' && env.DOCKER_PASSWORD != '' }}
uses: docker/login-action@v3
with:
registry: docker.io
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_PASSWORD }}
# Login to Aliyun ACR
- name: Log in to Aliyun ACR
env:
ALIYUN_ACR_USERNAME: ${{ secrets.ALIYUN_ACR_USERNAME }}
ALIYUN_ACR_PASSWORD: ${{ secrets.ALIYUN_ACR_PASSWORD }}
if: ${{ env.ALIYUN_ACR_USERNAME != '' && env.ALIYUN_ACR_PASSWORD != '' }}
uses: docker/login-action@v3
with:
registry: agentscope-registry.ap-southeast-1.cr.aliyuncs.com
username: ${{ env.ALIYUN_ACR_USERNAME }}
password: ${{ env.ALIYUN_ACR_PASSWORD }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Update setuptools
run: |
pip install --upgrade pip
pip install setuptools==78.1.1 wheel==0.45.1
- name: Set PYTHONPATH
run: |
echo "PYTHONPATH=$PYTHONPATH:${{ github.workspace }}/src" >> $GITHUB_ENV
- name: Install dependencies
run: |
export PIP_DEFAULT_TIMEOUT=300
pip install -q -e ".[dev,ext]"
- name: Run build script
env:
AUTO_BUILD: "true"
run: |
PLATFORM_INPUT="${{ github.event.inputs.platform }}"
SINGLE="${{ github.event.inputs.single_arch }}"
if [ "$SINGLE" = "true" ]; then
PLATFORM_INPUT="linux/amd64"
fi
python src/agentscope_runtime/sandbox/build_script.py \
"${{ github.event.inputs.build_type }}" \
--platform "$PLATFORM_INPUT"
- name: Tag & Push Images
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
ALIYUN_ACR_USERNAME: ${{ secrets.ALIYUN_ACR_USERNAME }}
ALIYUN_ACR_PASSWORD: ${{ secrets.ALIYUN_ACR_PASSWORD }}
run: |
DATE_TAG=$(date +%Y%m%d)
SINGLE="${{ github.event.inputs.single_arch }}"
ARCH_TAG="${{ github.event.inputs.platform }}"
if [ "$SINGLE" = "true" ]; then
ARCH_TAG="linux/amd64"
fi
IMAGE_BASE=$(python -c "from src.agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('${{ github.event.inputs.build_type }}'))")
if [ -n "$DOCKER_USERNAME" ] && [ -n "$DOCKER_PASSWORD" ]; then
if [ "$SINGLE" = "true" ]; then
docker tag $IMAGE_BASE docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}
docker push docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}
else
ARCH_SUFFIX=$(echo "$ARCH_TAG" | tr '/' '-')
docker tag $IMAGE_BASE docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}-${ARCH_SUFFIX}
docker push docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}-${ARCH_SUFFIX}
fi
fi
if [ -n "$ALIYUN_ACR_USERNAME" ] && [ -n "$ALIYUN_ACR_PASSWORD" ]; then
if [ "$SINGLE" = "true" ]; then
docker tag $IMAGE_BASE agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/${IMAGE_BASE}:${DATE_TAG}
docker push agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/${IMAGE_BASE}:${DATE_TAG}
else
ARCH_SUFFIX=$(echo "$ARCH_TAG" | tr '/' '-')
docker tag $IMAGE_BASE agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/${IMAGE_BASE}:${DATE_TAG}-${ARCH_SUFFIX}
docker push agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/${IMAGE_BASE}:${DATE_TAG}-${ARCH_SUFFIX}
fi
fi
- name: Create Multi-arch Manifest for DockerHub
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
if: ${{ github.event.inputs.single_arch == 'false' && env.DOCKER_USERNAME != '' && env.DOCKER_PASSWORD != '' }}
run: |
DATE_TAG=$(date +%Y%m%d)
IMAGE_BASE=$(python -c "from src.agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('${{ github.event.inputs.build_type }}'))")
AMD_TAG="docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}-linux-amd64"
ARM_TAG="docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}-linux-arm64"
COMMON_TAG="docker.io/agentscope/${IMAGE_BASE}:${DATE_TAG}"
if docker manifest inspect "$AMD_TAG" >/dev/null 2>&1 && docker manifest inspect "$ARM_TAG" >/dev/null 2>&1; then
echo "Creating multi-arch manifest for $COMMON_TAG"
docker manifest create "$COMMON_TAG" --amend "$AMD_TAG" --amend "$ARM_TAG"
docker manifest push "$COMMON_TAG"
else
echo "Missing architecture image in DockerHub, skipping manifest creation."
fi
- name: Create Multi-arch Manifest for Aliyun ACR
env:
ALIYUN_ACR_USERNAME: ${{ secrets.ALIYUN_ACR_USERNAME }}
ALIYUN_ACR_PASSWORD: ${{ secrets.ALIYUN_ACR_PASSWORD }}
if: ${{ github.event.inputs.single_arch == 'false' && env.ALIYUN_ACR_USERNAME != '' && env.ALIYUN_ACR_PASSWORD != '' }}
run: |
DATE_TAG=$(date +%Y%m%d)
IMAGE_BASE=$(python -c "from src.agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('${{ github.event.inputs.build_type }}'))")
REG="agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope"
AMD_TAG="${REG}/${IMAGE_BASE}:${DATE_TAG}-linux-amd64"
ARM_TAG="${REG}/${IMAGE_BASE}:${DATE_TAG}-linux-arm64"
COMMON_TAG="${REG}/${IMAGE_BASE}:${DATE_TAG}"
if docker manifest inspect "$AMD_TAG" >/dev/null 2>&1 && docker manifest inspect "$ARM_TAG" >/dev/null 2>&1; then
echo "Creating multi-arch manifest for $COMMON_TAG"
docker manifest create "$COMMON_TAG" --amend "$AMD_TAG" --amend "$ARM_TAG"
docker manifest push "$COMMON_TAG"
else
echo "Missing architecture image in Aliyun ACR, skipping manifest creation."
fi