| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| name: Build-Images-Push-Docker |
| env: |
| DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USER }} |
| DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} |
| on: |
| push: |
| tags: |
| - 'v*' |
| jobs: |
| build-and-push-builder: |
| name: Build and Push devlake builder |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v2 |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v2 |
| - name: Login to DockerHub |
| uses: docker/login-action@v2 |
| with: |
| username: ${{ env.DOCKERHUB_USERNAME }} |
| password: ${{ env.DOCKERHUB_TOKEN }} |
| - name: Build and push lake image |
| uses: docker/build-push-action@v3 |
| with: |
| context: . |
| push: true |
| target: builder |
| tags: ${{ secrets.DOCKERHUB_OWNER }}/devlake:amd64-builder |
| platforms: linux/amd64 |
| cache-from: ${{ secrets.DOCKERHUB_OWNER }}/devlake:amd64-builder |
| cache-to: ${{ secrets.DOCKERHUB_OWNER }}/devlake:amd64-builder |
| build-and-push-base: |
| name: Build and Push devlake base |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v2 |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v2 |
| - name: Login to DockerHub |
| uses: docker/login-action@v2 |
| with: |
| username: ${{ env.DOCKERHUB_USERNAME }} |
| password: ${{ env.DOCKERHUB_TOKEN }} |
| - name: Build and push lake image |
| uses: docker/build-push-action@v3 |
| with: |
| context: . |
| push: true |
| target: base |
| tags: ${{ secrets.DOCKERHUB_OWNER }}/devlake:base |
| platforms: linux/amd64,linux/arm64 |
| cache-from: ${{ secrets.DOCKERHUB_OWNER }}/devlake:base |
| cache-to: ${{ secrets.DOCKERHUB_OWNER }}/devlake:base |
| build-devlake: |
| needs: build-and-push-builder |
| name: Build and cache devlake |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| platform: ['arm64', 'amd64'] |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Get short sha |
| id: get_short_sha |
| run: echo "SHORT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT |
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v2 |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v2 |
| - name: Login to DockerHub |
| uses: docker/login-action@v2 |
| with: |
| username: ${{ env.DOCKERHUB_USERNAME }} |
| password: ${{ env.DOCKERHUB_TOKEN }} |
| - uses: actions/cache@v3 |
| with: |
| path: /tmp/devlake-build-cache-${{ matrix.platform }} |
| key: buildx-devlake-build-cache-${{ github.run_id }}-${{ matrix.platform }} |
| - name: Build and cache lake build |
| uses: docker/build-push-action@v3 |
| with: |
| context: . |
| push: false |
| target: build |
| tags: ${{ secrets.DOCKERHUB_OWNER }}/devlake:build-cache-${{ matrix.platform }} |
| platforms: linux/${{ matrix.platform }} |
| cache-from: ${{ secrets.DOCKERHUB_OWNER }}/devlake:amd64-builder |
| cache-to: type=local,mode=min,dest=/tmp/devlake-build-cache-${{ matrix.platform }} |
| build-args: | |
| TAG=${{ github.ref_name }} |
| SHA=${{ steps.get_short_sha.outputs.SHORT_SHA }} |
| build-and-push-devlake: |
| needs: [build-devlake, build-and-push-base] |
| name: Build and Push devlake image |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Get short sha |
| id: get_short_sha |
| run: echo "SHORT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT |
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v2 |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v2 |
| - name: Login to DockerHub |
| uses: docker/login-action@v2 |
| with: |
| username: ${{ env.DOCKERHUB_USERNAME }} |
| password: ${{ env.DOCKERHUB_TOKEN }} |
| - uses: actions/cache@v3 |
| with: |
| path: /tmp/devlake-build-cache-amd64 |
| key: buildx-devlake-build-cache-${{ github.run_id }}-amd64 |
| - uses: actions/cache@v3 |
| with: |
| path: /tmp/devlake-build-cache-arm64 |
| key: buildx-devlake-build-cache-${{ github.run_id }}-arm64 |
| - name: Get push tags |
| id: get_push_tags |
| run: | |
| image_name=${{ secrets.DOCKERHUB_OWNER }}/devlake |
| if printf ${{ github.ref_name }} | grep -Pq '^v(\d+).(\d+).(\d+)$'; then |
| echo "TAGS=${image_name}:latest,${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT |
| else |
| echo "TAGS=${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT |
| fi |
| - name: Build and push lake image |
| uses: docker/build-push-action@v3 |
| with: |
| context: . |
| push: true |
| tags: ${{ steps.get_push_tags.outputs.TAGS }} |
| platforms: linux/amd64,linux/arm64 |
| cache-from: | |
| ${{ secrets.DOCKERHUB_OWNER }}/devlake:amd64-builder |
| ${{ secrets.DOCKERHUB_OWNER }}/devlake:base |
| type=local,src=/tmp/devlake-build-cache-amd64 |
| type=local,src=/tmp/devlake-build-cache-arm64 |
| build-args: | |
| TAG=${{ github.ref_name }} |
| SHA=${{ steps.get_short_sha.outputs.SHORT_SHA }} |
| - name: Clear cache |
| uses: actions/github-script@v6 |
| if: always() |
| with: |
| script: | |
| for (const arch of ['amd64', 'arm64']) { |
| try { |
| await github.rest.actions.deleteActionsCacheByKey({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| key: `buildx-devlake-build-cache-${context.runId}-${arch}`, |
| }) |
| console.log(`Clear cache buildx-devlake-build-cache-${context.runId}-${arch}`) |
| } catch (e) { |
| console.warn(`Error clear cache buildx-devlake-build-cache-${context.runId}-${arch}: ${e}`) |
| } |
| } |
| |
| build-and-push-other-image: |
| name: Build and Push ${{ matrix.build.name }} image |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| build: |
| - name: config-ui |
| image: devlake-config-ui |
| context: config-ui |
| - name: grafana |
| image: devlake-dashboard |
| context: grafana |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Set up QEMU |
| uses: docker/setup-qemu-action@v2 |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v2 |
| - name: Login to DockerHub |
| uses: docker/login-action@v2 |
| with: |
| username: ${{ env.DOCKERHUB_USERNAME }} |
| password: ${{ env.DOCKERHUB_TOKEN }} |
| - name: Get push tags |
| id: get_push_tags |
| run: | |
| image_name=${{ secrets.DOCKERHUB_OWNER }}/${{ matrix.build.image }} |
| if printf ${{ github.ref_name }} | grep -Pq '^v(\d+).(\d+).(\d+)$'; then |
| echo "TAGS=${image_name}:latest,${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT |
| else |
| echo "TAGS=${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT |
| fi |
| - name: Build and push ${{ matrix.build.name }} image |
| uses: docker/build-push-action@v3 |
| with: |
| context: ${{ matrix.build.context }} |
| push: true |
| tags: ${{ steps.get_push_tags.outputs.TAGS }} |
| platforms: linux/amd64,linux/arm64 |
| |