From 733630401badf79caa358dd2c620d3d87db79c68 Mon Sep 17 00:00:00 2001
From: Neil-Jocelyn Schark <neil-jocelyn.schark@stud.h-da.de>
Date: Fri, 25 Jun 2021 16:34:45 +0000
Subject: [PATCH] Resolve "Improve pipeline speed"

---
 .gitlab-ci.yml                |  5 ++-
 Dockerfile                    | 24 +++++++++--
 build/ci/.build-container.yml | 76 ++++++++++++-----------------------
 build/ci/.containerlab-ci.yml |  2 +-
 build/ci/.deploy-k8s.yml      |  8 ++--
 build/ci/.test.yml            |  5 ++-
 6 files changed, 57 insertions(+), 63 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fbfd9697a..78d4fbdd2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,8 +12,8 @@ workflow:
 
 stages:
   - .pre
-  - test
   - build
+  - test
   - apply
   - integration-test
   - deploy
@@ -29,5 +29,6 @@ include:
   - local: '/build/ci/.build-container.yml'
   - local: '/build/ci/.test.yml'
   - local: '/build/ci/.containerlab-ci.yml'
-  - local: '/build/ci/.deploy-k8s.yml'
   - local: '/build/ci/.uml-autogen-ci.yml'
+  - local: '/build/ci/.deploy-k8s.yml'
+
diff --git a/Dockerfile b/Dockerfile
index b8a7b9cab..4233e034d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,34 @@
-FROM golang:1.16-buster AS builder
+FROM golang:1.16-buster AS installer
 ARG GITLAB_USER
 ARG GITLAB_TOKEN
 ARG BUILDARGS
-WORKDIR /src/gosdn
-COPY . .
+
 RUN apt-get update && apt-get install -y git
 RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
+
+WORKDIR /src/gosdn
+COPY go.* ./
+RUN go mod download
+
+FROM installer as builder
+
+COPY controller.go .
+COPY http.go .
+COPY ./api ./api
+COPY ./cmd ./cmd
+COPY ./database ./database
+COPY ./forks ./forks
+COPY ./interfaces ./interfaces
+COPY ./northbound ./northbound
+COPY ./nucleus ./nucleus
+
 RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn
 
 FROM debian:latest
 EXPOSE 8080
 EXPOSE 55055
 COPY --from=builder /src/gosdn/gosdn .
-COPY --from=builder /src/gosdn/configs ./configs
+COPY ./configs ./configs
 
 ENTRYPOINT [ "./gosdn" ]
 CMD [""]
diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml
index 12dfb819d..642139656 100644
--- a/build/ci/.build-container.yml
+++ b/build/ci/.build-container.yml
@@ -1,64 +1,40 @@
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
 
-.build: &build
+build-docker:
   before_script:
     - echo "override global before script"
-  image: docker:19.03.12
-  services:
-  - name: docker:19.03.12-dind
-    command: ["--registry-mirror", "http://141.100.70.170:6000", "--dns", "1.1.1.1"]
   stage: build
+  allow_failure: false
+  needs: []
   tags:
-    - dind
-  script:
-    - docker info
-    - >
-      docker build \
-        --build-arg GITLAB_USER=$GO_MODULES_USER \
-        --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \
-        --build-arg BUILDARGS=$BUILDARGS \
-        -t $DOCKER_IMAGE_SHA .
-    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
-    - docker push $DOCKER_IMAGE_SHA
-    - docker tag $DOCKER_IMAGE_SHA $TAG
-    - docker tag $DOCKER_IMAGE_SHA registry.code.fbi.h-da.de/cocsn/gosdn:${CI_PIPELINE_ID}
-    - docker push $TAG
+    - shell-builder
 
-build:develop:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:develop
-    BUILDARGS: -race
   rules:
     - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == null
-  <<: *build
-
-build:nightly:develop:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:nightly-develop
-    BUILDARGS: -race
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:develop
+        BUILDARGS: -race
     - if: $CI_NIGHTLY == "develop"
-  <<: *build
-
-build:nightly:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:nightly
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:nightly-develop
+        BUILDARGS: -race
     - if: $CI_NIGHTLY == "mainline"
-  <<: *build
-
-build:merge-request:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:merge-request
-    BUILDARGS: -race
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:nightly
     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
-  <<: *build
-
-build:latest:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:latest
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:merge-request
+        BUILDARGS: -race
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == null
-  <<: *build
\ No newline at end of file
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:latest
+      
+  script:
+   - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+   - docker build --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t $DOCKER_IMAGE_SHA .
+   - docker push $DOCKER_IMAGE_SHA
+   - docker tag $DOCKER_IMAGE_SHA $TAG
+   - docker push $TAG
+   - docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} .
+   - docker push registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
\ No newline at end of file
diff --git a/build/ci/.containerlab-ci.yml b/build/ci/.containerlab-ci.yml
index dd69edc64..f968e0a13 100644
--- a/build/ci/.containerlab-ci.yml
+++ b/build/ci/.containerlab-ci.yml
@@ -48,12 +48,12 @@ containerlab:template:
     paths:
       - ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
 
-
 containerlab:deploy:
   extends:
     - .containerlab_template
     - .containerlab_rules
   stage: apply
+  needs: ["containerlab:template", "build-docker"]
   script:
     - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
     - echo "GOSDN_HTTP_PORT=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort }}' clab-${CLAB_NAME}-gosdn)" >> ${CI_PROJECT_DIR}/build.env
diff --git a/build/ci/.deploy-k8s.yml b/build/ci/.deploy-k8s.yml
index 9642ce0ca..8f3458606 100644
--- a/build/ci/.deploy-k8s.yml
+++ b/build/ci/.deploy-k8s.yml
@@ -27,7 +27,7 @@ deploy:develop:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:develop"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -37,7 +37,7 @@ deploy:latest:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -47,7 +47,7 @@ deploy:nightly:mainline:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -57,7 +57,7 @@ deploy:nightly:develop:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
index 65ef4b5e8..106d29b78 100644
--- a/build/ci/.test.yml
+++ b/build/ci/.test.yml
@@ -1,5 +1,5 @@
 .integration-test: &integration-test
-  image: golang:1.16
+  image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
   stage: integration-test
   needs:
     - job: "containerlab:deploy"
@@ -34,7 +34,7 @@ integration-test:api:
     - go test -race -v -run TestApiIntegration
 
 .test: &test
-  image: golang:1.16
+  image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
   stage: test
   allow_failure: true
   variables:
@@ -55,6 +55,7 @@ unit-test:
   <<: *test
 
 controller-test:
+  image: golang:1.16
   script:
     - go test -race -v -run TestRun
   <<: *test
-- 
GitLab