name: Build and Push Docker image
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
ref: ${{ github.ref_name }}
- name: 安装 Rust 工具链
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl,aarch64-unknown-linux-musl
- name: 缓存 Cargo 依赖
uses: Swatinem/rust-cache@v2
with:
key: docker-musl
- name: 安装交叉编译工具链
run: sudo apt-get update && sudo apt-get install -y musl-tools gcc-aarch64-linux-gnu
- name: 编译 amd64
run: cargo build --release --target x86_64-unknown-linux-musl
- name: 交叉编译 arm64
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER: aarch64-linux-gnu-gcc
run: cargo build --release --target aarch64-unknown-linux-musl
- name: 准备二进制文件
run: |
mkdir -p bin/amd64 bin/arm64
cp target/x86_64-unknown-linux-musl/release/quarkdrive-webdav bin/amd64/
cp target/aarch64-unknown-linux-musl/release/quarkdrive-webdav bin/arm64/
strip bin/amd64/quarkdrive-webdav
aarch64-linux-gnu-strip bin/arm64/quarkdrive-webdav
- name: 设置 Docker 镜像标签
id: vars
run: |
ref="${{ github.ref }}"
if [[ "$ref" == "refs/heads/main" ]]; then
echo "tag=latest" >> $GITHUB_OUTPUT
elif [[ "$ref" == refs/tags/* ]]; then
echo "tag=${ref#refs/tags/}" >> $GITHUB_OUTPUT
elif [[ "$ref" == refs/heads/* ]]; then
echo "tag=${ref#refs/heads/}" >> $GITHUB_OUTPUT
else
echo "tag=latest" >> $GITHUB_OUTPUT
fi
- name: 登录 GitHub 容器注册表
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: 设置 Buildx
uses: docker/setup-buildx-action@v3
- name: 构建并推送多架构 Docker 镜像
run: |
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/${{ github.repository_owner }}/quarkdrive-webdav:${{ steps.vars.outputs.tag }} \
--push \
-f docker/Dockerfile .