feature: enhance alias sandbox performance when running code (#91)
This commit is contained in:
208
.github/workflows/build_alias_sandbox_image.yml
vendored
Normal file
208
.github/workflows/build_alias_sandbox_image.yml
vendored
Normal file
@@ -0,0 +1,208 @@
|
||||
name: Manual Build Alias Sandbox Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
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"
|
||||
tag:
|
||||
description: "Custom image tag (default: current date)"
|
||||
required: false
|
||||
default: ""
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ ubuntu-latest ]
|
||||
python-version: [ '3.10' ]
|
||||
environment: prod
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- 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 }}
|
||||
|
||||
- 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 ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Cache pip dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
|
||||
- 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 agentscope-runtime loguru
|
||||
|
||||
- name: Run build script for all types
|
||||
working-directory: alias/src/alias/runtime/alias_sandbox
|
||||
env:
|
||||
AUTO_BUILD: "true"
|
||||
run: |
|
||||
TAG_INPUT="${{ github.event.inputs.tag }}"
|
||||
if [ -z "$TAG_INPUT" ]; then
|
||||
TAG_INPUT=$(date +%Y%m%d)
|
||||
fi
|
||||
PLATFORM_INPUT="${{ github.event.inputs.platform }}"
|
||||
SINGLE="${{ github.event.inputs.single_arch }}"
|
||||
if [ "$SINGLE" = "true" ]; then
|
||||
PLATFORM_INPUT="linux/amd64"
|
||||
fi
|
||||
IFS=',' read -ra TYPES <<< "alias"
|
||||
for TYPE in "${TYPES[@]}"; do
|
||||
runtime-sandbox-builder "$TYPE" --platform "$PLATFORM_INPUT" --dockerfile_path Dockerfile --extension alias_sandbox.py
|
||||
done
|
||||
|
||||
- name: Tag & Push Images
|
||||
working-directory: alias/src/alias/runtime/alias_sandbox
|
||||
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: |
|
||||
TAG_INPUT="${{ github.event.inputs.tag }}"
|
||||
if [ -z "$TAG_INPUT" ]; then
|
||||
TAG_INPUT=$(date +%Y%m%d)
|
||||
fi
|
||||
SINGLE="${{ github.event.inputs.single_arch }}"
|
||||
ARCH_TAG="${{ github.event.inputs.platform }}"
|
||||
if [ "$SINGLE" = "true" ]; then
|
||||
ARCH_TAG="linux/amd64"
|
||||
fi
|
||||
IFS=',' read -ra TYPES <<< "alias"
|
||||
for TYPE in "${TYPES[@]}"; do
|
||||
IMAGE_BASE=$(python -c "import alias_sandbox; from agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('$TYPE'))")
|
||||
IMAGE_NAME="${IMAGE_BASE%%:*}"
|
||||
if [ -n "$DOCKER_USERNAME" ] && [ -n "$DOCKER_PASSWORD" ]; then
|
||||
if [ "$SINGLE" = "true" ]; then
|
||||
docker tag "$IMAGE_BASE" "docker.io/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
docker push "docker.io/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
else
|
||||
ARCH_SUFFIX=$(echo "$ARCH_TAG" | tr '/' '-')
|
||||
docker tag "$IMAGE_BASE" "docker.io/${IMAGE_NAME}:${TAG_INPUT}-${ARCH_SUFFIX}"
|
||||
docker push "docker.io/${IMAGE_NAME}:${TAG_INPUT}-${ARCH_SUFFIX}"
|
||||
fi
|
||||
fi
|
||||
if [ -n "$ALIYUN_ACR_USERNAME" ] && [ -n "$ALIYUN_ACR_PASSWORD" ]; then
|
||||
REGISTRY="agentscope-registry.ap-southeast-1.cr.aliyuncs.com"
|
||||
if [ "$SINGLE" = "true" ]; then
|
||||
docker tag "$IMAGE_BASE" "${REGISTRY}/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
docker push "${REGISTRY}/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
else
|
||||
ARCH_SUFFIX=$(echo "$ARCH_TAG" | tr '/' '-')
|
||||
docker tag "$IMAGE_BASE" "${REGISTRY}/${IMAGE_NAME}:${TAG_INPUT}-${ARCH_SUFFIX}"
|
||||
docker push "${REGISTRY}/${IMAGE_NAME}:${TAG_INPUT}-${ARCH_SUFFIX}"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Create Multi-arch Manifest for DockerHub
|
||||
working-directory: alias/src/alias/runtime/alias_sandbox
|
||||
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: |
|
||||
TAG_INPUT="${{ github.event.inputs.tag }}"
|
||||
if [ -z "$TAG_INPUT" ]; then
|
||||
TAG_INPUT=$(date +%Y%m%d)
|
||||
fi
|
||||
IFS=',' read -ra TYPES <<< "alias"
|
||||
for TYPE in "${TYPES[@]}"; do
|
||||
IMAGE_BASE=$(python -c "import alias_sandbox; from agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('$TYPE'))")
|
||||
IMAGE_NAME="${IMAGE_BASE%%:*}"
|
||||
AMD_TAG="docker.io/${IMAGE_NAME}:${TAG_INPUT}-linux-amd64"
|
||||
ARM_TAG="docker.io/${IMAGE_NAME}:${TAG_INPUT}-linux-arm64"
|
||||
COMMON_TAG="docker.io/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
if docker manifest inspect "$AMD_TAG" >/dev/null 2>&1 && docker manifest inspect "$ARM_TAG" >/dev/null 2>&1; then
|
||||
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
|
||||
done
|
||||
|
||||
- name: Create Multi-arch Manifest for Aliyun ACR
|
||||
working-directory: alias/src/alias/runtime/alias_sandbox
|
||||
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: |
|
||||
TAG_INPUT="${{ github.event.inputs.tag }}"
|
||||
if [ -z "$TAG_INPUT" ]; then
|
||||
TAG_INPUT=$(date +%Y%m%d)
|
||||
fi
|
||||
REG="agentscope-registry.ap-southeast-1.cr.aliyuncs.com"
|
||||
IFS=',' read -ra TYPES <<< "alias"
|
||||
for TYPE in "${TYPES[@]}"; do
|
||||
IMAGE_BASE=$(python -c "import alias_sandbox; from agentscope_runtime.sandbox.registry import SandboxRegistry; print(SandboxRegistry.get_image_by_type('$TYPE'))")
|
||||
IMAGE_NAME="${IMAGE_BASE%%:*}"
|
||||
AMD_TAG="${REG}/${IMAGE_NAME}:${TAG_INPUT}-linux-amd64"
|
||||
ARM_TAG="${REG}/${IMAGE_NAME}:${TAG_INPUT}-linux-arm64"
|
||||
COMMON_TAG="${REG}/${IMAGE_NAME}:${TAG_INPUT}"
|
||||
if docker manifest inspect "$AMD_TAG" >/dev/null 2>&1 && docker manifest inspect "$ARM_TAG" >/dev/null 2>&1; then
|
||||
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
|
||||
done
|
||||
Reference in New Issue
Block a user