Skip to content

feat:wire nil test in pre ci pipeline #4858

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 133 commits into from
May 21, 2024
Merged
Show file tree
Hide file tree
Changes from 129 commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
9907425
wip
kartik-579 Mar 5, 2024
d068535
wip
kartik-579 Mar 7, 2024
ee89c85
refactored nil check
kartik-579 Mar 21, 2024
c68f538
added runtime main script for creating binary file
Laeeqdev Apr 1, 2024
286c985
Merge branch 'main' into run-time-main-and-binary
kartik-579 Apr 3, 2024
114dc26
added handling for githubClient panic
kartik-579 Apr 3, 2024
68586a4
added some script for creating binary file
Laeeqdev Apr 3, 2024
83a32d8
deleted binary file
Laeeqdev Apr 3, 2024
a528489
updated go version
Laeeqdev Apr 4, 2024
910d88f
added env file support and also added other svc requirements
Laeeqdev Apr 5, 2024
9029f50
updated makefile
Laeeqdev Apr 5, 2024
76f7bbd
updated makefile
Laeeqdev Apr 5, 2024
507998a
Update wireNil.env
Laeeqdev Apr 5, 2024
933da40
Update Makefile
Laeeqdev Apr 5, 2024
2ea2791
Update Makefile
Laeeqdev Apr 5, 2024
f3f9c70
Update Makefile
Laeeqdev Apr 5, 2024
2f23bae
Update Makefile
Laeeqdev Apr 5, 2024
a3b599f
Update Makefile
Laeeqdev Apr 5, 2024
e6b65f7
Update Makefile
Laeeqdev Apr 5, 2024
0a06fe9
Update Makefile
Laeeqdev Apr 6, 2024
1102b85
Update wireNil.env
Laeeqdev Apr 7, 2024
4ae2e1b
Update run-integration-test.sh
Laeeqdev Apr 7, 2024
9d0a8f3
resolved merge conflicts
Laeeqdev Apr 8, 2024
8626eb8
updated makefile
Laeeqdev Apr 8, 2024
f7c71b8
added
Laeeqdev Apr 8, 2024
8abc511
added
Laeeqdev Apr 8, 2024
2585c25
added
Laeeqdev Apr 8, 2024
b75a4a4
wip
kartik-579 Mar 5, 2024
739ac11
wip
kartik-579 Mar 7, 2024
81a1b4b
refactored nil check
kartik-579 Mar 21, 2024
f04af27
added runtime main script for creating binary file
Laeeqdev Apr 1, 2024
167c078
added handling for githubClient panic
kartik-579 Apr 3, 2024
a701b85
added some script for creating binary file
Laeeqdev Apr 3, 2024
bf90098
deleted binary file
Laeeqdev Apr 3, 2024
67f4c3b
updated go version
Laeeqdev Apr 4, 2024
04dafc1
added env file support and also added other svc requirements
Laeeqdev Apr 5, 2024
9958f70
updated makefile
Laeeqdev Apr 5, 2024
e660b6a
updated makefile
Laeeqdev Apr 5, 2024
2f1a154
Update wireNil.env
Laeeqdev Apr 5, 2024
36feae0
Update Makefile
Laeeqdev Apr 5, 2024
54886a2
Update Makefile
Laeeqdev Apr 5, 2024
a1fc7df
Update Makefile
Laeeqdev Apr 5, 2024
45da527
Update Makefile
Laeeqdev Apr 5, 2024
b9fa1d8
Update Makefile
Laeeqdev Apr 5, 2024
96165f9
Update Makefile
Laeeqdev Apr 5, 2024
56a4884
Update Makefile
Laeeqdev Apr 6, 2024
1df34c6
Update wireNil.env
Laeeqdev Apr 7, 2024
c62b34d
Update run-integration-test.sh
Laeeqdev Apr 7, 2024
2c59a54
resolved merge conflicts
Laeeqdev Apr 8, 2024
1f1f3c5
updated makefile
Laeeqdev Apr 8, 2024
9f51058
added
Laeeqdev Apr 8, 2024
122aa50
added
Laeeqdev Apr 8, 2024
a148abd
added
Laeeqdev Apr 8, 2024
a230389
resolved
Laeeqdev Apr 8, 2024
ba21a44
added readonly option for docker mount
kartik-579 Apr 8, 2024
bf87497
reverted ro change
kartik-579 Apr 8, 2024
13b2981
updated makefile
Laeeqdev Apr 9, 2024
fadfcc0
run go tidy and mod commands
kartik-579 Apr 9, 2024
91296f9
Merge branch 'main' into run-time-main-and-binary
kartik-579 Apr 9, 2024
89bf4a5
update main file
Laeeqdev Apr 9, 2024
432130f
deleted binary file
Laeeqdev Apr 9, 2024
2162df8
Merge branch 'main' into run-time-main-and-binary
Laeeqdev Apr 9, 2024
61e4613
added fileds and value in skip function
Laeeqdev Apr 9, 2024
ec54784
map length added
Laeeqdev Apr 9, 2024
3df9b00
map length added
Laeeqdev Apr 9, 2024
673bb13
create a file output.env
Laeeqdev Apr 9, 2024
a60d74a
changes in makefile
Laeeqdev Apr 9, 2024
66e5bd8
changes in makefile
Laeeqdev Apr 9, 2024
5058f46
again updated makefile
Laeeqdev Apr 9, 2024
6fe5df0
updated makefile
Laeeqdev Apr 9, 2024
73f42b0
updated makefile
Laeeqdev Apr 9, 2024
7fe8b28
added skipUnnecessaryFiledsForCheck function
Laeeqdev Apr 10, 2024
dbbdeca
have done some changes
Laeeqdev Apr 10, 2024
dc3d117
have done some changes
Laeeqdev Apr 10, 2024
4617f25
have done some changes
Laeeqdev Apr 10, 2024
beaedd4
have done some changes
Laeeqdev Apr 10, 2024
fbb8d36
removed some data
Laeeqdev Apr 10, 2024
3c9fef9
updated comment
Laeeqdev Apr 12, 2024
356ccd0
PR code review comments resolved
Laeeqdev Apr 12, 2024
f7713ef
final commit
Laeeqdev Apr 12, 2024
57e5803
updated nats-server.yaml file
Laeeqdev Apr 12, 2024
92fe5b4
Merge branch 'main' into run-time-main-and-binary
kartik-579 Apr 24, 2024
d8f3328
resolved conflicts
Laeeqdev May 9, 2024
4b42b8b
Merge branch 'main' into run-time-main-and-binary
Laeeqdev May 10, 2024
b83a3d9
updated nats image
Laeeqdev May 10, 2024
ab0686c
refactored code
Laeeqdev May 10, 2024
48de3c0
resolved error
Laeeqdev May 10, 2024
35be5f0
resolved error
Laeeqdev May 10, 2024
c605369
resolved error
Laeeqdev May 10, 2024
0b04b3a
resolved error
Laeeqdev May 10, 2024
aa2248f
resolved error
Laeeqdev May 10, 2024
aa44472
resolved error
Laeeqdev May 10, 2024
bc925d9
uncommented code
Laeeqdev May 10, 2024
218e23d
renamed filename
Laeeqdev May 10, 2024
e741c2f
renamed filename
Laeeqdev May 10, 2024
a08d067
Merge branch 'main' into run-time-main-and-binary
Laeeqdev May 10, 2024
748b87e
updated migartion yaml file
Laeeqdev May 13, 2024
df70207
git hash comment resolved
Laeeqdev May 13, 2024
79db9a7
git hash comment resolved
Laeeqdev May 13, 2024
5c0d763
updated makefile
Laeeqdev May 13, 2024
90e1edb
updated makefile
Laeeqdev May 13, 2024
2611223
updated makefile
Laeeqdev May 13, 2024
0d66f8a
move docker exec cmd into other folder
Laeeqdev May 13, 2024
87e5458
move docker exec cmd into other folder
Laeeqdev May 13, 2024
6a5041e
move docker exec cmd into other folder
Laeeqdev May 13, 2024
fac18ab
move docker exec cmd into other folder
Laeeqdev May 13, 2024
a16d771
move docker exec cmd into other folder
Laeeqdev May 13, 2024
b60242c
move docker exec cmd into other folder
Laeeqdev May 13, 2024
882270d
create a new file
Laeeqdev May 13, 2024
4d1b91e
updated code and renamed file name
Laeeqdev May 13, 2024
5cc1931
increased migrator deadline
Laeeqdev May 14, 2024
caa3acd
added sleep
Laeeqdev May 14, 2024
7410b32
added sleep
Laeeqdev May 14, 2024
61cf41a
testing migrator
Laeeqdev May 16, 2024
cf9daca
upadted env value
Laeeqdev May 16, 2024
d2790b4
upadted env value
Laeeqdev May 16, 2024
16e3bca
upadted img
Laeeqdev May 16, 2024
5e2afc1
upadted img
Laeeqdev May 16, 2024
8284260
upadted img
Laeeqdev May 16, 2024
ff76122
upadted img
Laeeqdev May 16, 2024
21ec996
upadted img
Laeeqdev May 16, 2024
910aa6d
upadted img
Laeeqdev May 16, 2024
a89ef63
upadted img
Laeeqdev May 16, 2024
b2a88b7
add volume mounted functionality
Laeeqdev May 21, 2024
7898444
remove sql dir
Laeeqdev May 21, 2024
a7fb89a
Merge branch 'main' into run-time-main-and-binary
Laeeqdev May 21, 2024
79bfe0d
removed enforceUtil field
Laeeqdev May 21, 2024
8c676aa
removed enforceUtil field
Laeeqdev May 21, 2024
3ac29ef
updated migrator image
Laeeqdev May 21, 2024
caddec0
added error in mod file
Laeeqdev May 21, 2024
ed89cc6
added PROXY_SERVICE_CONFIG env
Laeeqdev May 21, 2024
1ecc6cc
removed rbac fields
Laeeqdev May 21, 2024
a04b168
Merge branch 'main' into run-time-main-and-binary
Laeeqdev May 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,13 @@ test-unit:
go test ./pkg/pipeline

test-integration:
export INTEGRATION_TEST_ENV_ID=$(docker run --env TEST_BRANCH=$TEST_BRANCH --env LATEST_HASH=$LATEST_HASH --privileged -d --name dind-test -v $PWD/tests/integrationTesting/:/tmp/ docker:dind)
docker exec ${INTEGRATION_TEST_ENV_ID} sh /tmp/create-test-env.sh
docker exec ${INTEGRATION_TEST_ENV_ID} sh /tests/integrationTesting/run-integration-test.sh

docker run --env-file=wireNilChecker.env --privileged -d --name dind-test -v $(PWD)/:/wirenil/:ro -v $(PWD)/temp/:/tempfile docker:dind
docker exec dind-test sh -c "mkdir test && cp -r wirenil/* test/ && ./test/tests/integrationTesting/exportEnvsExecuteWireNilChecker.sh"
run: build
./devtron

.PHONY: build
docker-build-image: build
docker build -t devtron:$(TAG) .

.PHONY: build, all, wire, clean, run, set-docker-build-env, docker-build-push, devtron,
docker-build-push: docker-build-image
docker tag devtron:${TAG} ${REGISTRY}/devtron:${TAG}
Expand Down
138 changes: 138 additions & 0 deletions WiringNilCheck.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package main

import (
"fmt"
"log"
"os"
"reflect"
"strings"
"unsafe"
)

func CheckIfNilInWire() {
app, err := InitializeApp()
if err != nil {
log.Panic(err)
}
nilFieldsMap := make(map[string]bool)
checkNilFields(app, nilFieldsMap)
fmt.Println("NIL Fields present in impls are: ", nilFieldsMap)
//Writes the length of nilFieldsMap to a file (e.g., output.env) so that we can export this file's data in a pre-CI pipeline bash script and fail the pre-CI pipeline if the length of nilFieldsMap is greater than zero.
err = writeResultToFile(len(nilFieldsMap))
if err != nil {
return
}
}

func checkNilFields(obj interface{}, nilObjMap map[string]bool) {
val := reflect.ValueOf(obj)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
if val.Kind() != reflect.Struct {
return
}
valName := val.Type().Name()
for i := 0; i < val.NumField(); i++ {
field := val.Field(i)
fieldName := val.Type().Field(i).Name
pkgPath := val.Type().PkgPath()
if pkgPath != "main" && !strings.Contains(pkgPath, "devtron-labs/devtron") {
//package not from this repo, ignoring
continue
}
if skipUnnecessaryFieldsForCheck(fieldName, valName) { // skip unnecessary fileds and values
continue
}
if !canFieldTypeBeNil(field) { // field can not be nil, skip
continue
} else if field.IsNil() { // check if the field is nil
mapEntry := fmt.Sprintf("%s.%s", valName, fieldName)
nilObjMap[mapEntry] = true
continue
}
if canSkipFieldStructCheck(fieldName, valName) {
continue
}
if !isExported(fieldName) && !field.CanInterface() {
unexportedField := GetUnexportedField(field)
checkNilFields(unexportedField, nilObjMap)
} else {
// Recurse
checkNilFields(field.Interface(), nilObjMap)
}
}
}

func canFieldTypeBeNil(field reflect.Value) bool {
kind := field.Kind()
switch kind {
case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.UnsafePointer,
reflect.Interface, reflect.Slice:
return true
default: //other types can not be nil
return false
}
}

func canSkipFieldStructCheck(fieldName, valName string) bool {
fieldName = strings.ToLower(fieldName)
valName = strings.ToLower(valName)
if valName == "githubclient" && (fieldName == "client" || fieldName == "gitopshelper") {
return true
}
for _, str := range []string{"logger", "dbconnection", "syncedenforcer"} {
if fieldName == str {
return true
}
}
return false
}

func skipUnnecessaryFieldsForCheck(fieldName, valName string) bool {
fieldName = strings.ToLower(fieldName)
valName = strings.ToLower(valName)
if valName == "cicdconfig" {
return true
}
fieldAndValName := map[string][]string{
"app": {"enforcerv2", "server"},
"gitfactory": {"client"},
"argocdconnectionmanagerimpl": {"argocdsettings"},
"enforcerimpl": {"cache", "enforcerv2"},
"helmappclientimpl": {"applicationserviceclient"},
"modulecronserviceimpl": {"cron"},
"oteltracingserviceimpl": {"traceprovider"},
"terminalaccessrepositoryimpl": {"templatescache"},
}
if _, ok := fieldAndValName[valName]; ok {
for _, ignoreFieldName := range fieldAndValName[valName] {
if ignoreFieldName == fieldName {
return true
}
}
}
return false
}
func GetUnexportedField(field reflect.Value) interface{} {
return reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem().Interface()
}

func isExported(fieldName string) bool {
return strings.ToUpper(fieldName[0:1]) == fieldName[0:1]
}

func writeResultToFile(data int) error {
file, err := os.Create("/test/output.env")
if err != nil {
log.Println("Failed to create file:", err)
return err
}
defer file.Close()
_, err = file.WriteString(fmt.Sprintf("OUTPUT=%d", data))
if err != nil {
log.Println("Failed to write to file:", err)
return err
}
return nil
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ require (
github.com/evanphx/json-patch v5.6.0+incompatible
github.com/gammazero/workerpool v1.1.3
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
github.com/go-errors/errors v1.4.2
github.com/go-git/go-billy/v5 v5.5.0
github.com/go-git/go-git/v5 v5.11.0
github.com/go-pg/pg v6.15.1+incompatible
Expand Down
11 changes: 10 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,23 @@ import (
"fmt"
_ "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
_ "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1"
util2 "github.com/devtron-labs/devtron/util"
"log"
"os"
"os/signal"
"syscall"
)

func main() {

globalEnvVariables, err := util2.GetEnvironmentVariables()
if err != nil {
log.Println("error while getting env variables reason:", err)
return
}
if globalEnvVariables.GlobalEnvVariables.ExecuteWireNilChecker {
CheckIfNilInWire()
return
}
app, err := InitializeApp()
if err != nil {
log.Panic(err)
Expand Down
7 changes: 6 additions & 1 deletion tests/integrationTesting/create-test-env.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,13 @@ install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl create ns devtroncd
kubectl create ns devtron-cd
kubectl create ns devtron-ci
kubectl -n devtroncd create cm git-hash-cm --from-literal=GIT_HASH=$GIT_HASH
kubectl -n devtroncd apply -f $PWD/tests/integrationTesting/postgresql-secret.yaml
kubectl -ndevtroncd apply -f $PWD/tests/integrationTesting/postgresql.yaml
kubectl -n devtroncd apply -f $PWD/tests/integrationTesting/devtron-secret.yaml
kubectl -n devtroncd apply -f $PWD/tests/integrationTesting/nats-server.yaml
# we are copying sql scripts into node container and this conainer's name is fixed
docker cp $PWD/scripts/sql/ k3d-it-cluster-server-0:./tmp/scripts
yq '(select(.metadata.name == "postgresql-migrate-devtron") | .spec.template.spec.containers[0].env[0].value) = env(TEST_BRANCH)' $PWD/tests/integrationTesting/migrator.yaml -i
yq '(select(.metadata.name == "postgresql-migrate-devtron") | .spec.template.spec.containers[0].env[9].value) = env(LATEST_HASH)' $PWD/tests/integrationTesting/migrator.yaml -i
kubectl -ndevtroncd apply -f $PWD/tests/integrationTesting/migrator.yaml
Expand Down Expand Up @@ -50,4 +55,4 @@ helm dependency up
helm template devtron . --set installer.modules={cicd} -s templates/workflow.yaml >./argo_wf.yaml
kubectl apply -f ./argo_wf.yaml
while [ ! $(kubectl -n argo get deployment workflow-controller -o jsonpath="{.status.readyReplicas}") ]; do sleep 10; done
cd $PWD
cd $PWD
14 changes: 14 additions & 0 deletions tests/integrationTesting/devtron-secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v1
data:
PG_PASSWORD: c2hhcmVkLWRldnRyb24tcGc=
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: orchestrator-oss-shared-cd-dcd
meta.helm.sh/release-namespace: devtroncd
creationTimestamp: "2024-03-19T13:58:54Z"
labels:
app.kubernetes.io/managed-by: Helm
name: devtron-secret
namespace: devtroncd
type: Opaque
10 changes: 10 additions & 0 deletions tests/integrationTesting/exportEnvsExecuteWireNilChecker.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
cd test
./tests/integrationTesting/create-test-env.sh
./tests/integrationTesting/run-integration-test.sh
touch output.env
export NODE_IP_ADDRESS=$(kubectl get node --no-headers -o custom-columns=INTERNAL-IP:status.addresses[0].address)
export PG_ADDR=$NODE_IP_ADDRESS
export NATS_SERVER_HOST=nats://$NODE_IP_ADDRESS:30236
go mod tidy
go run .
cp output.env ../tempfile
26 changes: 14 additions & 12 deletions tests/integrationTesting/migrator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,11 @@ spec:
spec:
containers:
- name: postgresql-migrate-devtron
image: quay.io/devtron/migrator:71748de9-149-11112
image: quay.io/devtron/migrator:e026843e-866-11925
volumeMounts:
- mountPath: /tmp/app/
name: sql-scripts-volume
env:
- name: GIT_BRANCH
value: main
- name: SCRIPT_LOCATION
value: scripts/sql/
- name: GIT_REPO_URL
value: https://github.com/devtron-labs/devtron.git
- name: DB_TYPE
value: postgres
- name: DB_USER_NAME
Expand All @@ -27,12 +24,17 @@ spec:
value: orchestrator
- name: MIGRATE_TO_VERSION
value: "0"
- name: GIT_HASH
value: be7da471e45a501eba19eaa5f8d08dfe5601598d
- name: SCRIPT_MOUNTED
value: "true"
envFrom:
- secretRef:
name: postgresql-migrator
restartPolicy: OnFailure
volumes:
- name: sql-scripts-volume
hostPath:
path: /tmp/scripts/
type: DirectoryOrCreate
backoffLimit: 20
activeDeadlineSeconds: 1500
---
Expand All @@ -45,7 +47,7 @@ spec:
spec:
containers:
- name: postgresql-migrate-casbin
image: quay.io/devtron/migrator:71748de9-149-11112
image: quay.io/devtron/migrator:e026843e-866-11925
env:
- name: SCRIPT_LOCATION
value: scripts/casbin/
Expand Down Expand Up @@ -83,7 +85,7 @@ spec:
spec:
containers:
- name: postgresql-migrate-gitsensor
image: quay.io/devtron/migrator:71748de9-149-11112
image: quay.io/devtron/migrator:e026843e-866-11925
env:
- name: SCRIPT_LOCATION
value: scripts/sql/
Expand Down Expand Up @@ -121,7 +123,7 @@ spec:
spec:
containers:
- name: postgresql-migrate-lens
image: quay.io/devtron/migrator:71748de9-149-11112
image: quay.io/devtron/migrator:e026843e-866-11925
env:
- name: SCRIPT_LOCATION
value: scripts/sql/
Expand Down
Loading
Loading