@colisweb/rescript-toolkit 5.44.4 → 5.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.secure_files/{ci-functions-v17.12.0-feat-add-mysql-service-1.0.5beta → ci-functions-v20.3.2} +707 -110
- package/.secure_files/{ci-functions-v17.12.0-feat-add-mysql-service-1.0.6beta → ci-functions-v20.3.3} +707 -110
- package/package.json +1 -1
- package/src/form/Toolkit__Form.res +5 -1
- package/src/router/Toolkit__Router.res +18 -36
- package/src/ui/Toolkit__Ui_DropdownMenu.res +48 -32
- package/src/ui/Toolkit__Ui_Layout.res +9 -19
- package/src/vendors/Radix.res +2 -2
- package/src/vendors/ReactTableV8.res +0 -184
|
@@ -62,7 +62,7 @@ extract_arg() {
|
|
|
62
62
|
value=$3
|
|
63
63
|
if [ "--$name" != "$passed" ]; then
|
|
64
64
|
echo "missing argument $name"
|
|
65
|
-
|
|
65
|
+
return 1
|
|
66
66
|
fi
|
|
67
67
|
eval $name='$value'
|
|
68
68
|
}
|
|
@@ -92,63 +92,6 @@ aws_ecr_token() {
|
|
|
92
92
|
aws ecr get-authorization-token --region=eu-west-1 --output text --query 'authorizationData[].authorizationToken'
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
# you will need jq to use these commands. You can install it using "brew install jq"
|
|
96
|
-
# delete_images colisweb_api 8
|
|
97
|
-
# will delete images older than 8 weeks
|
|
98
|
-
delete_images() {
|
|
99
|
-
|
|
100
|
-
REPO=$1
|
|
101
|
-
WEEKS=${2:-16}
|
|
102
|
-
|
|
103
|
-
WEEKS_AGO=$(date -v-${WEEKS}w +%F)
|
|
104
|
-
|
|
105
|
-
#Get all ecr images
|
|
106
|
-
IMAGES=$(aws ecr describe-images --repository-name $REPO --output json)
|
|
107
|
-
|
|
108
|
-
#Filter unnecessary values and map `imagePushedAt` to EPOCH
|
|
109
|
-
NON_LATEST_IMAGES=$(echo $IMAGES | jq '[.imageDetails[] | select(.imageTags | any(endswith("latest")) | not)]')
|
|
110
|
-
|
|
111
|
-
#Filter on EPOCH
|
|
112
|
-
OLD_IMAGES=$(echo $NON_LATEST_IMAGES | jq --arg date $WEEKS_AGO '.[] | select(.imagePushedAt[0:10] < $date).imageDigest')
|
|
113
|
-
while IFS= read -r IMAGE; do
|
|
114
|
-
if [ "$IMAGE" != "" ]; then
|
|
115
|
-
echo "Deleting $IMAGE from $REPO"
|
|
116
|
-
AWS_PAGER="" aws ecr batch-delete-image --repository-name $REPO --image-ids imageDigest=$IMAGE
|
|
117
|
-
fi
|
|
118
|
-
done <<< "$OLD_IMAGES"
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
# delete_images_all_repos 12
|
|
122
|
-
# will delete images in all repositories older than 12 weeks
|
|
123
|
-
delete_images_all_repos() {
|
|
124
|
-
REPOSITORIES=$(aws ecr describe-repositories --output json | jq -r '.[]|.[].repositoryName')
|
|
125
|
-
|
|
126
|
-
while IFS= read -r REPO; do
|
|
127
|
-
echo "processing ECR repository $REPO"
|
|
128
|
-
delete_images $REPO $1
|
|
129
|
-
done <<< "$REPOSITORIES"
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
delete_old_cache() {
|
|
133
|
-
DATE=${1:-$(date -v-1m +%F)}
|
|
134
|
-
CACHE_BUCKET=${2:-"s3://gitlab-colisweb-distributed-cache/project/"}
|
|
135
|
-
|
|
136
|
-
echo "deleting from cache $CACHE_BUCKET all older than $DATE"
|
|
137
|
-
|
|
138
|
-
aws_ecr_login
|
|
139
|
-
|
|
140
|
-
while read -r line; do
|
|
141
|
-
datum=$(echo $line | cut -c1-10)
|
|
142
|
-
if [[ "$datum" < "$DATE" ]] ; then
|
|
143
|
-
# Shell Parameter Expansion: ${parameter##word}
|
|
144
|
-
# Allow to return the result from "word" to the end of "parameters"
|
|
145
|
-
# Here we need the end of the string after "project/" (corresponding to the S3 gitlab project id and filename)
|
|
146
|
-
TO_DELETE="$CACHE_BUCKET${line##* project/}"
|
|
147
|
-
echo $TO_DELETE
|
|
148
|
-
aws s3 rm $TO_DELETE
|
|
149
|
-
fi
|
|
150
|
-
done < <(aws s3 ls $CACHE_BUCKET --recursive)
|
|
151
|
-
}
|
|
152
95
|
|
|
153
96
|
#!/usr/bin/env bash
|
|
154
97
|
|
|
@@ -250,11 +193,11 @@ entries:
|
|
|
250
193
|
cronjob:
|
|
251
194
|
EOT
|
|
252
195
|
|
|
253
|
-
#
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
196
|
+
# helm stable repo have changed and must be updated manually, in versions < v2.17.0
|
|
197
|
+
helm repo add colisweb s3://colisweb-helm-charts/colisweb --force-update
|
|
198
|
+
helm repo add stable https://charts.helm.sh/stable --force-update
|
|
199
|
+
helm repo update
|
|
200
|
+
helm dependency update ${ROOT_PATH}/${CHART_PATH}
|
|
258
201
|
|
|
259
202
|
# Gather values/*.yaml files
|
|
260
203
|
VALUES_PATH="${ROOT_PATH}/${CHART_NAME}/values"
|
|
@@ -262,7 +205,7 @@ EOT
|
|
|
262
205
|
[ -d $VALUES_PATH ] && VALUES_FILES=$(find $VALUES_PATH -type f -maxdepth 1 -name "*.yaml" | sed 's/^/ -f /' | tr -d \\n | sed 's/%//')
|
|
263
206
|
|
|
264
207
|
# Deploy
|
|
265
|
-
|
|
208
|
+
helm upgrade --install \
|
|
266
209
|
--namespace ${ENVIRONMENT} \
|
|
267
210
|
${VALUES_FILES} \
|
|
268
211
|
-f ${ROOT_PATH}/${CONFIG_PATH}/common.yaml \
|
|
@@ -272,7 +215,7 @@ EOT
|
|
|
272
215
|
${CHART_NAME} ${ROOT_PATH}/${CHART_PATH}
|
|
273
216
|
|
|
274
217
|
|
|
275
|
-
|
|
218
|
+
verify_deployments -t 10m $ENVIRONMENT $CHART_NAME
|
|
276
219
|
|
|
277
220
|
}
|
|
278
221
|
|
|
@@ -509,12 +452,12 @@ configure_kubectl_for() {
|
|
|
509
452
|
database_k8s() {
|
|
510
453
|
MODE=$1
|
|
511
454
|
case $MODE in
|
|
512
|
-
"tests") SSH_LOCAL_PORT=2224;PG_LOCAL_PORT=24440;CA_LOCAL_PORT=25430;ENV="tests";;
|
|
513
|
-
"testing") SSH_LOCAL_PORT=2225;PG_LOCAL_PORT=24441;CA_LOCAL_PORT=25431;ENV="testing";;
|
|
514
|
-
"staging") SSH_LOCAL_PORT=2226;PG_LOCAL_PORT=24442;CA_LOCAL_PORT=25432;ENV="staging";;
|
|
515
|
-
"production") SSH_LOCAL_PORT=2227;PG_LOCAL_PORT=24443;CA_LOCAL_PORT=25433;ENV="production";;
|
|
516
|
-
"production_rw") SSH_LOCAL_PORT=2227;PG_LOCAL_PORT=24444;CA_LOCAL_PORT=25434;ENV="production";;
|
|
517
|
-
"recette") SSH_LOCAL_PORT=2228;PG_LOCAL_PORT=24446;CA_LOCAL_PORT=25436;ENV="recette";;
|
|
455
|
+
"tests") SSH_LOCAL_PORT=2224;COMP_LOCAL_PORT=25550;PG_LOCAL_PORT=24440;CA_LOCAL_PORT=25430;ENV="tests";;
|
|
456
|
+
"testing") SSH_LOCAL_PORT=2225;COMP_LOCAL_PORT=25551;PG_LOCAL_PORT=24441;CA_LOCAL_PORT=25431;ENV="testing";;
|
|
457
|
+
"staging") SSH_LOCAL_PORT=2226;COMP_LOCAL_PORT=25552;PG_LOCAL_PORT=24442;CA_LOCAL_PORT=25432;ENV="staging";;
|
|
458
|
+
"production") SSH_LOCAL_PORT=2227;COMP_LOCAL_PORT=25553;PG_LOCAL_PORT=24443;CA_LOCAL_PORT=25433;ENV="production";;
|
|
459
|
+
"production_rw") SSH_LOCAL_PORT=2227;COMP_LOCAL_PORT=25554;PG_LOCAL_PORT=24444;CA_LOCAL_PORT=25434;ENV="production";;
|
|
460
|
+
"recette") SSH_LOCAL_PORT=2228;COMP_LOCAL_PORT=25556; PG_LOCAL_PORT=24446;CA_LOCAL_PORT=25436;ENV="recette";;
|
|
518
461
|
*) echo "Unsupported ENV : $MODE"; return 1 ;;
|
|
519
462
|
esac
|
|
520
463
|
|
|
@@ -535,23 +478,28 @@ database_k8s() {
|
|
|
535
478
|
HostName 127.0.0.1
|
|
536
479
|
Port 2225
|
|
537
480
|
LocalForward 24441 toutatis-testing-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
481
|
+
LocalForward 25551 toutatis-testing-composite-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
538
482
|
LocalForward 25431 toutatis-testing-mysql-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
539
483
|
LocalForward 25531 testapirds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
484
|
+
LocalForward 25561 toutatis-testing-oracle-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:1521
|
|
540
485
|
Host bastion_staging
|
|
541
486
|
HostName 127.0.0.1
|
|
542
487
|
Port 2226
|
|
543
488
|
LocalForward 24442 toutatis-staging-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
489
|
+
LocalForward 25552 toutatis-staging-composite-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
544
490
|
LocalForward 25432 toutatis-staging-mysql-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
545
491
|
Host bastion_recette
|
|
546
492
|
HostName 127.0.0.1
|
|
547
493
|
Port 2228
|
|
548
494
|
LocalForward 24446 toutatis-recette-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
495
|
+
LocalForward 25556 toutatis-recette-composite-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
549
496
|
LocalForward 25436 toutatis-recette-mysql-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
550
497
|
LocalForward 25536 testapirds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
551
498
|
Host bastion_production
|
|
552
499
|
HostName 127.0.0.1
|
|
553
500
|
Port 2227
|
|
554
501
|
LocalForward 24443 toutatis-production-db-replica.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
502
|
+
LocalForward 25553 toutatis-production-composite-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
|
|
555
503
|
LocalForward 25433 toutatis-production-mysql-db-replica.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
|
|
556
504
|
EOF
|
|
557
505
|
if [ "$MODE" = "production_rw" ] ; then
|
|
@@ -565,6 +513,7 @@ EOF
|
|
|
565
513
|
-F "$bastion_config" \
|
|
566
514
|
"bastion_$ENV"
|
|
567
515
|
|
|
516
|
+
echo "sample command (composite) : 'psql postgres://postgres@127.0.0.1:$COMP_LOCAL_PORT'"
|
|
568
517
|
echo "sample command : 'psql postgres://postgres@127.0.0.1:$PG_LOCAL_PORT'"
|
|
569
518
|
echo "sample command : 'mysql -u colisweb -h 127.0.0.1 -P $CA_LOCAL_PORT -p db_name'"
|
|
570
519
|
|
|
@@ -612,8 +561,6 @@ kube_init_database_once() {
|
|
|
612
561
|
echo " Initializing Database '$db_database' for namespace $namespace"
|
|
613
562
|
echo "======================="
|
|
614
563
|
|
|
615
|
-
set -x
|
|
616
|
-
|
|
617
564
|
echo "Checking if Database '$db_database' exists"
|
|
618
565
|
set +e
|
|
619
566
|
psql_on_k8 $namespace once "$db_init_username:$db_init_password@$db_host:$db_port" -lqtA | cut -d\| -f1 | grep "^$db_database$"
|
|
@@ -843,8 +790,6 @@ kube_init_service_database() {
|
|
|
843
790
|
|
|
844
791
|
local db_connection="$db_init_username:$db_init_password@$db_host:$db_port"
|
|
845
792
|
|
|
846
|
-
set -x
|
|
847
|
-
|
|
848
793
|
echo "Checking if Database '$db_database' exists"
|
|
849
794
|
set +e
|
|
850
795
|
psql_on_k8 $namespace $service $db_connection -lqtA | cut -d\| -f1 | grep "^$db_database$"
|
|
@@ -912,14 +857,29 @@ EOF
|
|
|
912
857
|
}
|
|
913
858
|
#!/usr/bin/env bash
|
|
914
859
|
|
|
860
|
+
function kstatus() {
|
|
861
|
+
if [ -z "$3" ]
|
|
862
|
+
then
|
|
863
|
+
configure_kubectl_for $1 && watch -n 1 "kubectl -n $1 get $2"
|
|
864
|
+
else
|
|
865
|
+
configure_kubectl_for $1 && watch -n 1 "kubectl -n $1 get $2 | grep $3"
|
|
866
|
+
fi
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
#!/usr/bin/env bash
|
|
870
|
+
|
|
915
871
|
k8_nodes_stats() {
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
872
|
+
ENV=${1:-testing}
|
|
873
|
+
|
|
874
|
+
configure_kubectl_for "${ENV}"
|
|
875
|
+
|
|
876
|
+
kubectl get nodes -o name |
|
|
877
|
+
xargs kubectl describe |
|
|
878
|
+
grep "^Name\|workType\|cpu \|memory " |
|
|
879
|
+
sed -r 's/[ :=]+/\t/g' |
|
|
880
|
+
sed 's/\tworkType\t//g' |
|
|
881
|
+
sed -r 's/^Name/---\nName/g' |
|
|
882
|
+
grep --color "Name\|web\|workers\|cpu\|memory\|---"
|
|
923
883
|
}
|
|
924
884
|
|
|
925
885
|
#!/usr/bin/env bash
|
|
@@ -985,20 +945,59 @@ pod_copy_to() {
|
|
|
985
945
|
|
|
986
946
|
pick_pod() {
|
|
987
947
|
ENV=$1
|
|
988
|
-
POD_FILTER
|
|
948
|
+
POD_FILTER=$2
|
|
989
949
|
configure_kubectl_for $ENV
|
|
990
950
|
|
|
991
951
|
if [ -z "$2" ] ; then
|
|
992
952
|
kubectl -n $ENV get pods | gum filter | cut -f1 -d" "
|
|
993
953
|
else
|
|
994
|
-
if PODS=$(kubectl -n $ENV get pods
|
|
995
|
-
echo $PODS
|
|
954
|
+
if PODS=$(kubectl -n $ENV get pods | grep -m1 "$POD_FILTER" | cut -f1 -d" "); then
|
|
955
|
+
echo $PODS
|
|
996
956
|
else
|
|
997
957
|
echo "no pods found on $ENV matching $POD_FILTER" >&2
|
|
998
958
|
fi
|
|
999
959
|
fi
|
|
1000
960
|
}
|
|
1001
961
|
|
|
962
|
+
# pods_settings $ENV
|
|
963
|
+
# Will output a CSV (;) of all deployments on this environment with cpu and memory request and limits
|
|
964
|
+
# Errors and null outputs are ignored and won't be in the output.
|
|
965
|
+
pods_resources() {
|
|
966
|
+
ENV=$1
|
|
967
|
+
configure_kubectl_for $ENV
|
|
968
|
+
DEPLOYMENTS=(
|
|
969
|
+
$(kubectl -n $ENV get deployments | grep -Eo '^[^ ]+' | grep -v 'NAME')
|
|
970
|
+
)
|
|
971
|
+
echo "deployment; request_cpu; request_memory; limits_cpu;limits_memory"
|
|
972
|
+
for D in "${DEPLOYMENTS[@]}"; do
|
|
973
|
+
info=$(kubectl -n $ENV get deployment -o yaml $D |
|
|
974
|
+
yq '.spec.template.spec.containers[].resources' |
|
|
975
|
+
yq '.L = .requests.cpu + "; " + .requests.memory + "; " + .limits.cpu + "; " + .limits.memory' |
|
|
976
|
+
yq ".L") 2&>/dev/null
|
|
977
|
+
if ! [ "$info" = "null" ]; then
|
|
978
|
+
echo "$D; $info"
|
|
979
|
+
fi
|
|
980
|
+
done
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
pods_strategies() {
|
|
984
|
+
ENV=$1
|
|
985
|
+
configure_kubectl_for $ENV
|
|
986
|
+
DEPLOYMENTS=(
|
|
987
|
+
$(kubectl -n $ENV get deployments | grep -Eo '^[^ ]+' | grep -v 'NAME')
|
|
988
|
+
)
|
|
989
|
+
echo "deployment; max_surge; max_unavailable"
|
|
990
|
+
for D in "${DEPLOYMENTS[@]}"; do
|
|
991
|
+
info=$(kubectl -n $ENV get deployment -o yaml $D |
|
|
992
|
+
yq '.spec.strategy' |
|
|
993
|
+
yq '.L = .rollingUpdate.maxSurge + "; " + .rollingUpdate.maxUnavailable' |
|
|
994
|
+
yq ".L") 2&>/dev/null
|
|
995
|
+
if ! [ "$info" = "null" ]; then
|
|
996
|
+
echo "$D; $info"
|
|
997
|
+
fi
|
|
998
|
+
done
|
|
999
|
+
}
|
|
1000
|
+
|
|
1002
1001
|
#!/usr/bin/env bash
|
|
1003
1002
|
|
|
1004
1003
|
bastion_config_for_redis_ca() {
|
|
@@ -1433,6 +1432,182 @@ spec:
|
|
|
1433
1432
|
}
|
|
1434
1433
|
|
|
1435
1434
|
|
|
1435
|
+
#!/usr/bin/env bash
|
|
1436
|
+
|
|
1437
|
+
# Usage info
|
|
1438
|
+
show_help_shell() {
|
|
1439
|
+
local help="""Usage: run_job_k8s -s SCRIPT [-e ENV] [-c CONFIG] [-p POD] [-f FOLDER] [ARGS]
|
|
1440
|
+
Create a k8s job executing a script
|
|
1441
|
+
|
|
1442
|
+
-h display this help and exit
|
|
1443
|
+
-s SCRIPT run script SCRIPT on a pod (SCRIPT must be a .sc file)
|
|
1444
|
+
-e ENV opt. set execution environment (default to testing)
|
|
1445
|
+
-c CONFIG opt. secret file needed for the script (must be a .sc file, not a .secret file)
|
|
1446
|
+
-p POD opt. name of the pod to create (default to $USERNAME)
|
|
1447
|
+
-f FOLDER opt. name of the folder containing the scripts to execute (if SCRIPT needs other files)
|
|
1448
|
+
ARGS opt. additional arguments for SCRIPT
|
|
1449
|
+
|
|
1450
|
+
The organisation of the files must be the same locally as on the pod :
|
|
1451
|
+
- /code containing the script to execute (arg -s) and the other needed files (if the arg -f is used, it must reference this directory)
|
|
1452
|
+
- /conf containing the secret file (arg -c if used)
|
|
1453
|
+
E.g. in the script \"/code/script.sc\", to use a secret file \"/conf/secret.sc\", the import should look like \"import \$file.^.conf.secret.sc\"
|
|
1454
|
+
"""
|
|
1455
|
+
echo "$help"
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
run_shell_k8s() {
|
|
1459
|
+
|
|
1460
|
+
#default values
|
|
1461
|
+
local namespace="testing"
|
|
1462
|
+
local name="$USERNAME"
|
|
1463
|
+
local secret=""
|
|
1464
|
+
local shell_folder=""
|
|
1465
|
+
local script_script=""
|
|
1466
|
+
|
|
1467
|
+
while getopts ":e:c:p:f:s:h" opt; do
|
|
1468
|
+
case $opt in
|
|
1469
|
+
e)
|
|
1470
|
+
namespace="$OPTARG" >&2
|
|
1471
|
+
;;
|
|
1472
|
+
p)
|
|
1473
|
+
name="$OPTARG" >&2
|
|
1474
|
+
;;
|
|
1475
|
+
c)
|
|
1476
|
+
secret="$OPTARG" >&2
|
|
1477
|
+
;;
|
|
1478
|
+
f)
|
|
1479
|
+
shell_folder="$OPTARG" >&2
|
|
1480
|
+
;;
|
|
1481
|
+
s)
|
|
1482
|
+
shell_script="$OPTARG" >&2
|
|
1483
|
+
;;
|
|
1484
|
+
h)
|
|
1485
|
+
show_help_job
|
|
1486
|
+
return 0
|
|
1487
|
+
;;
|
|
1488
|
+
:)
|
|
1489
|
+
echo "Option -$OPTARG requires an argument. Run run_cron_job_k8s -h for help" >&2
|
|
1490
|
+
return 0
|
|
1491
|
+
;;
|
|
1492
|
+
\?)
|
|
1493
|
+
echo "Invalid option: -$OPTARG. Run run_cron_job_k8s -h for help" >&2
|
|
1494
|
+
return 0
|
|
1495
|
+
;;
|
|
1496
|
+
esac
|
|
1497
|
+
done
|
|
1498
|
+
|
|
1499
|
+
if [ -z "$shell_script" ]; then
|
|
1500
|
+
echo 'Missing -s. Run run_job_k8s -h for help' >&2
|
|
1501
|
+
return 0
|
|
1502
|
+
fi
|
|
1503
|
+
|
|
1504
|
+
shift "$((OPTIND-1))"
|
|
1505
|
+
|
|
1506
|
+
local script_args=$(
|
|
1507
|
+
if [ "$#" -gt 0 ] ; then
|
|
1508
|
+
printf '"'
|
|
1509
|
+
join_by '", "' $*
|
|
1510
|
+
printf '"'
|
|
1511
|
+
fi
|
|
1512
|
+
)
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
local IMAGE="949316342391.dkr.ecr.eu-west-1.amazonaws.com/docker-infra-builder:v3.1.0"
|
|
1518
|
+
local JOB_NAME="job-shell-$name"
|
|
1519
|
+
|
|
1520
|
+
if [[ ! -r "$shell_script" ]]; then
|
|
1521
|
+
echo "shell script not found $shell_script"
|
|
1522
|
+
return 2
|
|
1523
|
+
else
|
|
1524
|
+
local CONFIG_MAP="config-$JOB_NAME"
|
|
1525
|
+
local CONFIG_MAP_DIR="$(mktemp -d)"
|
|
1526
|
+
local SECRET_MAP="secret-$JOB_NAME"
|
|
1527
|
+
|
|
1528
|
+
configure_kubectl_for $namespace
|
|
1529
|
+
|
|
1530
|
+
if [[ ! -z $shell_folder && -d $shell_folder ]] ; then
|
|
1531
|
+
cp -r "$shell_folder/" "$CONFIG_MAP_DIR"
|
|
1532
|
+
fi
|
|
1533
|
+
cp "$shell_script" "$CONFIG_MAP_DIR/script.sh"
|
|
1534
|
+
|
|
1535
|
+
kubectl -n $namespace get configmap $CONFIG_MAP && kubectl -n $namespace delete configmap $CONFIG_MAP
|
|
1536
|
+
kubectl -n $namespace create configmap $CONFIG_MAP --from-file="$CONFIG_MAP_DIR"
|
|
1537
|
+
|
|
1538
|
+
kubectl -n $namespace get secret $SECRET_MAP && kubectl -n $namespace delete secret $SECRET_MAP
|
|
1539
|
+
kubectl -n $namespace create secret generic $SECRET_MAP --from-file="$secret"
|
|
1540
|
+
|
|
1541
|
+
kubectl -n $namespace get job $JOB_NAME && kubectl -n $namespace delete job $JOB_NAME
|
|
1542
|
+
|
|
1543
|
+
echo "starting $JOB_NAME with $IMAGE"
|
|
1544
|
+
fi
|
|
1545
|
+
|
|
1546
|
+
JOB_DEFINITION='
|
|
1547
|
+
apiVersion: batch/v1
|
|
1548
|
+
kind: Job
|
|
1549
|
+
metadata:
|
|
1550
|
+
name: '$JOB_NAME'
|
|
1551
|
+
namespace: '$namespace'
|
|
1552
|
+
spec:
|
|
1553
|
+
template:
|
|
1554
|
+
spec:
|
|
1555
|
+
containers:
|
|
1556
|
+
- name: '$JOB_NAME'
|
|
1557
|
+
command: ["bash", "/code/script.sh"]
|
|
1558
|
+
image: '$IMAGE'
|
|
1559
|
+
args: ['$script_args']
|
|
1560
|
+
env:
|
|
1561
|
+
- name: POD_NAME
|
|
1562
|
+
valueFrom:
|
|
1563
|
+
fieldRef:
|
|
1564
|
+
apiVersion: v1
|
|
1565
|
+
fieldPath: metadata.name
|
|
1566
|
+
- name: POD_NAMESPACE
|
|
1567
|
+
valueFrom:
|
|
1568
|
+
fieldRef:
|
|
1569
|
+
apiVersion: v1
|
|
1570
|
+
fieldPath: metadata.namespace
|
|
1571
|
+
- name: HOST_IP
|
|
1572
|
+
valueFrom:
|
|
1573
|
+
fieldRef:
|
|
1574
|
+
apiVersion: v1
|
|
1575
|
+
fieldPath: status.hostIP
|
|
1576
|
+
volumeMounts:
|
|
1577
|
+
- name: config
|
|
1578
|
+
mountPath: /code
|
|
1579
|
+
- name: secret
|
|
1580
|
+
mountPath: /conf
|
|
1581
|
+
readOnly: true
|
|
1582
|
+
resources:
|
|
1583
|
+
requests:
|
|
1584
|
+
cpu: 500m
|
|
1585
|
+
memory: 256Mi
|
|
1586
|
+
limits:
|
|
1587
|
+
cpu: 4000m
|
|
1588
|
+
memory: 1Gi
|
|
1589
|
+
nodeSelector:
|
|
1590
|
+
workType: workers
|
|
1591
|
+
restartPolicy: Never
|
|
1592
|
+
volumes:
|
|
1593
|
+
- name: config
|
|
1594
|
+
configMap:
|
|
1595
|
+
name: '$CONFIG_MAP'
|
|
1596
|
+
- name: secret
|
|
1597
|
+
secret:
|
|
1598
|
+
secretName: '$SECRET_MAP'
|
|
1599
|
+
- name: stockage
|
|
1600
|
+
|
|
1601
|
+
'
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
echo $JOB_DEFINITION > /tmp/job.yaml
|
|
1605
|
+
|
|
1606
|
+
kubectl -n $namespace apply -f /tmp/job.yaml
|
|
1607
|
+
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
|
|
1436
1611
|
#!/usr/bin/env bash
|
|
1437
1612
|
|
|
1438
1613
|
run_task() {
|
|
@@ -1551,6 +1726,423 @@ jwt_token() {
|
|
|
1551
1726
|
|
|
1552
1727
|
#!/usr/bin/env bash
|
|
1553
1728
|
|
|
1729
|
+
alias update_devtool="git -C ~/.oh-my-zsh/custom/dev-tools/ pull"
|
|
1730
|
+
|
|
1731
|
+
SCRIPT_PATH=$SCRIPT_FULL_PATH/shell/run
|
|
1732
|
+
PATH="$PATH:$SCRIPT_PATH/script"
|
|
1733
|
+
|
|
1734
|
+
function get_token {
|
|
1735
|
+
local ENV=$1
|
|
1736
|
+
local LOGIN_FILE="$HOME/scriptlogin"
|
|
1737
|
+
|
|
1738
|
+
if [ ! -f "$LOGIN_FILE" ]; then
|
|
1739
|
+
cat > "$LOGIN_FILE" <<-'EOF'
|
|
1740
|
+
#!/bin/bash
|
|
1741
|
+
case $ENV in
|
|
1742
|
+
"testing")
|
|
1743
|
+
local BO_USERNAME=""
|
|
1744
|
+
local BO_PASSWORD=""
|
|
1745
|
+
;;
|
|
1746
|
+
"recette")
|
|
1747
|
+
local BO_USERNAME=""
|
|
1748
|
+
local BO_PASSWORD=""
|
|
1749
|
+
;;
|
|
1750
|
+
"staging")
|
|
1751
|
+
local BO_USERNAME=""
|
|
1752
|
+
local BO_PASSWORD=""
|
|
1753
|
+
;;
|
|
1754
|
+
*)
|
|
1755
|
+
local BO_USERNAME=""
|
|
1756
|
+
local BO_PASSWORD=""
|
|
1757
|
+
echo "ENV ${ENV} inconu"
|
|
1758
|
+
return
|
|
1759
|
+
;;
|
|
1760
|
+
esac
|
|
1761
|
+
EOF
|
|
1762
|
+
fi
|
|
1763
|
+
|
|
1764
|
+
source "${LOGIN_FILE}"
|
|
1765
|
+
|
|
1766
|
+
if [ -z "$BO_PASSWORD" ] || [ -z "$BO_USERNAME" ]
|
|
1767
|
+
then
|
|
1768
|
+
echo éditer le ficher "$LOGIN_FILE"
|
|
1769
|
+
return 1
|
|
1770
|
+
fi
|
|
1771
|
+
|
|
1772
|
+
curl -o /dev/null -D - "https://api.$ENV.colisweb.com/api/v6/authent/external/session" \
|
|
1773
|
+
--data-raw '{"username":"'"${BO_USERNAME}"'","password":"'"${BO_PASSWORD/\"/\\\"}"'"}' \
|
|
1774
|
+
--compressed 2> /dev/null | grep set-cook | sed -e 's/.*session=//g;s/;.*//g'
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
function bash_array_to_json {
|
|
1778
|
+
function join {
|
|
1779
|
+
local IFS="$1"
|
|
1780
|
+
shift
|
|
1781
|
+
echo "$*"
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
echo '["'"$(join , $*| sed -e 's/,/","/g' )"'"]' | jq
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
function get_random_street {
|
|
1788
|
+
local CODE_POSTAUX_ARG=${1:-59000}
|
|
1789
|
+
IFS=',' read -r -a CODE_POSTAUX <<< "$CODE_POSTAUX_ARG"
|
|
1790
|
+
for CODE_POSTAL in "${CODE_POSTAUX[@]}"; do
|
|
1791
|
+
if [[ ! "$CODE_POSTAL" =~ ^[0-9]{5}$ ]]; then
|
|
1792
|
+
echo "Chaque CODE_POSTAL doit avoir une taille de 5 chiffre : $CODE_POSTAL"
|
|
1793
|
+
exit 1
|
|
1794
|
+
fi
|
|
1795
|
+
done
|
|
1796
|
+
local CODE_POSTAL=$(echo "${CODE_POSTAUX[@]}" | tr " " "\n" | sort -u -R | head -n 1)
|
|
1797
|
+
|
|
1798
|
+
get_random_street_in_cp $CODE_POSTAL
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
function get_random_street_in_cp {
|
|
1802
|
+
local CODE_POSTAL=$1
|
|
1803
|
+
|
|
1804
|
+
FILENAME="rue-$CODE_POSTAL.lst"
|
|
1805
|
+
if [ ! -f "$FILENAME" ]; then
|
|
1806
|
+
curl --output tmp1.gz https://adresse.data.gouv.fr/data/ban/adresses/latest/csv/adresses-"${CODE_POSTAL:0:2}".csv.gz
|
|
1807
|
+
gzip -d tmp1.gz
|
|
1808
|
+
cut -d\; -f3,5,6,8 tmp1 | sed "/;$CODE_POSTAL;/!d" > "$FILENAME"
|
|
1809
|
+
rm tmp1
|
|
1810
|
+
fi
|
|
1811
|
+
|
|
1812
|
+
sort -R "$FILENAME" | head -n 1
|
|
1813
|
+
}
|
|
1814
|
+
|
|
1815
|
+
function rand_slot {
|
|
1816
|
+
|
|
1817
|
+
local SCENARIO=$2
|
|
1818
|
+
if [ -f "$SCENARIO" ]; then
|
|
1819
|
+
source "$SCENARIO"
|
|
1820
|
+
fi
|
|
1821
|
+
local ORDER_DATE="$1"
|
|
1822
|
+
|
|
1823
|
+
DEFAULT=(
|
|
1824
|
+
"06:00+01:00[Europe/Paris]-08:00+01:00[Europe/Paris]"
|
|
1825
|
+
"08:00+01:00[Europe/Paris]-10:00+01:00[Europe/Paris]"
|
|
1826
|
+
"10:00+01:00[Europe/Paris]-12:00+01:00[Europe/Paris]"
|
|
1827
|
+
"16:00+01:00[Europe/Paris]-18:00+01:00[Europe/Paris]"
|
|
1828
|
+
"18:00+01:00[Europe/Paris]-20:00+01:00[Europe/Paris]"
|
|
1829
|
+
)
|
|
1830
|
+
USAGE=${DELIVERY_SLOTS:-${DEFAULT[@]}}
|
|
1831
|
+
|
|
1832
|
+
IFS="-" read -r start_time end_time < <(echo "${USAGE[@]}" | tr " " "\n" | sort -u -R | head -n 1 )
|
|
1833
|
+
|
|
1834
|
+
echo '{"start":"'"${ORDER_DATE}T${start_time}"'", "end":"'"${ORDER_DATE}T${end_time}"'" }'
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
function call_create_sfh_order {
|
|
1838
|
+
local ENV=$1
|
|
1839
|
+
local TOKEN=$2
|
|
1840
|
+
source "$3"
|
|
1841
|
+
local POS=$4
|
|
1842
|
+
local BARCODES="$5"
|
|
1843
|
+
local CODE_POSTAUX="$6"
|
|
1844
|
+
local PACKAGES=$(echo "$BARCODES" | jq '[{
|
|
1845
|
+
"barcode": .[],
|
|
1846
|
+
"length": 20.0,
|
|
1847
|
+
"height": 15.0,
|
|
1848
|
+
"width": 4.0,
|
|
1849
|
+
"weight": 1.5,
|
|
1850
|
+
"description": "test parcel",
|
|
1851
|
+
"options": [],
|
|
1852
|
+
"productTypology": "Classical",
|
|
1853
|
+
"packageType": "Parcel"
|
|
1854
|
+
}
|
|
1855
|
+
]')
|
|
1856
|
+
|
|
1857
|
+
DELIVERY_OPTIONS_P='['
|
|
1858
|
+
for option in "${DELIVERY_OPTIONS[@]}"; do
|
|
1859
|
+
if [ "$DELIVERY_OPTIONS_P" != '[' ]; then
|
|
1860
|
+
DELIVERY_OPTIONS_P+=", "
|
|
1861
|
+
fi
|
|
1862
|
+
DELIVERY_OPTIONS_P+="\"$option\""
|
|
1863
|
+
done
|
|
1864
|
+
DELIVERY_OPTIONS_P+=']'
|
|
1865
|
+
|
|
1866
|
+
IFS=";" read -r nu rue code_postal ville < <(get_random_street "$CODE_POSTAUX")
|
|
1867
|
+
|
|
1868
|
+
if [ -n "$PICKUP_STORE_CODE" ]; then
|
|
1869
|
+
PICKUP_LOCATION='{
|
|
1870
|
+
"type": "store",
|
|
1871
|
+
"storeCode": "'"$PICKUP_STORE_CODE"'"
|
|
1872
|
+
}'
|
|
1873
|
+
elif [ -n "$PICKUP_WAREHOUSE_CODE" ]; then
|
|
1874
|
+
PICKUP_LOCATION='{
|
|
1875
|
+
"type": "Warehouse",
|
|
1876
|
+
"warehouseCode": "'"$PICKUP_WAREHOUSE_CODE"'"
|
|
1877
|
+
}'
|
|
1878
|
+
else
|
|
1879
|
+
echo PICKUP_WAREHOUSE_CODE ou PICKUP_STORE_CODE doit être définie dans la "$3"
|
|
1880
|
+
exit 1
|
|
1881
|
+
fi
|
|
1882
|
+
JSON='{
|
|
1883
|
+
"primaryOrderReference": "'"${PRIMARY_REF}${POS}"'",
|
|
1884
|
+
"secondaryOrderReference": null,
|
|
1885
|
+
"stages": [
|
|
1886
|
+
{
|
|
1887
|
+
"type": "Pickup",
|
|
1888
|
+
"packageBarcodes": '"$BARCODES"',
|
|
1889
|
+
"location": '"$PICKUP_LOCATION"'
|
|
1890
|
+
},
|
|
1891
|
+
{
|
|
1892
|
+
"type": "Dropoff",
|
|
1893
|
+
"packageBarcodes": '"$BARCODES"',
|
|
1894
|
+
"location": {
|
|
1895
|
+
"type": "Address",
|
|
1896
|
+
"address": {
|
|
1897
|
+
"address1": "'"$nu $rue"'",
|
|
1898
|
+
"postalCode": "'"$code_postal"'",
|
|
1899
|
+
"city": "'"$ville"'",
|
|
1900
|
+
"country": "France",
|
|
1901
|
+
"floor": 0,
|
|
1902
|
+
"lift": "with_lift"
|
|
1903
|
+
},
|
|
1904
|
+
"contact": {
|
|
1905
|
+
"name": "John Doe",
|
|
1906
|
+
"primaryPhone": "+33606060606"
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
],
|
|
1911
|
+
"packages": '"$PACKAGES"',
|
|
1912
|
+
"owner": {
|
|
1913
|
+
"accountIdentifier": "'$ACCOUNT_IDENTIFIER'"
|
|
1914
|
+
},
|
|
1915
|
+
"deliveryOptions": '"$DELIVERY_OPTIONS_P"',
|
|
1916
|
+
"ecommerceValidationDate": "'"${ORDER_DATE}"'"
|
|
1917
|
+
}'
|
|
1918
|
+
|
|
1919
|
+
RESULT=$(curl -s -X POST https://api.$ENV.colisweb.com/api/v6/order/external/warehouse/orders -H 'content-type: application/json' --cookie session="$TOKEN" --data-raw "$JSON")
|
|
1920
|
+
ORDER_ID=$(jq ".orderId" -r <<< "$RESULT")
|
|
1921
|
+
|
|
1922
|
+
echo "nouvelle commande : https://bo.$ENV.colisweb.com/admin/orders/$ORDER_ID" >&2
|
|
1923
|
+
|
|
1924
|
+
echo "$RESULT"
|
|
1925
|
+
}
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
function call_scan {
|
|
1929
|
+
local ENV=$1
|
|
1930
|
+
local TOKEN=$2
|
|
1931
|
+
source "$3"
|
|
1932
|
+
local BARCODES="$4"
|
|
1933
|
+
local SCAN=$(echo "$BARCODES" | jq '[{"barcode" :.[], "context": "shuttle"}]')
|
|
1934
|
+
|
|
1935
|
+
JSON='{"scans":'$SCAN'}'
|
|
1936
|
+
|
|
1937
|
+
curl -X POST https://api.$ENV.colisweb.com/api/v6/parcel/external/units/scans/bulk -H 'content-type: application/json' --cookie session="$TOKEN" --data-raw "$JSON"
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
|
|
1941
|
+
function call_register_delivery {
|
|
1942
|
+
local ENV=$1
|
|
1943
|
+
local TOKEN=$2
|
|
1944
|
+
|
|
1945
|
+
SCENARIO=$3
|
|
1946
|
+
source "$SCENARIO"
|
|
1947
|
+
|
|
1948
|
+
local ORDER_ID=$4
|
|
1949
|
+
local BARCODES="$5"
|
|
1950
|
+
|
|
1951
|
+
DATA='{
|
|
1952
|
+
"slot": '"$(rand_slot "${DELIVERY_DATE}" "$SCENARIO")"',
|
|
1953
|
+
"storeIdOwner":"'"$STORE_ID_OWNER"'",
|
|
1954
|
+
"pickup":{"type":"hub","code":"'"$HUB"'"},
|
|
1955
|
+
"barcodes":'"$BARCODES"',
|
|
1956
|
+
"price":{"origin":"auto","amount":25.9},
|
|
1957
|
+
"allowCustomerSlotUpdate":false,
|
|
1958
|
+
"withForcedSlot": false
|
|
1959
|
+
}'
|
|
1960
|
+
|
|
1961
|
+
curl -X POST https://api.$ENV.colisweb.com/api/v6/order/external/warehouse/orders/"$ORDER_ID"/deliveries \
|
|
1962
|
+
--cookie session="$TOKEN" --data-raw "$DATA"
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
function _create_scenario_file_if_not_exist () {
|
|
1968
|
+
if [ ! -f "$SCENARIO" ]
|
|
1969
|
+
then
|
|
1970
|
+
cat > "$SCENARIO" <<-'EOF'
|
|
1971
|
+
DELIVERY_DATE=$(date -v+7d '+%Y-%m-%d') # ici on demande de crée a date d'aujourd'hui + 7 jours
|
|
1972
|
+
# peu remplacer -v+7d par -v+1d pour une livrasion programmer demain
|
|
1973
|
+
# utiliser que par create_many_sfh_order_and_delivery
|
|
1974
|
+
ENV="testing" # sur quelle enviromement lancer le scripts
|
|
1975
|
+
# ENV="staging"
|
|
1976
|
+
# ENV="recette"
|
|
1977
|
+
|
|
1978
|
+
ACCOUNT_IDENTIFIER="102" # pour la creation de order force utilies owner.accountIdentifier
|
|
1979
|
+
# sur l'appel api/v6/order/external/warehouse/orders
|
|
1980
|
+
# (creation de la commade)
|
|
1981
|
+
HUB="duck" # pour sur l'appel api/v6/order/external/warehouse/orders
|
|
1982
|
+
# parametre pickup.code (type est a "hub")
|
|
1983
|
+
STORE_ID_OWNER="184" # parametre pickup.storeIdOwner
|
|
1984
|
+
# sur l'appel api/v6/order/external/warehouse/orders
|
|
1985
|
+
# PICKUP_STORE_CODE="2" # si non commenté alors départ du magasin
|
|
1986
|
+
PICKUP_WAREHOUSE_CODE="422" # pour un départ d'entrepôt
|
|
1987
|
+
|
|
1988
|
+
BARCODES_COUNT=5 # nombres packages
|
|
1989
|
+
PREF="aaaa" # doit faire 4 caractères utilies pour générer les barecode
|
|
1990
|
+
# des packtages
|
|
1991
|
+
|
|
1992
|
+
CODE_POSTAUX=("59000", "75001") # liste code postale sur lequelle une addresse aléatoire seras choisi
|
|
1993
|
+
# (creation de la commade)
|
|
1994
|
+
DELIVERY_SLOTS=( # liste des horraires de créneau de livraison choisi aléatoirement
|
|
1995
|
+
"06:00+01:00[Europe/Paris]-08:00+01:00[Europe/Paris]"
|
|
1996
|
+
"08:00+01:00[Europe/Paris]-10:00+01:00[Europe/Paris]"
|
|
1997
|
+
"10:00+01:00[Europe/Paris]-12:00+01:00[Europe/Paris]"
|
|
1998
|
+
"16:00+01:00[Europe/Paris]-18:00+01:00[Europe/Paris]"
|
|
1999
|
+
"18:00+01:00[Europe/Paris]-20:00+01:00[Europe/Paris]"
|
|
2000
|
+
)
|
|
2001
|
+
|
|
2002
|
+
# DELIVERY_OPTIONS=("skill1" "skill2") # liste des nom skill - a décommanter
|
|
2003
|
+
|
|
2004
|
+
# normalement pas bessoin modifer
|
|
2005
|
+
ORDER_DATE=$(date '+%Y-%m-%d') # date du jour
|
|
2006
|
+
RAND=$(date +%y%m%d%H%M%S) # valueur peudo aleadoire (ici basé par date) doit faire 17 caractères
|
|
2007
|
+
BARCODE_PART=0000$RAND # utiliser pour générer les bare code les barecode sont :
|
|
2008
|
+
# {BARECODE_PART}{00000} a {BARECODE_PART}{BARECODES_COUNT}
|
|
2009
|
+
PRIMARY_REF=$PREF$RAND # primaryOrderReference de la commande
|
|
2010
|
+
EOF
|
|
2011
|
+
echo "éditer le fichier $SCENARIO"
|
|
2012
|
+
return 1
|
|
2013
|
+
fi
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
#!/usr/bin/env bash
|
|
2017
|
+
|
|
2018
|
+
cleanup_merged_mr() {
|
|
2019
|
+
COLISWEB_IDL_GROUP=3054234
|
|
2020
|
+
|
|
2021
|
+
BEFORE=${1:- $(date -I -v -2y)}
|
|
2022
|
+
|
|
2023
|
+
for (( COUNTER=1; COUNTER<=12; COUNTER+=2 )); do
|
|
2024
|
+
cleanup_grouped_merged_mr $COLISWEB_IDL_GROUP $BEFORE $COUNTER &
|
|
2025
|
+
done
|
|
2026
|
+
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
cleanup_grouped_merged_mr() {
|
|
2030
|
+
GROUP=$1
|
|
2031
|
+
BEFORE=$2
|
|
2032
|
+
PAGE_COUNT=$3
|
|
2033
|
+
MERGED_MRS=($(curl --header "PRIVATE-TOKEN: $GITLAB_PAT" \
|
|
2034
|
+
--url "https://gitlab.com/api/v4/groups/$GROUP/merge_requests?updated_before=${BEFORE}T08:00:00Z&status=merged&per_page=50&page=$PAGE_COUNT" |
|
|
2035
|
+
jq -r '.[] | {iid: .iid|tostring, pid:.project_id|tostring} | (.pid + "/merge_requests/" + .iid)'))
|
|
2036
|
+
|
|
2037
|
+
for MR in ${MERGED_MRS[@]}; do
|
|
2038
|
+
echo "https://gitlab.com/api/v4/projects/$MR"
|
|
2039
|
+
curl --request DELETE \
|
|
2040
|
+
--header "PRIVATE-TOKEN: $GITLAB_PAT" \
|
|
2041
|
+
--url "https://gitlab.com/api/v4/projects/$MR"
|
|
2042
|
+
done
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
# you will need jq to use these commands. You can install it using "brew install jq"
|
|
2046
|
+
# cleanup_all_ecr_images 12
|
|
2047
|
+
# will delete images in all repositories older than 12 weeks
|
|
2048
|
+
# cleanup_single_ecr_repository colisweb-api 8
|
|
2049
|
+
# will delete images older than 8 weeks in the colisweb-api repository
|
|
2050
|
+
cleanup_all_ecr_images() {
|
|
2051
|
+
WEEKS=$1
|
|
2052
|
+
|
|
2053
|
+
# OR to work on bash and zsh
|
|
2054
|
+
CLEAN_BEFORE=$(date -v-${WEEKS}w +%F || date --date="-${WEEKS} weeks" +'%Y-%m-%d')
|
|
2055
|
+
REPOSITORIES=$(aws ecr describe-repositories --output json | jq -r '.[] |.[].repositoryName')
|
|
2056
|
+
|
|
2057
|
+
while read -r REPOSITORY; do
|
|
2058
|
+
echo "processing ECR repository $REPOSITORY before $CLEAN_BEFORE"
|
|
2059
|
+
cleanup_single_ecr_repository "$CLEAN_BEFORE" "$REPOSITORY"
|
|
2060
|
+
done <<< "$REPOSITORIES"
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
cleanup_single_ecr_repository() {
|
|
2064
|
+
BEFORE=$1
|
|
2065
|
+
REPOSITORY=$2
|
|
2066
|
+
|
|
2067
|
+
echo "gettings tags for repository $REPOSITORY before $BEFORE"
|
|
2068
|
+
|
|
2069
|
+
ALL_TAGS=$(aws ecr describe-images --repository-name "$REPOSITORY" --output json |
|
|
2070
|
+
jq '.imageDetails' |
|
|
2071
|
+
jq '. |= sort_by(.imagePushedAt)' |
|
|
2072
|
+
jq --arg date $BEFORE '.[] | select(.imagePushedAt[0:10] < $date)' |
|
|
2073
|
+
jq 'select((.imageTags != null) or (.imageTags == []))' |
|
|
2074
|
+
jq 'select(.imageTags | any(endswith("latest")) | not)' |
|
|
2075
|
+
jq -r '.imageTags | join(" ")' |
|
|
2076
|
+
sort -u)
|
|
2077
|
+
|
|
2078
|
+
if [ -z "${ALL_TAGS}" ]; then
|
|
2079
|
+
echo "no tag to delete for repository $REPOSITORY"
|
|
2080
|
+
else
|
|
2081
|
+
echo "deleting $(echo $ALL_TAGS | wc -l) tags for $REPOSITORY"
|
|
2082
|
+
|
|
2083
|
+
while read image_tags; do
|
|
2084
|
+
SINGLE_TAG=$(echo $image_tags | grep -o '^\S*')
|
|
2085
|
+
|
|
2086
|
+
DIGESTS_TO_DELETE=$(docker buildx imagetools inspect \
|
|
2087
|
+
949316342391.dkr.ecr.eu-west-1.amazonaws.com/$REPOSITORY:$SINGLE_TAG --raw |
|
|
2088
|
+
jq -r '[.manifests | .[].digest] | join(" imageDigest=") | "imageDigest=" + .' ||
|
|
2089
|
+
echo "")
|
|
2090
|
+
|
|
2091
|
+
TAGS_TO_DELETE=$(echo "$image_tags" | sed 's/[^ ]* */imageTag=&/g')
|
|
2092
|
+
|
|
2093
|
+
export AWS_PAGER=""
|
|
2094
|
+
|
|
2095
|
+
aws ecr batch-delete-image --repository-name "$REPOSITORY" --image-ids $(echo $TAGS_TO_DELETE) > /dev/null 2>&1
|
|
2096
|
+
test -z $DIGESTS_TO_DELETE ||
|
|
2097
|
+
aws ecr batch-delete-image --repository-name "$REPOSITORY" --image-ids $(echo $DIGESTS_TO_DELETE)> /dev/null 2>&1
|
|
2098
|
+
done <<< $ALL_TAGS
|
|
2099
|
+
|
|
2100
|
+
echo "deleted $(echo $ALL_TAGS | wc -l) tags"
|
|
2101
|
+
fi
|
|
2102
|
+
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
|
|
2106
|
+
cleanup_ci_cache() {
|
|
2107
|
+
DATE=${1:-$(date -v-1m +%F)}
|
|
2108
|
+
CACHE_BUCKET=${2:-"s3://gitlab-colisweb-distributed-cache/project/"}
|
|
2109
|
+
|
|
2110
|
+
echo "deleting from cache $CACHE_BUCKET all older than $DATE"
|
|
2111
|
+
|
|
2112
|
+
aws_ecr_login
|
|
2113
|
+
|
|
2114
|
+
while read -r line; do
|
|
2115
|
+
datum=$(echo $line | cut -c1-10)
|
|
2116
|
+
if [[ "$datum" < "$DATE" ]] ; then
|
|
2117
|
+
# Shell Parameter Expansion: ${parameter##word}
|
|
2118
|
+
# Allow to return the result from "word" to the end of "parameters"
|
|
2119
|
+
# Here we need the end of the string after "project/" (corresponding to the S3 gitlab project id and filename)
|
|
2120
|
+
TO_DELETE="$CACHE_BUCKET${line##* project/}"
|
|
2121
|
+
echo $TO_DELETE
|
|
2122
|
+
aws s3 rm $TO_DELETE
|
|
2123
|
+
fi
|
|
2124
|
+
done < <(aws s3 ls $CACHE_BUCKET --recursive)
|
|
2125
|
+
}
|
|
2126
|
+
|
|
2127
|
+
cleanup_batch_definitions() {
|
|
2128
|
+
DEFINITION_NAME=$1
|
|
2129
|
+
ARNs=($(
|
|
2130
|
+
aws batch describe-job-definitions \
|
|
2131
|
+
--status ACTIVE \
|
|
2132
|
+
--job-definition-name "$DEFINITION_NAME" |
|
|
2133
|
+
jq '.jobDefinitions | sort_by(-.revision)' |
|
|
2134
|
+
jq 'del( .[0])' |
|
|
2135
|
+
jq -r '.[] | .jobDefinitionArn'
|
|
2136
|
+
)
|
|
2137
|
+
)
|
|
2138
|
+
for A in ${ARNs[@]}; do
|
|
2139
|
+
echo "deregister $A"
|
|
2140
|
+
aws batch deregister-job-definition --job-definition $A
|
|
2141
|
+
done
|
|
2142
|
+
echo "cleaned up all definitions except latest"
|
|
2143
|
+
}
|
|
2144
|
+
#!/usr/bin/env bash
|
|
2145
|
+
|
|
1554
2146
|
ftp_ikea_k8s() {
|
|
1555
2147
|
SSH_LOCAL_PORT=2230
|
|
1556
2148
|
FTP_LOCAL_PORT=25500
|
|
@@ -1928,6 +2520,7 @@ datadog_schedule_downtime_single() {
|
|
|
1928
2520
|
docker_build_push() {
|
|
1929
2521
|
read -r -a BUILD_ARGS <<< "$1"
|
|
1930
2522
|
DOCKER_BUILD_ARGS="--build-arg VCS_REF=$(git rev-parse --short HEAD)"
|
|
2523
|
+
|
|
1931
2524
|
for ARG_NAME in "${BUILD_ARGS[@]}"
|
|
1932
2525
|
do
|
|
1933
2526
|
DOCKER_BUILD_ARGS="$DOCKER_BUILD_ARGS --build-arg $ARG_NAME=${!ARG_NAME}"
|
|
@@ -1936,13 +2529,17 @@ docker_build_push() {
|
|
|
1936
2529
|
if ! image_exists $DOCKER_REGISTRY_ID $APPLICATION $CI_COMMIT_SHORT_SHA ; then
|
|
1937
2530
|
docker pull $DOCKER_IMAGE || true
|
|
1938
2531
|
SOURCE_URL=${CI_PROJECT_URL:8} # without "https://" protocol, like gitlab.com/colisweb-idl/colisweb/back/packing
|
|
1939
|
-
|
|
2532
|
+
|
|
2533
|
+
docker buildx create --use
|
|
2534
|
+
|
|
2535
|
+
docker buildx build $DOCKER_BUILD_ARGS \
|
|
1940
2536
|
-t $DOCKER_IMAGE_SHA \
|
|
2537
|
+
--platform "linux/arm64,linux/amd64" \
|
|
1941
2538
|
--label org.opencontainers.image.revision=$(git rev-parse HEAD) \
|
|
1942
2539
|
--label org.opencontainers.image.source=$SOURCE_URL \
|
|
1943
|
-
--
|
|
2540
|
+
--provenance=false \
|
|
2541
|
+
--push \
|
|
1944
2542
|
$DOCKER_STAGE_PATH
|
|
1945
|
-
docker push $DOCKER_IMAGE_SHA
|
|
1946
2543
|
fi
|
|
1947
2544
|
}
|
|
1948
2545
|
|
|
@@ -1999,15 +2596,15 @@ extract_yaml_config_variable() {
|
|
|
1999
2596
|
|
|
2000
2597
|
if [ ! -f ${CONFIGS_PATH}/common.yaml ]; then
|
|
2001
2598
|
echo >&2 "Missing $CONFIGS_PATH/common.yaml configuration file"
|
|
2002
|
-
|
|
2599
|
+
return 1
|
|
2003
2600
|
fi
|
|
2004
2601
|
if [ ! -f ${CONFIGS_PATH}/${ENVIRONMENT}.yaml ]; then
|
|
2005
2602
|
echo >&2 "Missing $CONFIGS_PATH/$ENVIRONMENT.yaml configuration file"
|
|
2006
|
-
|
|
2603
|
+
return 1
|
|
2007
2604
|
fi
|
|
2008
2605
|
if [ ! -f ${CONFIGS_PATH}/${ENVIRONMENT}-secrets.yaml ]; then
|
|
2009
2606
|
echo >&2 "Missing $CONFIGS_PATH/$ENVIRONMENT-secrets.yaml configuration file"
|
|
2010
|
-
|
|
2607
|
+
return 1
|
|
2011
2608
|
fi
|
|
2012
2609
|
|
|
2013
2610
|
result=$(yq -r ${VARIABLE} "$CONFIGS_PATH/$ENVIRONMENT-secrets.yaml")
|
|
@@ -2018,10 +2615,10 @@ extract_yaml_config_variable() {
|
|
|
2018
2615
|
if [ $? -ne 0 ] || [ "$result" = "null" ]; then
|
|
2019
2616
|
if [ $OPTIONAL = true ]; then
|
|
2020
2617
|
echo ""
|
|
2021
|
-
|
|
2618
|
+
return 0
|
|
2022
2619
|
else
|
|
2023
2620
|
echo >&2 "Missing path $VARIABLE in $CONFIGS_PATH/$ENVIRONMENT-secrets.yaml, $CONFIGS_PATH/$ENVIRONMENT.yaml or $CONFIGS_PATH/common.yaml"
|
|
2024
|
-
|
|
2621
|
+
return 1
|
|
2025
2622
|
fi
|
|
2026
2623
|
fi
|
|
2027
2624
|
fi
|
|
@@ -2243,11 +2840,11 @@ git_reveal() {
|
|
|
2243
2840
|
}
|
|
2244
2841
|
#!/usr/bin/env bash
|
|
2245
2842
|
|
|
2246
|
-
|
|
2843
|
+
helm_deploy() {
|
|
2247
2844
|
APPLICATION=$1
|
|
2248
2845
|
ENVIRONMENT=$2
|
|
2249
2846
|
VERSION=$3
|
|
2250
|
-
|
|
2847
|
+
deploy_chart \
|
|
2251
2848
|
--path_configs deploy \
|
|
2252
2849
|
--path_chart deploy/$APPLICATION \
|
|
2253
2850
|
--application $APPLICATION \
|
|
@@ -2256,7 +2853,7 @@ helm_deploy_v3() {
|
|
|
2256
2853
|
--helm_extra_args --set global.version=$VERSION
|
|
2257
2854
|
}
|
|
2258
2855
|
|
|
2259
|
-
|
|
2856
|
+
deploy_chart() {
|
|
2260
2857
|
set -e
|
|
2261
2858
|
set -x
|
|
2262
2859
|
|
|
@@ -2294,7 +2891,7 @@ deploy_chart_v3() {
|
|
|
2294
2891
|
if [ ! -d ${root_path}/${path_chart} ] || [ ! -f ${root_path}/${path_chart}/Chart.yaml ]; then
|
|
2295
2892
|
echo "Bad Chart $root_path/$path_chart : does not exists or missing Chart.yaml"
|
|
2296
2893
|
print_usage
|
|
2297
|
-
|
|
2894
|
+
return 1
|
|
2298
2895
|
fi
|
|
2299
2896
|
|
|
2300
2897
|
# Unset Kubectl configuration made via the KUBECONFIG env variable
|
|
@@ -2305,13 +2902,13 @@ deploy_chart_v3() {
|
|
|
2305
2902
|
# Configure Kubectl
|
|
2306
2903
|
configure_kubectl_for ${environment}
|
|
2307
2904
|
|
|
2308
|
-
# Configure
|
|
2309
|
-
|
|
2310
|
-
#
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2905
|
+
# Configure helm
|
|
2906
|
+
helm version --namespace ${namespace} || true
|
|
2907
|
+
# helm stable repo have changed and must be updated manually, in versions < v2.17.0
|
|
2908
|
+
helm repo add colisweb s3://colisweb-helm-charts/colisweb
|
|
2909
|
+
helm repo add stable https://charts.helm.sh/stable
|
|
2910
|
+
helm repo update
|
|
2911
|
+
helm dependency update ${root_path}/${path_chart}
|
|
2315
2912
|
|
|
2316
2913
|
# Gather values/*.yaml files
|
|
2317
2914
|
values_path="${root_path}/${path_chart}/values"
|
|
@@ -2319,7 +2916,7 @@ deploy_chart_v3() {
|
|
|
2319
2916
|
[ -d $values_path ] && values_files=$(find $values_path -type f -maxdepth 1 -name "*.yaml" | sed 's/^/ -f /' | tr -d \\n | sed 's/%//')
|
|
2320
2917
|
|
|
2321
2918
|
# Deploy
|
|
2322
|
-
|
|
2919
|
+
helm upgrade --install \
|
|
2323
2920
|
--namespace ${namespace} \
|
|
2324
2921
|
${values_files} \
|
|
2325
2922
|
-f ${root_path}/${path_configs}/common.yaml \
|
|
@@ -2341,7 +2938,7 @@ deploy_chart_v3() {
|
|
|
2341
2938
|
set +x
|
|
2342
2939
|
}
|
|
2343
2940
|
|
|
2344
|
-
|
|
2941
|
+
verify_deployments() {
|
|
2345
2942
|
set -e
|
|
2346
2943
|
|
|
2347
2944
|
# usage :
|
|
@@ -2361,7 +2958,7 @@ verify_deployments_v3() {
|
|
|
2361
2958
|
|
|
2362
2959
|
# Get all Deployments names from the deployed chart
|
|
2363
2960
|
DEPLOYMENTS=(
|
|
2364
|
-
$(
|
|
2961
|
+
$(helm get manifest --namespace $NAMESPACE $RELEASE | yq --no-doc -r 'select(.kind=="Deployment").metadata.name')
|
|
2365
2962
|
)
|
|
2366
2963
|
|
|
2367
2964
|
echo "verifying on $NAMESPACE deployments ${DEPLOYMENTS[@]} with a timeout of $TIMEOUT"
|
|
@@ -2377,7 +2974,7 @@ verify_deployments_v3() {
|
|
|
2377
2974
|
|
|
2378
2975
|
if [ $? -ne 0 ]; then
|
|
2379
2976
|
echo "at least one deployment failed or timed out (after $TIMEOUT)"
|
|
2380
|
-
|
|
2977
|
+
return 1
|
|
2381
2978
|
fi
|
|
2382
2979
|
done
|
|
2383
2980
|
|
|
@@ -2400,7 +2997,7 @@ check_config_file() {
|
|
|
2400
2997
|
if [ ! -f ${filename} ]; then
|
|
2401
2998
|
echo "Missing $filename configuration file"
|
|
2402
2999
|
print_usage
|
|
2403
|
-
|
|
3000
|
+
return 1
|
|
2404
3001
|
fi
|
|
2405
3002
|
}
|
|
2406
3003
|
|
|
@@ -2625,7 +3222,7 @@ emit_datadog_deploy_event() {
|
|
|
2625
3222
|
echo "event successfully created check in datadog UI : $url"
|
|
2626
3223
|
else
|
|
2627
3224
|
echo " failed to create event "
|
|
2628
|
-
|
|
3225
|
+
return 1
|
|
2629
3226
|
fi
|
|
2630
3227
|
}
|
|
2631
3228
|
|