From 23c85cf032613ebdd734daea534ddf8275499a3d Mon Sep 17 00:00:00 2001
From: Oreon Lothamer <73498677+oreonl@users.noreply.github.com>
Date: Wed, 2 Oct 2024 07:55:40 -1000
Subject: [PATCH] build ee-extra docker image (#47960)

---
 .github/actions/build-ee-extra/action.yml | 126 ++++++++++++++++++++++
 .github/workflows/uberjar.yml             |  21 +++-
 2 files changed, 146 insertions(+), 1 deletion(-)
 create mode 100644 .github/actions/build-ee-extra/action.yml

diff --git a/.github/actions/build-ee-extra/action.yml b/.github/actions/build-ee-extra/action.yml
new file mode 100644
index 00000000000..4d4423fd32c
--- /dev/null
+++ b/.github/actions/build-ee-extra/action.yml
@@ -0,0 +1,126 @@
+name: Build ee-extra
+description: Build Metabase Enterprise Edition with extra features
+
+inputs:
+  iam-role:
+    description: "The IAM role to assume"
+    required: true
+
+runs:
+  using: composite
+  steps:
+    - name: Prepare Java
+      uses: actions/setup-java@v3
+      with:
+        java-version: '17'
+        distribution: 'temurin'
+    - name: Reveal its original version.properties
+      run: jar xf  ./bin/docker/metabase.jar version.properties && cat version.properties
+      shell: bash
+    - name: get major version
+      id: major_version
+      run: echo "major_version=$(cat version.properties | grep 'tag=' | cut -d'.' -f2)" >> $GITHUB_OUTPUT
+      shell: bash
+    - name: get drivers registry
+      run: |
+        curl -OL https://raw.githubusercontent.com/metabase/metabase-registry/main/registry.yaml
+      shell: bash
+    - uses: actions/setup-node@v4
+      with:
+        node-version: lts/Hydrogen # 18.x.x
+    - run: rm package.json && npm install yaml
+      shell: bash
+    - name: parse drivers registry
+      uses: actions/github-script@v7
+      id: drivers_registry
+      with:
+        script: | # js
+          const { parse } = require('yaml');
+          const fs = require('fs');
+          const registry = parse(fs.readFileSync('registry.yaml', 'utf8'));
+
+          const drivers = registry.drivers;
+          const majorVersion = '${{ steps.major_version.outputs.major_version }}';
+
+          const getDriverUrl = (driverName) => {
+            const driver = drivers.find(driver => driver.name === driverName);
+
+            if (!driver) {
+              throw new Error(`Driver ${driverName} not found in the registry`);
+            }
+
+            const driverUrl = driver.versions[majorVersion] ?? driver.versions.default;
+
+            if (!driverUrl) {
+              throw new Error(`Driver ${driverName} version ${majorVersion} not found in the registry`);
+            }
+
+            return driverUrl;
+          };
+
+          const extraDrivers = {
+            firebolt: getDriverUrl('firebolt'),
+            starburst: getDriverUrl('starburst'),
+            exasol: getDriverUrl('exasol'),
+            exasol_jdbc: drivers.find(d => d.name === 'exasol').deps[0],
+            clickhouse: getDriverUrl('clickhouse'),
+            ocient: getDriverUrl('ocient'),
+            materialize: getDriverUrl('materialize'),
+          };
+
+          console.log(extraDrivers);
+
+          return extraDrivers;
+    - name: Download Firebolt driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).firebolt }}
+      working-directory: modules
+      shell: bash
+    - name: Download Starburst driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).starburst }}
+      shell: bash
+      working-directory: modules
+    - name: Download Exasol driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).exasol }}
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).exasol_jdbc }}
+      shell: bash
+      working-directory: modules
+    - name: Download Clickhouse driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).clickhouse }}
+      shell: bash
+      working-directory: modules
+    - name: Download Ocient driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).ocient }}
+      shell: bash
+      working-directory: modules
+    - name: Download Materialize driver
+      run: |
+        curl -OL ${{ fromJson(steps.drivers_registry.outputs.result).materialize }}
+      shell: bash
+      working-directory: modules
+    - name: Bundle additional drivers into the Uberjar
+      run: jar uf bin/docker/metabase.jar modules/*.jar
+      shell: bash
+    - name: Launch uberjar
+      run: java -jar ./bin/docker/metabase.jar &
+      shell: bash
+    - name: Wait for Metabase to start
+      run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
+      shell: bash
+    - name: Kill the java process
+      run: pkill -f metabase.jar
+      shell: bash
+    - name: configure aws credentials
+      if: ${{ github.ref_name == 'master' }}
+      uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ inputs.iam-role }}
+        role-session-name: GitHub_to_AWS_via_FederatedOIDC
+        aws-region: us-east-1
+    - name: Login to Amazon ECR
+      if: ${{ github.ref_name == 'master' }}
+      uses: aws-actions/amazon-ecr-login@v2
diff --git a/.github/workflows/uberjar.yml b/.github/workflows/uberjar.yml
index da52399fc15..ea9e294f0fa 100644
--- a/.github/workflows/uberjar.yml
+++ b/.github/workflows/uberjar.yml
@@ -80,12 +80,15 @@ jobs:
     needs: check_jar_health
     strategy:
       matrix:
-        edition: [ee, oss]
+        edition: [ee, oss, ee-extra]
     services:
       registry:
         image: registry:2
         ports:
           - 5000:5000
+    permissions:
+      id-token: write
+      contents: read
     steps:
     - name: Extract and clean branch name
       shell: bash
@@ -98,12 +101,24 @@ jobs:
       with:
         ref: ${{ github.event.inputs.commit }}
     - name: Download uploaded artifacts to insert into container
+      if: ${{ matrix.edition != 'ee-extra' }}
       uses: actions/download-artifact@v4
       with:
         name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
         path: bin/docker/
+    - name: Download uploaded artifacts to insert into container
+      if: ${{ matrix.edition == 'ee-extra' }}
+      uses: actions/download-artifact@v4
+      with:
+        name: metabase-ee-${{ github.sha }}-uberjar
+        path: bin/docker/
     - name: Move the ${{ matrix.edition }} uberjar to the context dir
       run: mv bin/docker/target/uberjar/metabase.jar bin/docker/.
+    - name: Add partner drivers to the container
+      if: ${{ matrix.edition == 'ee-extra' }}
+      uses: ./.github/actions/build-ee-extra
+      with:
+        iam-role: ${{ secrets.METABASE_EE_EXTRA_IAM_ROLE }}
     - name: Set up Docker Buildx
       id: buildx
       uses: docker/setup-buildx-action@v2.5.0
@@ -141,6 +156,10 @@ jobs:
       if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
       run: docker tag localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-oss ${{ github.repository_owner }}/metabase-head:latest && docker push ${{ github.repository_owner }}/metabase-head:latest
 
+    - name: Retag and push images if master (ee-extra)
+      if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee-extra' }}
+      run: docker tag localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-ee-extra ${{ secrets.METABASE_EE_EXTRA_CONTAINER_REGISTRY }}/metabase-enterprise-head:latest && docker push ${{ secrets.METABASE_EE_EXTRA_CONTAINER_REGISTRY }}/metabase-enterprise-head:latest
+
     - name: Retag and push images if dev branch
       if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee' }}
       run: docker tag localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-ee ${{ github.repository_owner }}/metabase-dev:${{ steps.extract_branch.outputs.branch }} && docker push ${{ github.repository_owner }}/metabase-dev:${{ steps.extract_branch.outputs.branch }}
-- 
GitLab