2025-01-28 19:37:50 +08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
2025-06-20 17:43:25 +08:00
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
# This file is using docker to run commands
|
2025-09-04 12:03:13 +08:00
|
|
|
SPC_DOCKER_VERSION=v6
|
2025-06-20 17:43:25 +08:00
|
|
|
|
2025-01-28 19:37:50 +08:00
|
|
|
# Detect docker can run
|
|
|
|
|
if ! which docker >/dev/null; then
|
|
|
|
|
echo "Docker is not installed, please install docker first !"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
DOCKER_EXECUTABLE="docker"
|
|
|
|
|
# shellcheck disable=SC2046
|
|
|
|
|
if [ $(id -u) -ne 0 ]; then
|
|
|
|
|
if ! docker info > /dev/null 2>&1; then
|
2025-03-24 19:25:38 +08:00
|
|
|
if [ "$SPC_USE_SUDO" != "yes" ] && [ "$SPC_DOCKER_DEBUG" != "yes" ]; then
|
2025-01-28 19:37:50 +08:00
|
|
|
echo "Docker command requires sudo"
|
|
|
|
|
# shellcheck disable=SC2039
|
|
|
|
|
echo -n 'To use sudo to run docker, run "export SPC_USE_SUDO=yes" and run command again'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
DOCKER_EXECUTABLE="sudo docker"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
2025-06-20 17:43:25 +08:00
|
|
|
# Convert uname to gnu arch
|
|
|
|
|
CURRENT_ARCH=$(uname -m)
|
|
|
|
|
if [ "$CURRENT_ARCH" = "arm64" ]; then
|
|
|
|
|
CURRENT_ARCH=aarch64
|
2025-01-28 19:37:50 +08:00
|
|
|
fi
|
2025-06-20 17:43:25 +08:00
|
|
|
if [ -z "$SPC_USE_ARCH" ]; then
|
|
|
|
|
SPC_USE_ARCH=$CURRENT_ARCH
|
|
|
|
|
fi
|
|
|
|
|
# parse SPC_USE_ARCH
|
2025-01-28 19:37:50 +08:00
|
|
|
case $SPC_USE_ARCH in
|
2025-06-20 17:43:25 +08:00
|
|
|
x86_64|amd64)
|
|
|
|
|
SPC_USE_ARCH=x86_64
|
|
|
|
|
SPC_USE_ARCH_DOCKER=amd64
|
|
|
|
|
if [ "$CURRENT_ARCH" != "x86_64" ]; then
|
|
|
|
|
PLATFORM_ARG="--platform linux/amd64"
|
2025-01-28 19:37:50 +08:00
|
|
|
fi
|
|
|
|
|
;;
|
2025-06-20 17:43:25 +08:00
|
|
|
aarch64|arm64)
|
|
|
|
|
SPC_USE_ARCH=aarch64
|
|
|
|
|
SPC_USE_ARCH_DOCKER=arm64
|
|
|
|
|
if [ "$CURRENT_ARCH" != "aarch64" ]; then
|
|
|
|
|
PLATFORM_ARG="--platform linux/arm64"
|
|
|
|
|
fi
|
2025-01-28 19:37:50 +08:00
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
|
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2025-06-20 17:43:25 +08:00
|
|
|
# detect if we need to use qemu-static
|
|
|
|
|
if [ "$SPC_USE_ARCH" != "$CURRENT_ARCH" ]; then
|
|
|
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
|
|
|
echo "* Using different arch needs to setup qemu-static for docker !"
|
|
|
|
|
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static --reset -p yes > /dev/null
|
|
|
|
|
fi
|
|
|
|
|
fi
|
2025-01-28 19:37:50 +08:00
|
|
|
|
|
|
|
|
# Detect docker env is setup
|
2025-06-20 17:43:25 +08:00
|
|
|
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION; then
|
2025-01-28 19:37:50 +08:00
|
|
|
echo "Docker container does not exist. Building docker image ..."
|
2025-06-28 19:05:52 +08:00
|
|
|
$DOCKER_EXECUTABLE buildx build $PLATFORM_ARG -t cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION -f- . <<EOF
|
2025-01-28 19:37:50 +08:00
|
|
|
FROM centos:7
|
|
|
|
|
RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \
|
|
|
|
|
sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
|
|
|
|
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo
|
|
|
|
|
RUN yum clean all && \
|
|
|
|
|
yum makecache && \
|
2025-03-14 15:25:51 +08:00
|
|
|
yum update -y && \
|
|
|
|
|
localedef -c -i en_US -f UTF-8 en_US.UTF-8
|
2025-01-28 19:37:50 +08:00
|
|
|
|
2025-03-09 20:30:22 +08:00
|
|
|
RUN yum install -y centos-release-scl
|
|
|
|
|
|
2025-06-20 17:43:25 +08:00
|
|
|
RUN if [ "$SPC_USE_ARCH" = "aarch64" ]; then \
|
2025-03-09 20:30:22 +08:00
|
|
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \
|
|
|
|
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo ; \
|
|
|
|
|
else \
|
|
|
|
|
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo ; \
|
|
|
|
|
fi
|
|
|
|
|
RUN sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
2025-07-22 12:24:48 +08:00
|
|
|
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo && \
|
|
|
|
|
sed -i 's|http://|https://|g' /etc/yum.repos.d/*.repo
|
2025-03-09 20:30:22 +08:00
|
|
|
|
|
|
|
|
RUN yum update -y && \
|
2025-07-20 01:44:09 +07:00
|
|
|
yum install -y devtoolset-10-gcc-* devtoolset-10-libatomic-devel
|
2025-03-10 00:39:59 +08:00
|
|
|
RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc
|
2025-03-09 20:30:22 +08:00
|
|
|
RUN source /etc/bashrc
|
2025-06-17 12:30:11 +07:00
|
|
|
RUN yum install -y which
|
|
|
|
|
|
2025-06-28 19:05:52 +08:00
|
|
|
RUN curl -o cmake.tgz -#fSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$SPC_USE_ARCH.tar.gz && \
|
2025-01-28 19:37:50 +08:00
|
|
|
mkdir /cmake && \
|
|
|
|
|
tar -xzf cmake.tgz -C /cmake --strip-components 1
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
COPY ./composer.* /app/
|
|
|
|
|
ADD ./bin/setup-runtime /app/bin/setup-runtime
|
|
|
|
|
ADD ./bin/spc /app/bin/spc
|
|
|
|
|
RUN /app/bin/setup-runtime
|
2025-07-31 01:44:44 +08:00
|
|
|
ADD ./src /app/src
|
2025-03-24 22:39:45 +08:00
|
|
|
RUN /app/bin/php /app/bin/composer install --no-dev
|
2025-06-29 19:53:22 +08:00
|
|
|
ENV SPC_LIBC=glibc
|
2025-06-30 12:19:17 +08:00
|
|
|
ENV PATH="/app/bin:/cmake/bin:/opt/rh/devtoolset-10/root/usr/bin:\$PATH"
|
2025-01-28 19:37:50 +08:00
|
|
|
|
2025-07-31 01:44:44 +08:00
|
|
|
ADD ./config /app/config
|
2025-09-05 11:00:46 +08:00
|
|
|
RUN CC=gcc bin/spc doctor --auto-fix --debug
|
|
|
|
|
RUN bin/spc install-pkg upx
|
2025-07-31 01:44:44 +08:00
|
|
|
RUN if [ -f /app/buildroot/bin/re2c ]; then \
|
|
|
|
|
cp /app/buildroot/bin/re2c /usr/local/bin/re2c ;\
|
|
|
|
|
fi
|
2025-03-10 00:39:59 +08:00
|
|
|
|
|
|
|
|
RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \
|
|
|
|
|
tar -zxvf make.tgz && \
|
|
|
|
|
cd make-4.4 && \
|
|
|
|
|
./configure && \
|
|
|
|
|
make && \
|
|
|
|
|
make install && \
|
|
|
|
|
ln -sf /usr/local/bin/make /usr/bin/make
|
|
|
|
|
|
2025-03-13 14:57:37 +08:00
|
|
|
RUN curl -o automake.tgz -fsSL https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz && \
|
|
|
|
|
tar -xvf automake.tgz && \
|
|
|
|
|
cd automake-1.17 && \
|
|
|
|
|
./configure && \
|
|
|
|
|
make && \
|
|
|
|
|
make install && \
|
|
|
|
|
ln -sf /usr/local/bin/automake /usr/bin/automake
|
2025-09-05 11:00:46 +08:00
|
|
|
|
|
|
|
|
RUN mv /app/pkgroot/\$(uname -m)-linux /app/pkgroot-private
|
|
|
|
|
ADD bin/docker-entrypoint.sh /bin/docker-entrypoint.sh
|
|
|
|
|
RUN chmod +x /bin/docker-entrypoint.sh
|
|
|
|
|
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
|
2025-01-28 19:37:50 +08:00
|
|
|
EOF
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Check if in ci (local terminal can execute with -it)
|
|
|
|
|
if [ -t 0 ]; then
|
|
|
|
|
INTERACT=-it
|
|
|
|
|
else
|
|
|
|
|
INTERACT=''
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Mounting volumes
|
|
|
|
|
MOUNT_LIST=""
|
|
|
|
|
# shellcheck disable=SC2089
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/config:/app/config"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/src:/app/src"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/buildroot:/app/buildroot"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/source:/app/source"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
2025-10-17 10:13:10 +08:00
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/log:/app/log"
|
2025-04-24 14:18:39 +08:00
|
|
|
if [ -f "$(pwd)/craft.yml" ]; then
|
|
|
|
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/craft.yml:/app/craft.yml"
|
|
|
|
|
fi
|
2025-01-28 19:37:50 +08:00
|
|
|
|
2025-03-09 20:30:22 +08:00
|
|
|
# Apply env in temp env file
|
2025-06-28 19:05:52 +08:00
|
|
|
echo 'SPC_DEFAULT_C_FLAGS=-fPIC' > /tmp/spc-gnu-docker.env
|
2025-06-29 19:53:22 +08:00
|
|
|
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
2025-03-09 20:30:22 +08:00
|
|
|
|
2025-05-21 15:11:42 +08:00
|
|
|
# Environment variable passthrough
|
|
|
|
|
ENV_LIST=""
|
|
|
|
|
ENV_LIST="$ENV_LIST -e SPC_FIX_DEPLOY_ROOT="$(pwd)""
|
|
|
|
|
if [ ! -z "$GITHUB_TOKEN" ]; then
|
|
|
|
|
ENV_LIST="$ENV_LIST -e GITHUB_TOKEN=$GITHUB_TOKEN"
|
|
|
|
|
fi
|
|
|
|
|
|
2025-11-07 11:06:50 +01:00
|
|
|
# Intercept and rewrite --with-frankenphp-app option, and mount host path to /app/app
|
|
|
|
|
FRANKENPHP_APP_PATH=""
|
|
|
|
|
NEW_ARGS=()
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
|
case "$1" in
|
|
|
|
|
--with-frankenphp-app=*)
|
|
|
|
|
FRANKENPHP_APP_PATH="${1#*=}"
|
|
|
|
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
--with-frankenphp-app)
|
|
|
|
|
if [ -n "${2:-}" ]; then
|
|
|
|
|
FRANKENPHP_APP_PATH="$2"
|
|
|
|
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
|
|
|
|
shift 2
|
|
|
|
|
else
|
|
|
|
|
NEW_ARGS+=("$1")
|
|
|
|
|
shift
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
NEW_ARGS+=("$1")
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Normalize the path and add mount if provided
|
|
|
|
|
if [ -n "$FRANKENPHP_APP_PATH" ]; then
|
|
|
|
|
# expand ~ to $HOME
|
|
|
|
|
if [ "${FRANKENPHP_APP_PATH#~}" != "$FRANKENPHP_APP_PATH" ]; then
|
|
|
|
|
FRANKENPHP_APP_PATH="$HOME${FRANKENPHP_APP_PATH#~}"
|
|
|
|
|
fi
|
|
|
|
|
# make absolute if relative
|
|
|
|
|
case "$FRANKENPHP_APP_PATH" in
|
|
|
|
|
/*) ABS_APP_PATH="$FRANKENPHP_APP_PATH" ;;
|
|
|
|
|
*) ABS_APP_PATH="$(pwd)/$FRANKENPHP_APP_PATH" ;;
|
|
|
|
|
esac
|
2025-11-10 13:26:17 +08:00
|
|
|
MOUNT_LIST="$MOUNT_LIST -v $ABS_APP_PATH:/app/app"
|
2025-11-07 11:06:50 +01:00
|
|
|
fi
|
|
|
|
|
|
2025-01-28 19:37:50 +08:00
|
|
|
# Run docker
|
|
|
|
|
# shellcheck disable=SC2068
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
# shellcheck disable=SC2090
|
2025-03-09 20:30:22 +08:00
|
|
|
|
2025-03-24 19:25:38 +08:00
|
|
|
if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
|
2025-03-24 22:39:45 +08:00
|
|
|
echo "* Debug mode enabled, run docker in interactive mode."
|
|
|
|
|
echo "* You can use 'exit' to exit the docker container."
|
|
|
|
|
echo "* You can use 'bin/spc' like normal builds."
|
|
|
|
|
echo "*"
|
|
|
|
|
echo "* Mounted directories:"
|
|
|
|
|
echo "* ./config: $(pwd)/config"
|
|
|
|
|
echo "* ./src: $(pwd)/src"
|
|
|
|
|
echo "* ./buildroot: $(pwd)/buildroot"
|
|
|
|
|
echo "* ./source: $(pwd)/source"
|
|
|
|
|
echo "* ./dist: $(pwd)/dist"
|
|
|
|
|
echo "* ./downloads: $(pwd)/downloads"
|
|
|
|
|
echo "* ./pkgroot: $(pwd)/pkgroot"
|
|
|
|
|
echo "*"
|
2025-05-21 15:11:42 +08:00
|
|
|
set -ex
|
2025-06-20 17:43:25 +08:00
|
|
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --privileged --rm -it $INTERACT $ENV_LIST --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION /bin/bash
|
2025-03-24 19:25:38 +08:00
|
|
|
else
|
2025-11-07 11:06:50 +01:00
|
|
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION bin/spc "${NEW_ARGS[@]}"
|
2025-03-24 19:25:38 +08:00
|
|
|
fi
|