diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index 396981192ef..3b733b3ba2f 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -3,6 +3,8 @@ name: build_docker on: push: branches: [ main ] + pull_request: + branches: [ main ] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -10,42 +12,54 @@ concurrency: jobs: build_docker: - name: Build docker + name: Build Docker runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 + + - uses: actions/setup-go@v4 + with: + go-version: 'stable' + + - name: Build go binary + run: bash build.sh dev docker-multiplatform + - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: xhofe/alist - - name: Replace release with dev - run: | - sed -i 's/release/dev/g' Dockerfile + - name: Set up QEMU uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Login to DockerHub + if: github.event_name == 'push' uses: docker/login-action@v3 with: username: xhofe password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push id: docker_build uses: docker/build-push-action@v5 with: context: . - push: true + file: Dockerfile.ci + push: ${{ github.event_name == 'push' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/s390x build_docker_with_aria2: needs: build_docker name: Build docker with aria2 runs-on: ubuntu-latest + if: github.event_name == 'push' steps: - name: Checkout repo uses: actions/checkout@v4 diff --git a/.github/workflows/release_docker.yml b/.github/workflows/release_docker.yml index 51ef40cc6a7..b029484e9bb 100644 --- a/.github/workflows/release_docker.yml +++ b/.github/workflows/release_docker.yml @@ -13,6 +13,13 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - uses: actions/setup-go@v4 + with: + go-version: 'stable' + + - name: Build go binary + run: bash build.sh release docker-multiplatform + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -36,6 +43,7 @@ jobs: uses: docker/build-push-action@v5 with: context: . + file: Dockerfile.ci push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile index 542d502c53b..23ca42da201 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,11 @@ FROM alpine:edge as builder LABEL stage=go-builder WORKDIR /app/ +RUN apk add --no-cache bash curl gcc git go musl-dev +COPY go.mod go.sum ./ +RUN go mod download COPY ./ ./ -RUN apk add --no-cache bash curl gcc git go musl-dev; \ - bash build.sh release docker +RUN bash build.sh release docker FROM alpine:edge LABEL MAINTAINER="i@nn.ci" @@ -11,8 +13,11 @@ VOLUME /opt/alist/data/ WORKDIR /opt/alist/ COPY --from=builder /app/bin/alist ./ COPY entrypoint.sh /entrypoint.sh -RUN apk add --no-cache bash ca-certificates su-exec tzdata; \ - chmod +x /entrypoint.sh +RUN apk update && \ + apk upgrade --no-cache && \ + apk add --no-cache bash ca-certificates su-exec tzdata; \ + chmod +x /entrypoint.sh && \ + rm -rf /var/cache/apk/* ENV PUID=0 PGID=0 UMASK=022 EXPOSE 5244 5245 -CMD [ "/entrypoint.sh" ] +CMD [ "/entrypoint.sh" ] \ No newline at end of file diff --git a/Dockerfile.ci b/Dockerfile.ci new file mode 100644 index 00000000000..dc18d259f58 --- /dev/null +++ b/Dockerfile.ci @@ -0,0 +1,16 @@ +FROM alpine:edge +ARG TARGETPLATFORM +LABEL MAINTAINER="i@nn.ci" +VOLUME /opt/alist/data/ +WORKDIR /opt/alist/ +COPY /${TARGETPLATFORM}/alist ./ +COPY entrypoint.sh /entrypoint.sh +RUN apk update && \ + apk upgrade --no-cache && \ + apk add --no-cache bash ca-certificates su-exec tzdata; \ + chmod +x /entrypoint.sh && \ + rm -rf /var/cache/apk/* && \ + /entrypoint.sh version +ENV PUID=0 PGID=0 UMASK=022 +EXPOSE 5244 5245 +CMD [ "/entrypoint.sh" ] \ No newline at end of file diff --git a/build.sh b/build.sh index 4ea19ecc273..7f56e5b2e9a 100644 --- a/build.sh +++ b/build.sh @@ -85,12 +85,61 @@ BuildDev() { cat md5.txt } -BuildDocker() { +PrepareBuildDocker() { echo "replace github.com/mattn/go-sqlite3 => github.com/leso-kn/go-sqlite3 v0.0.0-20230710125852-03158dc838ed" >>go.mod go get gorm.io/driver/sqlite@v1.4.4 + go mod download +} + +BuildDocker() { + PrepareBuildDocker go build -o ./bin/alist -ldflags="$ldflags" -tags=jsoniter . } +BuildDockerMultiplatform() { + PrepareBuildDocker + + BASE="https://musl.cc/" + FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross i486-linux-musl-cross s390x-linux-musl-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross) + for i in "${FILES[@]}"; do + url="${BASE}${i}.tgz" + curl -L -o "${i}.tgz" "${url}" + sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local + rm -f "${i}.tgz" + done + + docker_lflags="--extldflags '-static -fpic' $ldflags" + export CGO_ENABLED=1 + + OS_ARCHES=(linux-amd64 linux-arm64 linux-386 linux-s390x) + CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc i486-linux-musl-gcc s390x-linux-musl-gcc) + for i in "${!OS_ARCHES[@]}"; do + os_arch=${OS_ARCHES[$i]} + cgo_cc=${CGO_ARGS[$i]} + os=${os_arch%%-*} + arch=${os_arch##*-} + export GOOS=$os + export GOARCH=$arch + export CC=${cgo_cc} + echo "building for $os_arch" + go build -o ./$os/$arch/alist -ldflags="$docker_lflags" -tags=jsoniter . + done + + DOCKER_ARM_ARCHES=(linux-arm/v6 linux-arm/v7) + CGO_ARGS=(armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc) + GO_ARM=(6 7) + export GOOS=linux + export GOARCH=arm + for i in "${!DOCKER_ARM_ARCHES[@]}"; do + docker_arch=${DOCKER_ARM_ARCHES[$i]} + cgo_cc=${CGO_ARGS[$i]} + export GOARM=${GO_ARM[$i]} + export CC=${cgo_cc} + echo "building for $docker_arch" + go build -o ./${docker_arch%%-*}/${docker_arch##*-}/alist -ldflags="$docker_lflags" -tags=jsoniter . + done +} + BuildRelease() { rm -rf .git/ mkdir -p "build" @@ -190,6 +239,8 @@ if [ "$1" = "dev" ]; then FetchWebDev if [ "$2" = "docker" ]; then BuildDocker + elif [ "$2" = "docker-multiplatform" ]; then + BuildDockerMultiplatform else BuildDev fi @@ -197,6 +248,8 @@ elif [ "$1" = "release" ]; then FetchWebRelease if [ "$2" = "docker" ]; then BuildDocker + elif [ "$2" = "docker-multiplatform" ]; then + BuildDockerMultiplatform elif [ "$2" = "linux_musl_arm" ]; then BuildReleaseLinuxMuslArm MakeRelease "md5-linux-musl-arm.txt" diff --git a/entrypoint.sh b/entrypoint.sh index 05bbf8d3c83..a0d8083509e 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -4,4 +4,8 @@ chown -R ${PUID}:${PGID} /opt/alist/ umask ${UMASK} -exec su-exec ${PUID}:${PGID} ./alist server --no-prefix \ No newline at end of file +if [ "$1" = "version" ]; then + ./alist version +else + exec su-exec ${PUID}:${PGID} ./alist server --no-prefix +fi \ No newline at end of file