From e47917cbf64dad7955815083a280a88a87475e21 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Fri, 27 Dec 2024 13:56:15 +0800 Subject: [PATCH] ci: Add github action for build and push --- .dockerignore | 4 + .github/workflows/build-and-push.yml | 113 +++++++++++++++++++++++++++ Dockerfile | 32 ++++++-- frontend/.gitignore | 1 + 4 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/build-and-push.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..09fdd5ff8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +**/node_modules/ +**/.node/ +**/dist/ +**/pnpm-lock.yaml diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml new file mode 100644 index 000000000..42c5f85f9 --- /dev/null +++ b/.github/workflows/build-and-push.yml @@ -0,0 +1,113 @@ +name: build-and-push + +run-name: 构建镜像并推送仓库 ${{ github.event.inputs.dockerImageTag }} (${{ github.event.inputs.registry }}) + +on: + workflow_dispatch: + inputs: + dockerImageTag: + description: 'Docker Image Tag' + default: 'v1.0.0-dev' + required: true + architecture: + description: 'Architecture' + required: true + default: 'linux/amd64' + type: choice + options: + - linux/amd64 + - linux/arm64 + - linux/amd64,linux/arm64 + registry: + description: 'Push To Registry' + required: true + default: 'fit2cloud-registry' + type: choice + options: + - fit2cloud-registry + - dockerhub + - dockerhub, fit2cloud-registry + +jobs: + build-and-push-to-fit2cloud-registry: + if: ${{ contains(github.event.inputs.registry, 'fit2cloud') }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + - name: Prepare + id: prepare + run: | + DOCKER_IMAGE=${{ secrets.FIT2CLOUD_REGISTRY_HOST }}/cordys/cordys-crm + DOCKER_PLATFORMS=${{ github.event.inputs.architecture }} + TAG_NAME=${{ github.event.inputs.dockerImageTag }} + if [[ ${TAG_NAME} == *dev* ]]; then + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}" + else + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:latest" + fi + echo ::set-output name=buildx_args::--platform ${DOCKER_PLATFORMS} \ + --build-arg DOCKER_IMAGE_TAG=${{ github.event.inputs.dockerImageTag }} --build-arg BUILD_AT=$(TZ=Asia/Shanghai date +'%Y-%m-%dT%H:%M') --build-arg GITHUB_COMMIT=${GITHUB_SHA::8} --no-cache \ + ${DOCKER_IMAGE_TAGS} . + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GH_TOKEN }} + - name: Login to FIT2CLOUD Registry + uses: docker/login-action@v3 + with: + registry: ${{ secrets.FIT2CLOUD_REGISTRY_HOST }} + username: ${{ secrets.FIT2CLOUD_REGISTRY_USERNAME }} + password: ${{ secrets.FIT2CLOUD_REGISTRY_PASSWORD }} + - name: Docker Buildx (build-and-push) + run: | + docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }} -f installer/Dockerfile + + build-and-push-to-dockerhub: + if: ${{ contains(github.event.inputs.registry, 'dockerhub') }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + - name: Prepare + id: prepare + run: | + DOCKER_IMAGE=cordys/cordys-crm + DOCKER_PLATFORMS=${{ github.event.inputs.architecture }} + TAG_NAME=${{ github.event.inputs.dockerImageTag }} + if [[ ${TAG_NAME} == *dev* ]]; then + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}" + else + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:latest" + fi + echo ::set-output name=buildx_args::--platform ${DOCKER_PLATFORMS} \ + --build-arg DOCKER_IMAGE_TAG=${{ github.event.inputs.dockerImageTag }} --build-arg BUILD_AT=$(TZ=Asia/Shanghai date +'%Y-%m-%dT%H:%M') --build-arg GITHUB_COMMIT=${GITHUB_SHA::8} --no-cache \ + ${DOCKER_IMAGE_TAGS} . + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GH_TOKEN }} + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Docker Buildx (build-and-push) + run: | + docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }} -f installer/Dockerfile diff --git a/Dockerfile b/Dockerfile index c1827cd9b..72a2540f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,35 @@ +FROM node:22-slim AS frontend + +WORKDIR /frontend +COPY frontend /frontend +RUN npm install -g pnpm && \ + pnpm install && \ + pnpm run build + + + +FROM eclipse-temurin:21-jdk AS build +WORKDIR /build +COPY . /build +COPY --from=frontend /frontend/packages/web/dist /build/frontend/packages/web/dist +COPY --from=frontend /frontend/packages/mobile/dist /build/frontend/packages/mobile/dist +RUN ./mvnw clean package -DskipTests -pl '!frontend' && \ + cd backend/crm/target/dependency && jar -xf ../*.jar + + + FROM registry.fit2cloud.com/metersphere/alpine-openjdk21-jre LABEL maintainer="FIT2CLOUD " ARG CRM_VERSION=main ARG MODULE=crm -ARG DEPENDENCY=backend/${MODULE}/target/dependency +ARG DEPENDENCY=/build/backend/${MODULE}/target/dependency -COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib -COPY ${DEPENDENCY}/META-INF /app/META-INF -COPY ${DEPENDENCY}/BOOT-INF/classes /app - -# web -COPY backend/${MODULE}/src/main/resources/packages /app/static +COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib +COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF +COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app +COPY --from=build /build/backend/${MODULE}/src/main/resources/packages /app/static ENV JAVA_CLASSPATH=/app:/app/lib/* ENV JAVA_MAIN_CLASS=io.cordys.Application diff --git a/frontend/.gitignore b/frontend/.gitignore index 65e0af1fb..1946b4336 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -25,3 +25,4 @@ coverage *.sw? *.tsbuildinfo +.node/