From 70ee4e1b3ea9b5fa59fbe3e60733c5601804fc9e Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Tue, 9 Oct 2018 13:26:43 -0500
Subject: [PATCH] Build a docker container storing only the frontent assets

* Run as part of gitlab:assets:compile job

* Will be used by omnibus-gitlab and the CNG images to avoid
compiling multiple times

https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22235
---
 .gitlab-ci.yml             |  8 ++++++++
 Dockerfile.assets          |  4 ++++
 scripts/build_assets_image | 21 +++++++++++++++++++++
 3 files changed, 33 insertions(+)
 create mode 100644 Dockerfile.assets
 create mode 100755 scripts/build_assets_image

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bcb0c8fbca8f0..b03b5c423767b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -694,7 +694,10 @@ gitlab:setup-mysql:
 # Frontend-related jobs
 gitlab:assets:compile:
   <<: *dedicated-no-docs-and-no-qa-pull-cache-job
+  image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.4-git-2.18-chrome-69.0-node-8.x-yarn-1.2-graphicsmagick-1.3.29-docker-18.06.1
   dependencies: []
+  services:
+    - docker:stable-dind
   variables:
     NODE_ENV: "production"
     RAILS_ENV: "production"
@@ -703,18 +706,23 @@ gitlab:assets:compile:
     WEBPACK_REPORT: "true"
     # we override the max_old_space_size to prevent OOM errors
     NODE_OPTIONS: --max_old_space_size=3584
+    DOCKER_DRIVER: overlay2
+    DOCKER_HOST: tcp://docker:2375
   script:
     - date
     - yarn install --frozen-lockfile --production --cache-folder .yarn-cache
     - date
     - free -m
     - bundle exec rake gitlab:assets:compile
+    - scripts/build_assets_image
   artifacts:
     name: webpack-report
     expire_in: 31d
     paths:
       - webpack-report/
       - public/assets/
+  tags:
+    - docker
 
 karma:
   <<: *dedicated-no-docs-pull-cache-job
diff --git a/Dockerfile.assets b/Dockerfile.assets
new file mode 100644
index 0000000000000..403d16cc4ab1b
--- /dev/null
+++ b/Dockerfile.assets
@@ -0,0 +1,4 @@
+# Simple container to store assets for later use
+FROM scratch
+ADD public/assets /assets/
+CMD /bin/true
diff --git a/scripts/build_assets_image b/scripts/build_assets_image
new file mode 100755
index 0000000000000..218606b9a4028
--- /dev/null
+++ b/scripts/build_assets_image
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Generate the image name based on the project this is being run in
+ASSETS_IMAGE_NAME=$(echo ${CI_PROJECT_NAME} |
+   awk '{
+    split($1, p, "-");
+    interim = sprintf("%s-assets-%s", p[1], p[2]);
+    sub(/-$/, "", interim);
+    print interim
+  }'
+)
+
+ASSETS_IMAGE_PATH=${CI_REGISTRY}/${CI_PROJECT_PATH}/${ASSETS_IMAGE_NAME}
+
+mkdir -p assets_container.build/public
+cp -r public/assets assets_container.build/public/
+cp Dockerfile.assets assets_container.build/
+docker build -t ${ASSETS_IMAGE_PATH}:${CI_COMMIT_REF_NAME} -f assets_container.build/Dockerfile.assets assets_container.build/
+docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
+docker push ${ASSETS_IMAGE_PATH}
+
-- 
GitLab