build-push.yml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. name: Build and Push API & Web
  2. on:
  3. push:
  4. branches:
  5. - "main"
  6. - "deploy/dev"
  7. release:
  8. types: [published]
  9. concurrency:
  10. group: build-push-${{ github.head_ref || github.run_id }}
  11. cancel-in-progress: true
  12. env:
  13. DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
  14. DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
  15. DIFY_WEB_IMAGE_NAME: ${{ vars.DIFY_WEB_IMAGE_NAME || 'langgenius/dify-web' }}
  16. DIFY_API_IMAGE_NAME: ${{ vars.DIFY_API_IMAGE_NAME || 'langgenius/dify-api' }}
  17. jobs:
  18. build:
  19. runs-on: ${{ matrix.platform == 'linux/arm64' && 'arm64_runner' || 'ubuntu-latest' }}
  20. if: github.repository == 'langgenius/dify'
  21. strategy:
  22. matrix:
  23. include:
  24. - service_name: "build-api-amd64"
  25. image_name_env: "DIFY_API_IMAGE_NAME"
  26. context: "api"
  27. platform: linux/amd64
  28. - service_name: "build-api-arm64"
  29. image_name_env: "DIFY_API_IMAGE_NAME"
  30. context: "api"
  31. platform: linux/arm64
  32. - service_name: "build-web-amd64"
  33. image_name_env: "DIFY_WEB_IMAGE_NAME"
  34. context: "web"
  35. platform: linux/amd64
  36. - service_name: "build-web-arm64"
  37. image_name_env: "DIFY_WEB_IMAGE_NAME"
  38. context: "web"
  39. platform: linux/arm64
  40. steps:
  41. - name: Prepare
  42. run: |
  43. platform=${{ matrix.platform }}
  44. echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
  45. - name: Login to Docker Hub
  46. uses: docker/login-action@v3
  47. with:
  48. username: ${{ env.DOCKERHUB_USER }}
  49. password: ${{ env.DOCKERHUB_TOKEN }}
  50. - name: Set up QEMU
  51. uses: docker/setup-qemu-action@v3
  52. - name: Set up Docker Buildx
  53. uses: docker/setup-buildx-action@v3
  54. - name: Extract metadata for Docker
  55. id: meta
  56. uses: docker/metadata-action@v5
  57. with:
  58. images: ${{ env[matrix.image_name_env] }}
  59. - name: Build Docker image
  60. id: build
  61. uses: docker/build-push-action@v6
  62. with:
  63. context: "{{defaultContext}}:${{ matrix.context }}"
  64. platforms: ${{ matrix.platform }}
  65. build-args: COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
  66. labels: ${{ steps.meta.outputs.labels }}
  67. outputs: type=image,name=${{ env[matrix.image_name_env] }},push-by-digest=true,name-canonical=true,push=true
  68. cache-from: type=gha,scope=${{ matrix.service_name }}
  69. cache-to: type=gha,mode=max,scope=${{ matrix.service_name }}
  70. - name: Export digest
  71. run: |
  72. mkdir -p /tmp/digests
  73. digest="${{ steps.build.outputs.digest }}"
  74. touch "/tmp/digests/${digest#sha256:}"
  75. - name: Upload digest
  76. uses: actions/upload-artifact@v4
  77. with:
  78. name: digests-${{ matrix.context }}-${{ env.PLATFORM_PAIR }}
  79. path: /tmp/digests/*
  80. if-no-files-found: error
  81. retention-days: 1
  82. create-manifest:
  83. needs: build
  84. runs-on: ubuntu-latest
  85. if: github.repository == 'langgenius/dify'
  86. strategy:
  87. matrix:
  88. include:
  89. - service_name: "merge-api-images"
  90. image_name_env: "DIFY_API_IMAGE_NAME"
  91. context: "api"
  92. - service_name: "merge-web-images"
  93. image_name_env: "DIFY_WEB_IMAGE_NAME"
  94. context: "web"
  95. steps:
  96. - name: Download digests
  97. uses: actions/download-artifact@v4
  98. with:
  99. path: /tmp/digests
  100. pattern: digests-${{ matrix.context }}-*
  101. merge-multiple: true
  102. - name: Login to Docker Hub
  103. uses: docker/login-action@v3
  104. with:
  105. username: ${{ env.DOCKERHUB_USER }}
  106. password: ${{ env.DOCKERHUB_TOKEN }}
  107. - name: Extract metadata for Docker
  108. id: meta
  109. uses: docker/metadata-action@v5
  110. with:
  111. images: ${{ env[matrix.image_name_env] }}
  112. tags: |
  113. type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }}
  114. type=ref,event=branch
  115. type=sha,enable=true,priority=100,prefix=,suffix=,format=long
  116. type=raw,value=${{ github.ref_name }},enable=${{ startsWith(github.ref, 'refs/tags/') }}
  117. - name: Create manifest list and push
  118. working-directory: /tmp/digests
  119. run: |
  120. docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
  121. $(printf '${{ env[matrix.image_name_env] }}@sha256:%s ' *)
  122. - name: Inspect image
  123. run: |
  124. docker buildx imagetools inspect ${{ env[matrix.image_name_env] }}:${{ steps.meta.outputs.version }}