diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f87b7b48e83a8cfde43aba3965df2a28ee81f42f..0dfc4a59c3771ccc7db05203d2ab872e1e875748 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -64,142 +64,52 @@ update:
   except:
     - tags
 
-.target:
+build-target:
   stage: build
   except:
     - tags
   script:
-    - make -C gluon GLUON_SITEDIR="$CI_PROJECT_DIR" GLUON_TARGET="$GLUON_TARGET" GLUON_AUTOUPDATER_BRANCH=stable GLUON_AUTOUPDATER_ENABLED=1 FFS_BUILD_DATE=$(cat build.date) BROKEN="$BROKEN" V=1 -j`nproc`
+    - make -C gluon GLUON_SITEDIR="$CI_PROJECT_DIR" GLUON_TARGET="$TARGET" GLUON_AUTOUPDATER_BRANCH=stable GLUON_AUTOUPDATER_ENABLED=1 FFS_BUILD_DATE=$(cat build.date) BROKEN="$BROKEN" V=1 -j`nproc`
   artifacts: 
     paths:
       - gluon/output/
     expire_in: 1 day
   cache: []
-
-target:ath79-generic:
-  extends: .target
-  variables:
-    GLUON_TARGET: ath79-generic
-
-target:ath79-nand:
-  extends: .target
-  variables:
-    GLUON_TARGET: ath79-nand
-
-target:ath79-mikrotik:
-  extends: .target
-  variables:
-    GLUON_TARGET: ath79-mikrotik
-
-target:bcm27xx-bcm2708:
-  extends: .target
-  variables:
-    GLUON_TARGET: bcm27xx-bcm2708
-
-target:bcm27xx-bcm2709:
-  extends: .target
-  variables:
-    GLUON_TARGET: bcm27xx-bcm2709
-
-target:ipq40xx-generic:
-  extends: .target
-  variables:
-    GLUON_TARGET: ipq40xx-generic
-
-target:ipq40xx-mikrotik:
-  extends: .target
-  variables:
-    GLUON_TARGET: ipq40xx-mikrotik
-
-target:ipq806x-generic:
-  extends: .target
-  variables:
-    GLUON_TARGET: ipq806x-generic
-
-target:lantiq-xrx200:
-  extends: .target
-  variables:
-    GLUON_TARGET: lantiq-xrx200
-
-target:lantiq-xway:
-  extends: .target
-  variables:
-    GLUON_TARGET: lantiq-xway
-
-target:mediatek-mt7622:
-  extends: .target
-  variables:
-    GLUON_TARGET: mediatek-mt7622
-
-target:mpc85xx-p1010:
-  extends: .target
-  variables:
-    GLUON_TARGET: mpc85xx-p1010
-
-target:mpc85xx-p1020:
-  extends: .target
-  variables:
-    GLUON_TARGET: mpc85xx-p1020
-
-target:ramips-mt7620:
-  extends: .target
-  variables:
-    GLUON_TARGET: ramips-mt7620
-
-target:ramips-mt7621:
-  extends: .target
-  variables:
-    GLUON_TARGET: ramips-mt7621
-
-target:ramips-mt76x8:
-  extends: .target
-  variables:
-    GLUON_TARGET: ramips-mt76x8
-
-target:realtek-rtl838x:
-  extends: .target
-  variables:
-    GLUON_TARGET: realtek-rtl838x
-
-target:rockchip-armv8:
-  extends: .target
-  variables:
-    GLUON_TARGET: rockchip-armv8
-
-target:sunxi-cortexa7:
-  extends: .target
-  variables:
-    GLUON_TARGET: sunxi-cortexa7
-
-target:x86-generic:
-  extends: .target
-  variables:
-    GLUON_TARGET: x86-generic
-
-target:x86-geode:
-  extends: .target
-  variables:
-    GLUON_TARGET: x86-geode
-
-target:x86-legacy:
-  extends: .target
-  variables:
-    GLUON_TARGET: x86-legacy
-
-target:x86-64:
-  extends: .target
-  variables:
-    GLUON_TARGET: x86-64
+  parallel:
+    matrix:
+      - TARGET: armsr-armv7
+      - TARGET: armsr-armv8
+      - TARGET: ath79-generic
+      - TARGET: ath79-nand
+      - TARGET: ath79-mikrotik
+      - TARGET: bcm27xx-bcm2708
+      - TARGET: bcm27xx-bcm2709
+      - TARGET: ipq40xx-generic
+      - TARGET: ipq40xx-mikrotik
+      - TARGET: ipq806x-generic
+      - TARGET: lantiq-xrx200
+      - TARGET: lantiq-xway
+      - TARGET: mediatek-filogic
+      - TARGET: mediatek-mt7622
+      - TARGET: mpc85xx-p1010
+      - TARGET: mpc85xx-p1020
+      - TARGET: ramips-mt7620
+      - TARGET: ramips-mt7621
+      - TARGET: ramips-mt76x8
+      - TARGET: realtek-rtl838x
+      - TARGET: rockchip-armv8
+      - TARGET: sunxi-cortexa7
+      - TARGET: x86-generic
+      - TARGET: x86-geode
+      - TARGET: x86-legacy
+      - TARGET: x86-64
 
 package:
   stage: package
   script:
     - for branch in "stable" "beta" "nightly" "experimental"; do make -C gluon manifest GLUON_AUTOUPDATER_BRANCH="$branch" GLUON_AUTOUPDATER_ENABLED=1 GLUON_SITEDIR="$CI_PROJECT_DIR" FFS_BUILD_DATE=$(cat build.date) V=1 -j`nproc`; done
     - if [ -n "$GLUON_SIGN_KEY" ]; then cd gluon && for branch in "nightly" "experimental"; do ./contrib/sign.sh <(echo "$GLUON_SIGN_KEY") "output/images/sysupgrade/$branch.manifest"; done; fi
-  cache:
-    paths:
-      - gluon/openwrt/dl
-    key: "package"
+  cache: []
   artifacts:
     paths:
       - gluon/output
diff --git a/scripts/generate-gitlab-ci-targets.sh b/scripts/generate-gitlab-ci-targets.sh
index be8b56e0efa9a4f8d51170e652382ae7507ababe..406c46850d23528794e1156612dfe9da88514ff4 100755
--- a/scripts/generate-gitlab-ci-targets.sh
+++ b/scripts/generate-gitlab-ci-targets.sh
@@ -5,10 +5,6 @@ mydir=$(readlink -f "$(dirname "$0")/..")
 
 make -s -C "$mydir/gluon" GLUON_SITEDIR="$mydir" list-targets | while read target; do
 	cat <<EOF
-target:${target}:
-  extends: .target
-  variables:
-    GLUON_TARGET: ${target}
-
+- TARGET: ${target}
 EOF
 done