-
Notifications
You must be signed in to change notification settings - Fork 0
/
.gitlab-ci.yml
233 lines (182 loc) · 8.38 KB
/
.gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# Project: Arancino Daemon
# Author: Sergio Tomasello <[email protected]>
# Created: 2018.10.11
# Last Change: 2020.06.05
# Notes: La pipeline esegue la creazione del pacchetto di Arancino Daemon e lo carica su repository
# La pipeline viene eseguita solo su tag, per evitare il proliferare di pacchetti generati
# per ogni push.
# External Vars: Lista delle variabili definite estarnamente ed usate nella pipeline:
# REPO_USR: nome utente del associato a dev ops per effettuare upload dell'artefatto
# REPO_PWD: password associata all'utente dev ops
# REPO_BASE_URL: url di base del repository: https://packages.smartme.io
# DOCKER_HOST: indica il Docker deamon al quale connettersi per effettuare la build
# DOCKER_DRIVER: definiamo il driver di storage per Docker
# DOCKER_TLS_CERTDIR: in questo modo autentichiamo la connessione con il demone docker utilizzando i certificati TLS
# DCK_IMAGE_NAME: contiene il nome dell'immagine
image: smartmeio/python:3.9-alpine3.10
stages:
- start
- package
- docker
- upload
- cleanup
default:
services:
- name: docker:23-dind
alias: thedockerhost
variables:
#Docker deamon è attivo sull'host chiamato "thedockerhost che ascolta sulla porta 2375, la porta di default del Docker daemon"
DOCKER_HOST: tcp://thedockerhost:2375/
#Il driver overlay2 è comunemente usato per gestire i livelli di immagini e lo storage su un sistema Docker.
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
DCK_IMAGE_NAME: smartmeio/arancino-daemon
#################################
####### START #######
#################################
start:
stage: start
script:
- pip3 -v install semantic-version wheel # Installo le dipendenze semantic-version e wheel
- python3 check-version.py $CI_COMMIT_TAG # Genera un file chiamato release.tmp che contiene o "RELEASE" o "SNAPSHOT"
# in base a come é formato il tag: se il tag:
# pre-release: test -> SNAPSHOT
# pre-release: alpha, beta, rc -> RELEASE
# release -> RELEASE
#
# es: "1.0.0-test.3" -> SNAPSHOT
# "1.0.0-alpha.1" -> RELEASE
# "1.0.0-beta.2" -> RELEASE
# "1.0.0-rc.1" -> RELEASE
# "1.0.0" -> RELEASE
- mkdir -p tmp # Creo una directory temporanea
- echo `date +%Y-%m-%d` > tmp/date.txt # Creo un file di comodo contente la data attuale (di esecuzione della pipeline)
- echo `date +%H-%M-%S` > tmp/time.txt # Creo un file di comodo contente l'ora attuale (di esecuzione della pipeline)
- mv release.tmp tmp/release.txt # Sposto il file generato su tmp
- mv repo_name.tmp tmp/repo_name.txt # Sposto il file generato su tmp, contiene il nome del repository di destinazione
# SNAPSHOT -> pypi-snapshot
# RELEASE -> pypi
artifacts:
paths:
- tmp/
expire_in: 1d
only:
- tags
######## PUSH
push:
stage: start
only: ['tags']
except: ['master', 'branches']
allow_failure: true
variables:
GIT_STRATEGY: clone
before_script:
- pip3 -v install semantic-version wheel # Installo le dipendenze semantic-version e wheel
- eval `python3 check-version.py ${CI_COMMIT_TAG}`
script:
- apk add git
- git remote add github https://$GITHUB_BOT_USERNAME:[email protected]/$GITHUB_DEST_REPO
- git remote show github
- git remote show origin
- git branch -a
- git checkout $CI_COMMIT_TAG
- git fetch github
- git push github $CI_COMMIT_REF_NAME --force
- >
if [[ ${PRE_RELEASE} == "test" ]]; then
echo "not performing TAG push";
else
git push github ${CI_COMMIT_TAG}
fi
- git push --all --force github
#################################
####### PACKAGE #######
#################################
package:
stage: package
script:
- pip3 -v install semantic-version wheel # Installo le dipendenze semantic-version e wheel
# grazie al file repo_name.tmp e release.tmp conosco il tipo
# di destinazione: RELEASE o SNAPSHOT
- sed -i "s;^[# ]*\(version * = *\)\(.*\);\1${CI_COMMIT_TAG};" setup.cfg
- sed -i "s;^[# ]*\(__version__ * = *\)\(.*\);\1'${CI_COMMIT_TAG}';" arancino/version.py
- python3 setup.py release # non si devono fare trucchi, imposto la versione nel setup.py e
# nei file di cfg a partire dal tag inserito, che DEVE
# RISPETTARE IL VERSIONAMENTO SEMANTICO 2.0 con nomi di
# pre-release specificati ne file check_version.py
- ls dist/ > tmp/pgk_name.txt # ottengo il nome del file generato e salvo il nome del
# pacchetto su file temp
- mv dist/*.tar.gz tmp/ # sposto il file su di dir temp.
dependencies:
- start
artifacts:
paths:
- tmp/
expire_in: 1d
only:
- tags
#################################
######## DOCKER BUILD ###########
#################################
docker_alpine_build:
stage: docker
image: docker:23
before_script:
- echo -n "$DCK_TOKEN" | docker login --username "$DCK_USER" --password-stdin
# - pip3 -v install semantic-version wheel # Installo le dipendenze semantic-version e wheel
# - eval `python3 check-version.py ${CI_COMMIT_TAG}`
script:
- DCK_TAG=${CI_COMMIT_TAG}-alpine
- docker buildx create --use
- docker buildx build --no-cache --platform linux/amd64,linux/arm64 -f docker/alpine/Dockerfile -t $DCK_IMAGE_NAME:$DCK_TAG --push .
- >
if [[ $CI_COMMIT_TAG == *"test"* || $CI_COMMIT_TAG == *"rc"* || $CI_COMMIT_TAG == *"beta"* || $CI_COMMIT_TAG == *"alpha"* ]]; then
echo "not performing TAG latest";
else
DCK_TAG=latest
docker buildx build --no-cache --platform linux/amd64,linux/arm64 -f docker/alpine/Dockerfile -t $DCK_IMAGE_NAME:$DCK_TAG --push .
DCK_TAG=${CI_COMMIT_TAG}
docker buildx build --no-cache --platform linux/amd64,linux/arm64 -f docker/alpine/Dockerfile -t $DCK_IMAGE_NAME:$DCK_TAG --push .
fi
only:
- tags
docker_debian_build:
stage: docker
image: docker:23
before_script:
- echo -n "$DCK_TOKEN" | docker login --username "$DCK_USER" --password-stdin
script:
- DCK_TAG=${CI_COMMIT_TAG}-debian
- docker buildx create --use
- docker buildx build --no-cache --platform linux/amd64,linux/arm64 -f docker/debian/Dockerfile -t $DCK_IMAGE_NAME:$DCK_TAG --push .
only:
- tags
#################################
####### UPLOAD #######
#################################
upload:
stage: upload
variables:
GIT_STRATEGY: none
script:
- PKG_NAME="$(cat tmp/pgk_name.txt)" # Recupero il nome del pacchetto
- REPO_NAME="$(cat tmp/repo_name.txt)" # Recupero il nome del repository su cui fare upload
# Eseguo upload sul repository specificato (Nexus 3)
- twine upload --verbose --repository-url ${REPO_BASE_URL}/repository/${REPO_NAME}/ -u $REPO_USR -p $REPO_PWD tmp/$PKG_NAME
dependencies:
- package
only:
- tags
#################################
####### CLEANUP #######
#################################
####### Cleanup Job #######
cleanup:
stage: cleanup
variables:
# GIT_STRATEGY: none
script:
- echo "Cleaning up"
- rm -rf tmp/
only:
- tags