diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fbdfdba81c069a8ea73e731f39f5bef676a6d01c..2db771d8ea6942e0188374068f29e485e60daf77 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: jangrewe/gitlab-ci-android
+image: dev.funkwhale.audio:5050/funkwhale/funkwhale-android:latest
 
 variables:
   COBERTURA_REPORT: '$CI_PROJECT_DIR/app/build/reports/cobertura.xml'
@@ -6,11 +6,33 @@ variables:
   JACOCO_XML_LOCATION: '$CI_PROJECT_DIR/app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml'
 
 stages:
+  - build_ci_env
   - test
   - visualize
   - build
   - deploy
 
+build_ci_image:
+  stage: build_ci_env
+  image: egon0/docker-with-buildx-and-git:bash
+  tags:
+    - dind
+  services:
+    - docker:20-dind
+  before_script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+  script:
+    - docker build -t $CI_REGISTRY_IMAGE docker
+  after_script:
+    - docker push $CI_REGISTRY_IMAGE
+  rules:
+    - if: '$BUILD_CI_IMAGE'
+  variables:
+    DOCKER_HOST: tcp://docker:2375/
+    DOCKER_DRIVER: overlay2
+    DOCKER_TLS_CERTDIR: ""
+
+
 .gradle-default:
   before_script:
     - export GRADLE_USER_HOME=$(pwd)/.gradle
@@ -50,7 +72,7 @@ test:
   except:
     - tags
   script:
-    - ./gradlew test jacocoTestReport
+    - ./gradlew --no-daemon --stacktrace test jacocoTestReport
     - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION
   artifacts:
     reports:
@@ -77,7 +99,7 @@ build-develop:
   extends: .build
   script:
     - echo -n $PREVIEW_SIGNING_KEY_STORE | base64 -d > app/android.keystore
-    - ./gradlew assembleDebug -Psigning.store=android.keystore -Psigning.store_passphrase=$PREVIEW_SIGNING_KEY_PASS -Psigning.key_passphrase=$PREVIEW_SIGNING_KEY_PASS
+    - ./gradlew --stacktrace --no-daemon assembleDebug -Psigning.store=android.keystore -Psigning.store_passphrase=$PREVIEW_SIGNING_KEY_PASS -Psigning.key_passphrase=$PREVIEW_SIGNING_KEY_PASS
   only:
     - develop
 
@@ -90,14 +112,14 @@ build-release:
   extends: .build
   script:
     - echo -n $SIGNING_KEY_STORE | base64 -d > app/android.keystore
-    - ./gradlew assembleRelease -Psigning.store=android.keystore -Psigning.store_passphrase=$SIGNING_KEY_PASS -Psigning.key_passphrase=$SIGNING_KEY_PASS
+    - ./gradlew --stacktrace --no-daemon assembleRelease -Psigning.store=android.keystore -Psigning.store_passphrase=$SIGNING_KEY_PASS -Psigning.key_passphrase=$SIGNING_KEY_PASS
   only:
     - tags
 
 build-bleeding-edge:
   extends: .build
   script:
-    - ./gradlew assembleDebug
+    - ./gradlew --stacktrace --no-daemon assembleDebug
   except:
     - develop
     - tags
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f597c94ddc142ab3bba5fdb4d1b888ed8f6ff20d
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,17 @@
+FROM debian:stable-slim
+
+ENV ANDROID_COMPILE_SDK=30
+ENV SDK_TOOLS_VERSION=30.0.2
+ENV ANDROID_CMD_TOOLS=7583922
+ENV ANDROID_HOME=/opt/android-sdk-linux
+ENV PATH "/opt/android-sdk-linux/cmdline-tools/bin:${PATH}"
+
+RUN apt-get update && apt-get install --yes openjdk-11-jdk wget tar unzip lib32stdc++6 lib32z1 git
+RUN mkdir -p /opt/android-sdk-linux && cd /opt \
+      && wget -q https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMD_TOOLS}_latest.zip -O android-sdk-tools.zip \
+      && unzip -q android-sdk-tools.zip -d ${ANDROID_HOME} \
+      && rm -f android-sdk-tools.zip \
+      && echo y | sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}" \
+      && echo y | sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" \
+      && echo y | sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${SDK_TOOLS_VERSION}"
+