| name: Build and Push API Image | |||||
| name: Build and Push API & Web | |||||
| on: | on: | ||||
| push: | push: | ||||
| branches: | branches: | ||||
| - 'main' | |||||
| - 'deploy/dev' | |||||
| - "main" | |||||
| - "deploy/dev" | |||||
| release: | release: | ||||
| types: [ published ] | |||||
| types: [published] | |||||
| env: | |||||
| DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }} | |||||
| DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} | |||||
| DIFY_WEB_IMAGE_NAME: ${{ vars.DIFY_WEB_IMAGE_NAME || 'langgenius/dify-web' }} | |||||
| DIFY_API_IMAGE_NAME: ${{ vars.DIFY_API_IMAGE_NAME || 'langgenius/dify-api' }} | |||||
| jobs: | jobs: | ||||
| build-and-push: | build-and-push: | ||||
| runs-on: ubuntu-latest | runs-on: ubuntu-latest | ||||
| if: github.event.pull_request.draft == false | if: github.event.pull_request.draft == false | ||||
| strategy: | |||||
| matrix: | |||||
| include: | |||||
| - service_name: "web" | |||||
| image_name_env: "DIFY_WEB_IMAGE_NAME" | |||||
| context: "web" | |||||
| - service_name: "api" | |||||
| image_name_env: "DIFY_API_IMAGE_NAME" | |||||
| context: "api" | |||||
| steps: | steps: | ||||
| - name: Set up QEMU | - name: Set up QEMU | ||||
| uses: docker/setup-qemu-action@v3 | uses: docker/setup-qemu-action@v3 | ||||
| - name: Login to Docker Hub | - name: Login to Docker Hub | ||||
| uses: docker/login-action@v2 | uses: docker/login-action@v2 | ||||
| with: | with: | ||||
| username: ${{ secrets.DOCKERHUB_USER }} | |||||
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |||||
| username: ${{ env.DOCKERHUB_USER }} | |||||
| password: ${{ env.DOCKERHUB_TOKEN }} | |||||
| - name: Extract metadata (tags, labels) for Docker | - name: Extract metadata (tags, labels) for Docker | ||||
| id: meta | id: meta | ||||
| uses: docker/metadata-action@v5 | uses: docker/metadata-action@v5 | ||||
| with: | with: | ||||
| images: langgenius/dify-api | |||||
| images: ${{ env[matrix.image_name_env] }} | |||||
| tags: | | tags: | | ||||
| type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} | type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} | ||||
| type=ref,event=branch | type=ref,event=branch | ||||
| - name: Build and push | - name: Build and push | ||||
| uses: docker/build-push-action@v5 | uses: docker/build-push-action@v5 | ||||
| with: | with: | ||||
| context: "{{defaultContext}}:api" | |||||
| context: "{{defaultContext}}:${{ matrix.context }}" | |||||
| platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }} | platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }} | ||||
| build-args: | | |||||
| COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} | |||||
| build-args: COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} | |||||
| push: true | push: true | ||||
| tags: ${{ steps.meta.outputs.tags }} | tags: ${{ steps.meta.outputs.tags }} | ||||
| labels: ${{ steps.meta.outputs.labels }} | labels: ${{ steps.meta.outputs.labels }} | ||||
| cache-from: type=gha | cache-from: type=gha | ||||
| cache-to: type=gha,mode=max | cache-to: type=gha,mode=max | ||||
| - name: Deploy to server | |||||
| if: github.ref == 'refs/heads/deploy/dev' | |||||
| uses: appleboy/ssh-action@v0.1.8 | |||||
| with: | |||||
| host: ${{ secrets.SSH_HOST }} | |||||
| username: ${{ secrets.SSH_USER }} | |||||
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |||||
| script: | | |||||
| ${{ secrets.SSH_SCRIPT }} | 
| name: Build and Push WEB Image | |||||
| on: | |||||
| push: | |||||
| branches: | |||||
| - 'main' | |||||
| - 'deploy/dev' | |||||
| release: | |||||
| types: [ published ] | |||||
| jobs: | |||||
| build-and-push: | |||||
| runs-on: ubuntu-latest | |||||
| if: github.event.pull_request.draft == false | |||||
| steps: | |||||
| - name: Set up QEMU | |||||
| uses: docker/setup-qemu-action@v3 | |||||
| - name: Set up Docker Buildx | |||||
| uses: docker/setup-buildx-action@v3 | |||||
| - name: Login to Docker Hub | |||||
| uses: docker/login-action@v2 | |||||
| with: | |||||
| username: ${{ secrets.DOCKERHUB_USER }} | |||||
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |||||
| - name: Extract metadata (tags, labels) for Docker | |||||
| id: meta | |||||
| uses: docker/metadata-action@v5 | |||||
| with: | |||||
| images: langgenius/dify-web | |||||
| tags: | | |||||
| type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} | |||||
| type=ref,event=branch | |||||
| type=sha,enable=true,priority=100,prefix=,suffix=,format=long | |||||
| type=raw,value=${{ github.ref_name }},enable=${{ startsWith(github.ref, 'refs/tags/') }} | |||||
| - name: Build and push | |||||
| uses: docker/build-push-action@v5 | |||||
| with: | |||||
| context: "{{defaultContext}}:web" | |||||
| platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }} | |||||
| build-args: | | |||||
| COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} | |||||
| push: true | |||||
| tags: ${{ steps.meta.outputs.tags }} | |||||
| labels: ${{ steps.meta.outputs.labels }} | |||||
| cache-from: type=gha | |||||
| cache-to: type=gha,mode=max | |||||
| - name: Deploy to server | |||||
| if: github.ref == 'refs/heads/deploy/dev' | |||||
| uses: appleboy/ssh-action@v0.1.8 | |||||
| with: | |||||
| host: ${{ secrets.SSH_HOST }} | |||||
| username: ${{ secrets.SSH_USER }} | |||||
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |||||
| script: | | |||||
| ${{ secrets.SSH_SCRIPT }} | 
| name: Deploy Dev | |||||
| on: | |||||
| workflow_run: | |||||
| workflows: ["Build and Push API & Web"] | |||||
| branches: | |||||
| - "deploy/dev" | |||||
| types: | |||||
| - completed | |||||
| jobs: | |||||
| deploy: | |||||
| runs-on: ubuntu-latest | |||||
| if: | | |||||
| github.event.workflow_run.conclusion == 'success' | |||||
| steps: | |||||
| - name: Deploy to server | |||||
| uses: appleboy/ssh-action@v0.1.8 | |||||
| with: | |||||
| host: ${{ secrets.SSH_HOST }} | |||||
| username: ${{ secrets.SSH_USER }} | |||||
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |||||
| script: | | |||||
| ${{ vars.SSH_SCRIPT || secrets.SSH_SCRIPT }} | 
| # Variables | |||||
| DOCKER_REGISTRY=langgenius | |||||
| WEB_IMAGE=$(DOCKER_REGISTRY)/dify-web | |||||
| API_IMAGE=$(DOCKER_REGISTRY)/dify-api | |||||
| VERSION=latest | |||||
| # Build Docker images | |||||
| build-web: | |||||
| @echo "Building web Docker image: $(WEB_IMAGE):$(VERSION)..." | |||||
| docker build -t $(WEB_IMAGE):$(VERSION) ./web | |||||
| @echo "Web Docker image built successfully: $(WEB_IMAGE):$(VERSION)" | |||||
| build-api: | |||||
| @echo "Building API Docker image: $(API_IMAGE):$(VERSION)..." | |||||
| docker build -t $(API_IMAGE):$(VERSION) ./api | |||||
| @echo "API Docker image built successfully: $(API_IMAGE):$(VERSION)" | |||||
| # Push Docker images | |||||
| push-web: | |||||
| @echo "Pushing web Docker image: $(WEB_IMAGE):$(VERSION)..." | |||||
| docker push $(WEB_IMAGE):$(VERSION) | |||||
| @echo "Web Docker image pushed successfully: $(WEB_IMAGE):$(VERSION)" | |||||
| push-api: | |||||
| @echo "Pushing API Docker image: $(API_IMAGE):$(VERSION)..." | |||||
| docker push $(API_IMAGE):$(VERSION) | |||||
| @echo "API Docker image pushed successfully: $(API_IMAGE):$(VERSION)" | |||||
| # Build all images | |||||
| build-all: build-web build-api | |||||
| # Push all images | |||||
| push-all: push-web push-api | |||||
| build-push-api: build-api push-api | |||||
| build-push-web: build-web push-web | |||||
| # Build and push all images | |||||
| build-push-all: build-all push-all | |||||
| @echo "All Docker images have been built and pushed." | |||||
| # Phony targets | |||||
| .PHONY: build-web build-api push-web push-api build-all push-all build-push-all |