Skip to content
Snippets Groups Projects
Commit 6d359356 authored by Andre Sterba's avatar Andre Sterba Committed by Malte Bauch
Browse files

Provide basic Makefile

parent dd916308
Branches
Tags
2 merge requests!247Develop,!239Provide basic Makefile
Pipeline #97257 passed
...@@ -19,6 +19,9 @@ configs/gosdn.toml ...@@ -19,6 +19,9 @@ configs/gosdn.toml
api/api_test.toml api/api_test.toml
debug.test debug.test
# developer tools
build-tools/
# test files # test files
report.xml report.xml
nucleus/util/proto/*_test nucleus/util/proto/*_test
......
.build: &build .build: &build
stage: build stage: build
image: image:
name: gcr.io/kaniko-project/executor:debug name: gcr.io/kaniko-project/executor:debug
entrypoint: [ "" ] entrypoint: [""]
variables: variables:
TAG: $CI_COMMIT_BRANCH TAG: $CI_COMMIT_BRANCH
before_script: before_script:
# replace all slashes in the tag with hyphen, because slashes are not allowed in tags # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
- TAG=${TAG//\//-} - TAG=${TAG//\//-}
- mkdir -p /kaniko/.docker - mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
needs: [] needs: []
build-testing-image: build-testing-image:
rules: rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables: variables:
TAG: latest TAG: latest
- if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == "develop"
variables: variables:
TAG: $CI_COMMIT_BRANCH TAG: $CI_COMMIT_BRANCH
BUILDARGS: -race BUILDARGS: -race
- when: always - when: always
script: script:
- /kaniko/executor - /kaniko/executor
--cache=true --cache=true
--context "$CI_PROJECT_DIR" --context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile" --dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS" --build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_TESTING_IMAGE" --destination "$GOSDN_TESTING_IMAGE"
--target "installer" --target "installer"
<<: *build <<: *build
build-image: build-image:
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables: variables:
TAG: $CI_DEFAULT_BRANCH TAG: $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == "develop"
variables: variables:
TAG: develop TAG: develop
BUILDARGS: -race BUILDARGS: -race
- when: always - when: always
script: script:
- /kaniko/executor - /kaniko/executor
--cache=true --cache=true
--context "$CI_PROJECT_DIR" --context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile" --dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS" --build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE" --destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:$TAG" --destination "$CI_REGISTRY_IMAGE:$TAG"
<<: *build <<: *build
.build-release-docker: &build-release-docker .build-release-docker: &build-release-docker
stage: build-release stage: build-release
image: image:
name: gcr.io/kaniko-project/executor:debug name: gcr.io/kaniko-project/executor:debug
entrypoint: [ "" ] entrypoint: [""]
rules: rules:
# TODO: Implement later when we need it # TODO: Implement later when we need it
#- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH #- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# variables: # variables:
# TAG: $CI_COMMIT_TAG # TAG: $CI_COMMIT_TAG
# when: on_success # when: on_success
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables: variables:
TAG: $CI_DEFAULT_BRANCH TAG: $CI_DEFAULT_BRANCH
when: on_success when: on_success
- when: never - when: never
before_script: before_script:
# replace all slashes in the tag with hyphen, because slashes are not allowed in tags # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
- TAG=${TAG//\//-} - TAG=${TAG//\//-}
- mkdir -p /kaniko/.docker - mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
build-release-image: build-release-image:
script: script:
- /kaniko/executor - /kaniko/executor
--cache=true --cache=true
--context "$CI_PROJECT_DIR" --context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile" --dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS" --build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE" --destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:$TAG" --destination "$CI_REGISTRY_IMAGE:$TAG"
- /kaniko/executor - /kaniko/executor
--cache=true --cache=true
--context "$CI_PROJECT_DIR" --context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile" --dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS" --build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE" --destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:latest" --destination "$CI_REGISTRY_IMAGE:latest"
<<: *build-release-docker <<: *build-release-docker
.build-release-binary: &build-release-binary .build-release-binary: &build-release-binary
stage: build-release stage: build-release
image: image:
name: ${GITLAB_PROXY}golang:$GOLANG_VERSION name: ${GITLAB_PROXY}golang:$GOLANG_VERSION
rules: rules:
# TODO: Implement later when we need it # TODO: Implement later when we need it
#- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH #- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# variables: # variables:
# TAG: $CI_COMMIT_TAG # TAG: $CI_COMMIT_TAG
# when: on_success # when: on_success
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables: variables:
TAG: $CI_DEFAULT_BRANCH TAG: $CI_DEFAULT_BRANCH
when: on_success when: on_success
- if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == "develop"
variables: variables:
TAG: $CI_COMMIT_BRANCH TAG: $CI_COMMIT_BRANCH
when: on_success when: on_success
- when: never - when: never
build-release-linux: build-release-linux:
script: script:
- GOOS=linux go build ./cmd/gosdn - GOOS=linux go build ./cmd/gosdn
- mv gosdn gosdn-$TAG - mv gosdn gosdn-$TAG
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-linux"' - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-linux"'
artifacts: artifacts:
paths: paths:
- gosdn-$TAG - gosdn-$TAG
expire_in: 4 weeks expire_in: 4 weeks
<<: *build-release-binary <<: *build-release-binary
build-release-freebsd: build-release-freebsd:
script: script:
- GOOS=freebsd go build ./cmd/gosdn - GOOS=freebsd go build ./cmd/gosdn
- mv gosdn gosdn-$TAG - mv gosdn gosdn-$TAG
- - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-freebsd"' - - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-freebsd"'
artifacts: artifacts:
paths: paths:
- gosdn-$TAG - gosdn-$TAG
expire_in: 4 weeks expire_in: 4 weeks
<<: *build-release-binary <<: *build-release-binary
\ No newline at end of file
code-quality: code-quality:
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golangci/golangci-lint:v1.42-alpine image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golangci/golangci-lint:v1.42-alpine
stage: analyze stage: analyze
script: script:
# writes golangci-lint output to gl-code-quality-report.json # writes golangci-lint output to gl-code-quality-report.json
- golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json - apk add --update make jq
artifacts: - make ci-lint
reports: artifacts:
codequality: gl-code-quality-report.json reports:
paths: codequality: gl-code-quality-report.json
- gl-code-quality-report.json paths:
needs: [] - gl-code-quality-report.json
needs: []
variables: variables:
CLAB_DIR: "/mnt" CLAB_DIR: "/mnt"
CLAB_NAME: "clab${CI_PIPELINE_IID}" CLAB_NAME: "clab${CI_PIPELINE_IID}"
# Templates for Job Types # Templates for Job Types
.containerlab_deploy: &containerlab_deploy .containerlab_deploy: &containerlab_deploy
stage: apply stage: apply
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: on_success - when: on_success
tags: tags:
- shell - shell
before_script: before_script:
- cd ${CLAB_DIR} - cd ${CLAB_DIR}
- export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts" - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
- echo ${GOSDN_IMAGE} - echo ${GOSDN_IMAGE}
- docker pull ${GOSDN_IMAGE} - docker pull ${GOSDN_IMAGE}
- docker pull ${CEOS_IMAGE} - docker pull ${CEOS_IMAGE}
.containerlab_template: &containerlab_template .containerlab_template: &containerlab_template
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest
stage: build stage: build
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: on_success - when: on_success
before_script: before_script:
- export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts" - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts"
- firstOctet=$(generate_octet.sh $CI_COMMIT_SHA) - firstOctet=$(generate_octet.sh $CI_COMMIT_SHA)
- secondOctet=$(generate_octet.sh $CI_PIPELINE_ID) - secondOctet=$(generate_octet.sh $CI_PIPELINE_ID)
- export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24" - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24"
script: script:
- | - |
sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \ sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \
-e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \ -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \
-e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \ -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \
-e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \ -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \
${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml
- cat ${CLAB_NAME}.clab.yml - cat ${CLAB_NAME}.clab.yml
artifacts: artifacts:
name: ${CLAB_NAME} name: ${CLAB_NAME}
paths: paths:
- ${CLAB_NAME}.clab.yml - ${CLAB_NAME}.clab.yml
# JOBS # JOBS
containerlab:template:integration: containerlab:template:integration:
extends: .containerlab_template extends: .containerlab_template
variables: variables:
CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.tmpl.yml" CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.tmpl.yml"
containerlab:deploy:integration: containerlab:deploy:integration:
extends: .containerlab_deploy extends: .containerlab_deploy
needs: ["containerlab:template:integration", "build-image"] needs: ["containerlab:template:integration", "build-image"]
script: script:
- sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
- | - |
echo -e "\ echo -e "\
GOSDN_HTTP_PORT=$(docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\ GOSDN_HTTP_PORT=$(docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\
GOSDN_GRPC_PORT=$(docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\ GOSDN_GRPC_PORT=$(docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\
CEOS1_PORT=$(docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \ CEOS1_PORT=$(docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \
> ${CI_PROJECT_DIR}/build.env > ${CI_PROJECT_DIR}/build.env
- cat ${CI_PROJECT_DIR}/build.env - cat ${CI_PROJECT_DIR}/build.env
artifacts: artifacts:
reports: reports:
dotenv: ${CI_PROJECT_DIR}/build.env dotenv: ${CI_PROJECT_DIR}/build.env
containerlab:destroy: containerlab:destroy:
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: always - when: always
stage: .post stage: .post
tags: tags:
- shell - shell
needs: ["containerlab:deploy:integration", "integration-test:nucleus", "integration-test:api", "containerlab:template:integration"] needs:
before_script: [
- cd ${CLAB_DIR} "containerlab:deploy:integration",
script: "integration-test:nucleus",
- sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml "integration-test:api",
- docker volume rm -f ${CLAB_NAME}-volume "containerlab:template:integration",
- docker image rm -f ${GOSDN_IMAGE} ]
allow_failure: true before_script:
- cd ${CLAB_DIR}
script:
- sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
- docker volume rm -f ${CLAB_NAME}-volume
- docker image rm -f ${GOSDN_IMAGE}
allow_failure: true
#containerlab:template:develop: #containerlab:template:develop:
# extends: .containerlab_template # extends: .containerlab_template
...@@ -108,20 +111,19 @@ containerlab:destroy: ...@@ -108,20 +111,19 @@ containerlab:destroy:
# rules: # rules:
# - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null # - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null
containerlab:clean: containerlab:clean:
stage: .post stage: .post
tags: tags:
- shell - shell
before_script: before_script:
- cd ${CLAB_DIR} - cd ${CLAB_DIR}
script: script:
- docker kill $(docker ps -q) || true - docker kill $(docker ps -q) || true
- docker rm $(docker ps -a -q) || true - docker rm $(docker ps -a -q) || true
- docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true - docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true
- sudo rm -rf ${CLAB_DIR}/clab-* || true - sudo rm -rf ${CLAB_DIR}/clab-* || true
- sudo sed -i 's|.*clab.*||g' /etc/hosts - sudo sed -i 's|.*clab.*||g' /etc/hosts
allow_failure: true allow_failure: true
rules: rules:
- if: $CI_SCHEDULE_CLEAN - if: $CI_SCHEDULE_CLEAN
when: always when: always
build:k8s-bot: build:k8s-bot:
stage: build stage: build
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golang:$GOLANG_VERSION image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golang:$GOLANG_VERSION
rules: rules:
- if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
script: script:
- cd build/cd - cd build/cd
- go build -o k8s-bot - go build -o k8s-bot
artifacts: artifacts:
name: binary name: binary
paths: paths:
- build/cd/k8s-bot - build/cd/k8s-bot
.deploy: &deploy .deploy: &deploy
image: image:
name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/bitnami/kubectl:latest name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/bitnami/kubectl:latest
entrypoint: [""] entrypoint: [""]
before_script: before_script:
- echo "override global before script" - echo "override global before script"
variables: variables:
K8S_OP: "create" K8S_OP: "create"
script: script:
- ./build/cd/k8s-bot - ./build/cd/k8s-bot
deploy:develop: deploy:develop:
<<: *deploy <<: *deploy
stage: deploy stage: deploy
needs: needs:
- job: "build-docker" - job: "build-docker"
- job: "build:k8s-bot" - job: "build:k8s-bot"
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == null - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == null
deploy:latest: deploy:latest:
<<: *deploy <<: *deploy
stage: deploy stage: deploy
needs: needs:
- job: "build-docker" - job: "build-docker"
- job: "build:k8s-bot" - job: "build:k8s-bot"
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == null - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == null
deploy:nightly:mainline: deploy:nightly:mainline:
<<: *deploy <<: *deploy
stage: deploy stage: deploy
needs: needs:
- job: "build-docker" - job: "build-docker"
- job: "build:k8s-bot" - job: "build:k8s-bot"
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == "mainline" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == "mainline"
deploy:nightly:develop: deploy:nightly:develop:
<<: *deploy <<: *deploy
stage: deploy stage: deploy
needs: needs:
- job: "build-docker" - job: "build-docker"
- job: "build:k8s-bot" - job: "build:k8s-bot"
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == "mainline" - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == "mainline"
run: run:
timeout: 10m timeout: 10m
issues-exit-code: 1 issues-exit-code: 1
# directories to be ignored by linters # directories to be ignored by linters
skip-dirs: skip-dirs:
- forks - forks
- test - test
skip-dirs-default: true skip-dirs-default: true
skip-files: skip-files:
- http.go - http.go
# output settings -> code-climate for GitLab # output settings -> code-climate for GitLab
output: output:
format: code-climate format: code-climate
print-issued-lines: true print-issued-lines: true
print-linter-name: true print-linter-name: true
uniq-by-line: true uniq-by-line: true
path-prefix: "" path-prefix: ""
# custom settings for linters # custom settings for linters
linters-settings: linters-settings:
gocyclo: gocyclo:
min-complexity: 15 min-complexity: 15
golint: golint:
min-confidence: 0.8 min-confidence: 0.8
# enable the specific needed linters # enable the specific needed linters
linters: linters:
disable-all: true disable-all: true
enable: enable:
- gofmt - gofmt
- goimports - goimports
- gocyclo - gocyclo
- govet - govet
- unused - unused
- staticcheck - staticcheck
- typecheck - typecheck
- revive - revive
- whitespace - whitespace
issues: issues:
exclude-use-default: false exclude-use-default: false
max-issues-per-linter: 0 max-issues-per-linter: 0
max-same-issues: 0 max-same-issues: 0
.integration-test: &integration-test .integration-test: &integration-test
image: $GOSDN_TESTING_IMAGE image: $GOSDN_TESTING_IMAGE
stage: integration-test stage: integration-test
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: on_success - when: on_success
needs: needs:
- job: "containerlab:deploy:integration" - job: "containerlab:deploy:integration"
tags: tags:
- integration-test-docker - integration-test-docker
variables: variables:
GOSDN_LOG: "nolog" GOSDN_LOG: "nolog"
GOSDN_TEST_API_ENDPOINT: "141.100.70.178:${GOSDN_GRPC_PORT}" GOSDN_TEST_API_ENDPOINT: "${CI_SERVER_IP}:${GOSDN_GRPC_PORT}"
CEOS_TEST_ENDPOINT: "141.100.70.178:${CEOS1_PORT}" CEOS_TEST_ENDPOINT: "${CI_SERVER_IP}:${CEOS1_PORT}"
GOSDN_TEST_USER: "admin" GOSDN_TEST_USER: "admin"
GOSDN_TEST_PASSWORD: "admin" GOSDN_TEST_PASSWORD: "admin"
integration-test:nucleus: integration-test:nucleus:
<<: *integration-test <<: *integration-test
script: script:
- ${CI_PROJECT_DIR}/.gitlab/ci/scripts/wait-for-it.sh ${CEOS_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up" - ${CI_PROJECT_DIR}/.gitlab/ci/scripts/wait-for-it.sh ${CEOS_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up"
- cd ./test/integration - make integration-test-nucleus
- go test -race -v -run TestGnmi_SetIntegration
- go test -race -v -run TestGnmi_GetIntegration
- go test -race -v -run TestGnmi_SubscribeIntegration
- go test -race -v -run TestGnmi_CapabilitiesIntegration
integration-test:api: integration-test:api:
<<: *integration-test <<: *integration-test
variables: variables:
K8S_OP: "getenv" K8S_OP: "getenv"
script: script:
- cd ./api - make integration-test-api
- go test -race -v -run TestApiIntegration
.rules: &rules .rules: &rules
stage: analyze stage: analyze
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: always - when: always
needs: [] needs: []
sast: sast:
variables: variables:
SAST_ANALYZER_IMAGE_TAG: '2' SAST_ANALYZER_IMAGE_TAG: "2"
SAST_EXCLUDED_PATHS: spec, test, tests, tmp SAST_EXCLUDED_PATHS: spec, test, tests, tmp
SEARCH_MAX_DEPTH: '4' SEARCH_MAX_DEPTH: "4"
include: include:
- template: Security/SAST.gitlab-ci.yml - template: Security/SAST.gitlab-ci.yml
- template: Dependency-Scanning.gitlab-ci.yml - template: Dependency-Scanning.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml - template: Security/License-Scanning.gitlab-ci.yml
# - template: Security/Secret-Detection.gitlab-ci.yml # - template: Security/Secret-Detection.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml - template: Security/Container-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning: gemnasium-dependency_scanning:
<<: *rules <<: *rules
gosec-sast: gosec-sast:
<<: *rules <<: *rules
license_scanning: license_scanning:
<<: *rules <<: *rules
semgrep-sast: semgrep-sast:
<<: *rules <<: *rules
#secret_detection: #secret_detection:
# <<: *rules # <<: *rules
container_scanning: container_scanning:
stage: analyze stage: analyze
rules: rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never when: never
- when: always - when: always
variables: variables:
DOCKER_IMAGE: "${GOSDN_IMAGE}" DOCKER_IMAGE: "${GOSDN_IMAGE}"
DOCKER_USER: "${CI_REGISTRY_USER}" DOCKER_USER: "${CI_REGISTRY_USER}"
DOCKER_PASSWORD: "${CI_REGISTRY_PASSWORD}" DOCKER_PASSWORD: "${CI_REGISTRY_PASSWORD}"
needs: needs:
- build-image - build-image
.test: &test .test: &test
image: $GOSDN_TESTING_IMAGE image: $GOSDN_TESTING_IMAGE
stage: test stage: test
rules: rules:
- when: on_success - when: on_success
variables: variables:
GOSDN_LOG: "nolog" GOSDN_LOG: "nolog"
GOSDN_CHANGE_TIMEOUT: "100ms" GOSDN_CHANGE_TIMEOUT: "100ms"
before_script: artifacts:
- go get gotest.tools/gotestsum when: always
artifacts: reports:
when: always junit: report.xml
reports: needs:
junit: report.xml - build-testing-image
needs:
- build-testing-image
unit-test: unit-test:
script: script:
- gotestsum --junitfile report.xml --format testname -- -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out - make ci-unit-test
after_script: after_script:
- go tool cover -func=coverage.out - go tool cover -func=coverage.out
<<: *test <<: *test
controller-test: controller-test:
script: script:
- gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun - make ci-controller-test
<<: *test <<: *test
test-build: test-build:
artifacts: artifacts:
when: never when: never
script: script:
- GOOS=linux go build $BUILDARGS ./cmd/gosdn - GOOS=linux go build $BUILDARGS ./cmd/gosdn
<<: *test <<: *test
...@@ -9,23 +9,23 @@ goplantuml: ...@@ -9,23 +9,23 @@ goplantuml:
WIKI_URL: "${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot3:${GOPLANTUML_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git" WIKI_URL: "${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot3:${GOPLANTUML_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git"
script: script:
# install goplantuml # install goplantuml
- go get github.com/jfeliu007/goplantuml/cmd/goplantuml - go get github.com/jfeliu007/goplantuml/cmd/goplantuml
# remove old wiki folder # remove old wiki folder
- rm -rf "/tmp/${CI_PROJECT_NAME}.wiki" - rm -rf "/tmp/${CI_PROJECT_NAME}.wiki"
# clone and move to wiki folder # clone and move to wiki folder
- cd /tmp - cd /tmp
- git clone "${WIKI_URL}" - git clone "${WIKI_URL}"
- cd "${CI_PROJECT_NAME}.wiki" - cd "${CI_PROJECT_NAME}.wiki"
- echo '```plantuml' > "$FILENAME" - echo '```plantuml' > "$FILENAME"
# run goplantuml # run goplantuml
- goplantuml "${CI_PROJECT_DIR}/nucleus/" >> "$FILENAME" - goplantuml "${CI_PROJECT_DIR}/nucleus/" >> "$FILENAME"
- echo '```' >> "$FILENAME" - echo '```' >> "$FILENAME"
# git commit # git commit
- git config user.name "$GITLAB_USER_NAME" - git config user.name "$GITLAB_USER_NAME"
- git config user.email "$GITLAB_USER_EMAIL" - git config user.email "$GITLAB_USER_EMAIL"
- git add "$FILENAME" - git add "$FILENAME"
- git commit -m "Auto-updated UML diagram via goplantuml CI job" - git commit -m "Auto-updated UML diagram via goplantuml CI job"
- git push origin "HEAD:master" - git push origin "HEAD:master"
#!/bin/sh #!/bin/sh
input=$1 input=$1
#trailing_backspace=$2
hashed_value=$(echo $input | sha256sum | awk '{print $1}' ) hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
......
Makefile 0 → 100644
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
TOOLS_DIR:= build-tools
GOSDN_PRG := $(MAKEFILE_DIR)$(TOOLS_DIR)
GOBIN := $(GOSDN_PRG)
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
BINARY_NAME=gosdn
all: build
install-tools:
@echo Install development tooling
mkdir -p $(GOSDN_PRG)
go install gotest.tools/gotestsum@v1.7.0
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.42
@echo Finished installing development tooling
ci-install-tools:
go install gotest.tools/gotestsum@v1.7.0
build:
$(GOBUILD) -o $(BINARY_NAME) ./cmd/gosdn
clean:
$(GOCLEAN)
rm -f $(BINARY_NAME)
start: clean build
./$(BINARY_NAME) -l debug
unit-test: install-tools
./$(TOOLS_DIR)/gotestsum --junitfile report.xml --format testname -- -short -race $$( go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
controller-test: install-tools
./$(TOOLS_DIR)/gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun
lint: install-tools
./$(TOOLS_DIR)/golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml
lint-fix: install-tools
./$(TOOLS_DIR)/golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml --fix
ci-lint:
golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml --out-format code-climate | jq -r '.[] | "\(.location.path):\(.location.lines.begin) \(.description)"'
ci-unit-test: ci-install-tools
gotestsum --junitfile report.xml --format testname -- -short -race $$( go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
ci-controller-test: ci-install-tools
gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun
integration-test-nucleus:
cd ./test/integration &&\
go test -race -v -run TestGnmi_SetIntegration &&\
go test -race -v -run TestGnmi_GetIntegration &&\
go test -race -v -run TestGnmi_SubscribeIntegration &&\
go test -race -v -run TestGnmi_CapabilitiesIntegration
integration-test-api:
cd ./api &&\
go test -race -v -run TestApiIntegration
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment