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