diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..fee485d0b465a720847a86aa6c382e785ce23833 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +.git +.gitlab +build +documentation +mocks +test +.cobra.yaml +.dockeringore +.gitlab-ci.yaml +ARCHITECTURE.md +CONTRIBUTING.md +Dockerfile.alpine +README.md diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 391afe1b0cce65bd4d29734d34e8fae853075e2e..105784d85b11f231e4f6b2b3a7236f85673d9629 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,8 @@ variables: - SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers - DOCKER_IMAGE_SHA: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}" + GOSDN_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}" + GOSDN_TESTING_IMAGE: "${CI_REGISTRY_IMAGE}:testing_${CI_COMMIT_SHA}" + CEOS_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest" + GOLANG_VERSION: "1.16" stages: - .pre @@ -17,10 +19,6 @@ workflow: when: never - when: always -default: - before_script: - - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" - include: - local: '/.gitlab/ci/.build-container.yml' - local: '/.gitlab/ci/.code-quality-ci.yml' @@ -29,4 +27,4 @@ include: - local: '/.gitlab/ci/.containerlab-ci.yml' - local: '/.gitlab/ci/.integration-test.yml' - local: '/.gitlab/ci/.uml-autogen-ci.yml' - - local: '/.gitlab/ci/.deploy-k8s.yml' +# - local: '/.gitlab/ci/.deploy-k8s.yml' diff --git a/.gitlab/ci/.build-container.yml b/.gitlab/ci/.build-container.yml index 40066b9a85468bc75ec606ffacd543bcd37cddae..99c7cb1e20520343f459e89396936463537e2d84 100644 --- a/.gitlab/ci/.build-container.yml +++ b/.gitlab/ci/.build-container.yml @@ -1,17 +1,10 @@ -variables: - DOCKER_TLS_CERTDIR: "/certs" - -build-docker: - before_script: - - echo "override global before script" +.build: &build stage: build - allow_failure: false - needs: [] + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [ "" ] variables: TAG: $CI_COMMIT_BRANCH - tags: - - shell-builder - rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH variables: @@ -21,17 +14,33 @@ build-docker: TAG: develop BUILDARGS: -race - when: always - - variables: - TAG: $CI_COMMIT_SHA - + before_script: + # replace all slashes in the tag with hyphen, because slashes are not allowed in tags + - TAG=${TAG//\//-} + - mkdir -p /kaniko/.docker + - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" >/kaniko/.docker/config.json + needs: [] + +build-testing-image: + script: + - /kaniko/executor + --cache=true + --context "$CI_PROJECT_DIR" + --dockerfile "Dockerfile" + --build-arg "GOLANG_VERSION=$GOLANG_VERSION" + --build-arg "BUILDARGS=$BUILDARGS" + --destination "$GOSDN_TESTING_IMAGE" + --target "installer" + <<: *build + +build-image: script: - # replace all slashes in the tag with hyphen, because slashes are not allowed in tags - - TAG=${TAG//\//-} - - TARGET=$CI_REGISTRY_IMAGE:$TAG - - 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 $TARGET - - docker push $TARGET - - docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} . - - docker push ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} + - /kaniko/executor + --cache=true + --context "$CI_PROJECT_DIR" + --dockerfile "Dockerfile" + --build-arg "GOLANG_VERSION=$GOLANG_VERSION" + --build-arg "BUILDARGS=$BUILDARGS" + --destination "$GOSDN_IMAGE" + --destination "$CI_REGISTRY_IMAGE:$TAG" + <<: *build diff --git a/.gitlab/ci/.code-quality-ci.yml b/.gitlab/ci/.code-quality-ci.yml index 3236cb127f9c0073307f045f41f6313297622e88..dec181fcd6a0a091a2a368409530dedf2ed10316 100644 --- a/.gitlab/ci/.code-quality-ci.yml +++ b/.gitlab/ci/.code-quality-ci.yml @@ -9,3 +9,5 @@ code-quality: codequality: gl-code-quality-report.json paths: - gl-code-quality-report.json + needs: [] + \ No newline at end of file diff --git a/.gitlab/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml index 7123202ce1f3e02e744ef925e4c141d256ae4843..e459e6a8b48da4fa3d7275d1d9faf974cabdb26b 100644 --- a/.gitlab/ci/.containerlab-ci.yml +++ b/.gitlab/ci/.containerlab-ci.yml @@ -1,6 +1,4 @@ variables: - CEOS_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest" - GOSDN_CONTAINER_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}" CLAB_DIR: "/mnt" CLAB_NAME: "clab${CI_PIPELINE_IID}" @@ -13,9 +11,9 @@ variables: - cd ${CLAB_DIR} - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts" - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY - - echo ${GOSDN_CONTAINER_IMAGE} - - docker pull ${GOSDN_CONTAINER_IMAGE} - - docker pull ${CEOS_CONTAINER_IMAGE} + - echo ${GOSDN_IMAGE} + - docker pull ${GOSDN_IMAGE} + - docker pull ${CEOS_IMAGE} .containerlab_template: &containerlab_template image: alpine:latest @@ -27,8 +25,8 @@ variables: - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24" script: - | - sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_CONTAINER_IMAGE}|g" \ - -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_CONTAINER_IMAGE}|g" \ + sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \ + -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \ -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \ -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \ ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml @@ -47,7 +45,7 @@ containerlab:template:integration: containerlab:deploy:integration: extends: .containerlab_deploy - needs: ["containerlab:template:integration", "build-docker"] + needs: ["containerlab:template:integration", "build-image"] script: - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure - | @@ -77,7 +75,7 @@ containerlab:destroy: script: - sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml - docker volume rm -f ${CLAB_NAME}-volume - - docker image rm -f ${GOSDN_CONTAINER_IMAGE} + - docker image rm -f ${GOSDN_IMAGE} allow_failure: true when: always @@ -95,7 +93,7 @@ containerlab:destroy: #containerlab:deploy:develop: # extends: # - .containerlab_deploy -# needs: ["containerlab:template:develop", "build-docker"] +# needs: ["containerlab:template:develop", "build-image"] # variables: # CLAB_NAME: "dev" # GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop" diff --git a/.gitlab/ci/.deploy-k8s.yml b/.gitlab/ci/.deploy-k8s.yml index 8f3458606261bff2f0c39a45eacfa20b2062d06f..bac4bcbbe1e466d32866bdef4690632cdf451121 100644 --- a/.gitlab/ci/.deploy-k8s.yml +++ b/.gitlab/ci/.deploy-k8s.yml @@ -1,6 +1,6 @@ build:k8s-bot: stage: build - image: golang:1.16 + image: golang:$GOLANG_VERSION rules: - if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH diff --git a/.gitlab/ci/.integration-test.yml b/.gitlab/ci/.integration-test.yml index 64873357b3e3df9a954120b76bcf63d1620c59b9..1a09ae14e4153ac9acaf77d73b11772c9d9f6c60 100644 --- a/.gitlab/ci/.integration-test.yml +++ b/.gitlab/ci/.integration-test.yml @@ -1,5 +1,5 @@ .integration-test: &integration-test - image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} + image: $GOSDN_TESTING_IMAGE stage: integration-test needs: - job: "containerlab:deploy:integration" diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml index b8cbe03a7fd44af3bc9ba4513e1e99c7c37416ac..81316ea511814332257554626a8962d0805a908c 100644 --- a/.gitlab/ci/.test.yml +++ b/.gitlab/ci/.test.yml @@ -1,19 +1,27 @@ .test: &test - image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} + image: $GOSDN_TESTING_IMAGE stage: test variables: GOSDN_LOG: "nolog" GOSDN_CHANGE_TIMEOUT: "100ms" + before_script: + - go get gotest.tools/gotestsum + artifacts: + when: always + reports: + junit: report.xml + needs: + - build-testing-image unit-test: script: - - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out + - gotestsum --junitfile report.xml --format testname -- -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out + # -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v after_script: - go tool cover -func=coverage.out <<: *test controller-test: - image: golang:1.16 script: - - go test -race -v -run TestRun + - gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun <<: *test diff --git a/.gitlab/ci/.uml-autogen-ci.yml b/.gitlab/ci/.uml-autogen-ci.yml index 28ee54f267fe971524185099089dcffde1a07cca..cd7db4c9dceb8716b47f27401b940159157b26d3 100644 --- a/.gitlab/ci/.uml-autogen-ci.yml +++ b/.gitlab/ci/.uml-autogen-ci.yml @@ -1,5 +1,5 @@ goplantuml: - image: golang:1.14 + image: golang:$GOLANG_VERSION stage: .post only: - develop diff --git a/Dockerfile b/Dockerfile index dd077fc7c5b790e77d29ca9352c98bc4e59dd05c..48ab0f161f61439459a792aac584ee7c82132630 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,7 @@ -FROM golang:1.16-buster AS installer -ARG GITLAB_USER -ARG GITLAB_TOKEN +ARG GOLANG_VERSION=1.16 ARG BUILDARGS -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" -RUN go env -w GOPRIVATE=code.fbi.h-da.de/* +FROM golang:$GOLANG_VERSION-buster AS installer WORKDIR /src/gosdn COPY go.* ./ @@ -13,17 +9,11 @@ RUN go mod download FROM installer as builder -COPY *.go ./ -COPY ./api ./api -COPY ./cmd ./cmd -COPY ./interfaces ./interfaces -COPY ./northbound ./northbound -COPY ./nucleus ./nucleus -COPY ./store ./store +COPY . ./ RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn -FROM debian:latest +FROM debian:bullseye EXPOSE 8080 EXPOSE 55055 COPY --from=builder /src/gosdn/gosdn .