-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
.gitlab-ci.yml
142 lines (133 loc) · 4.33 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
image: docker:latest
stages:
- Prepare
- Build
- Test
- Push
variables:
DOCKER_DRIVER: overlay2
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH
services:
- name: docker:dind
before_script:
- echo -n $CI_JOB_TOKEN | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
- docker version
- docker info
Checkout:
variables:
GIT_STRATEGY: none
stage: Prepare
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_COMMIT_BRANCH || $CI_COMMIT_TAG
script:
- |
if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]]; then
tag="edge" && echo "tag=edge" > build.env
latest=false && echo "latest=false" >> build.env
else
if [[ ! -z "$CI_COMMIT_BRANCH" ]]; then
tag="$CI_COMMIT_BRANCH" && echo "tag=$CI_COMMIT_BRANCH" > build.env
latest=false && echo "latest=false" >> build.env
elif [[ ! -z "$CI_COMMIT_TAG" ]]; then
tag="$CI_COMMIT_TAG" && echo "tag=$CI_COMMIT_TAG" > build.env
if [[ "$CI_COMMIT_TAG" =~ ^v.+$ ]]; then
latest=true && echo "latest=true" >> build.env
else
latest=false && echo "latest=false" >> build.env
fi
fi
fi
if [[ -z "$tag" ]] || [[ -z "$latest" ]]; then
echo -e "❌ \e[1;31mVariables Error\e[0m"
exit 1
else
echo -e "\n✅ Version : \e[1;32m${tag}\e[0m"
echo -e "✅ Latest : \e[1;5m${latest}\e[0m"
fi
artifacts:
reports:
dotenv: build.env
Build:
stage: Build
needs:
- job: "Checkout"
artifacts: true
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_COMMIT_BRANCH || $CI_COMMIT_TAG
script:
- |
docker pull $CI_REGISTRY_IMAGE:$tag || true
- >
docker build
--pull
--cache-from $CI_REGISTRY_IMAGE:$tag
--label "org.opencontainers.image.title=$CI_PROJECT_TITLE"
--label "org.opencontainers.image.url=$CI_PROJECT_URL"
--label "org.opencontainers.image.source=$CI_PROJECT_URL"
--label "org.opencontainers.image.documentation=$CI_PROJECT_URL"
--label "org.opencontainers.image.created=$CI_JOB_STARTED_AT"
--label "org.opencontainers.image.revision=$CI_COMMIT_SHA"
--label "org.opencontainers.image.version=$CI_COMMIT_TAG"
--label "org.opencontainers.image.description=$CI_PROJECT_DESCRIPTION"
--label "org.opencontainers.image.licenses=MIT"
--label "org.opencontainers.image.vendor=k44sh"
--tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Tests:
variables:
GIT_STRATEGY: none
stage: Test
needs:
- job: "Checkout"
artifacts: true
- job: "Build"
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_COMMIT_BRANCH || $CI_COMMIT_TAG
script:
- apk --update --no-cache add curl
- |
docker run --rm -d --name $CI_PROJECT_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
for i in $(seq 120); do
status=$(docker inspect -f '{{ .State.Health.Status }}' $CI_PROJECT_NAME 2>/dev/null)
if [[ $? -eq 0 ]]; then
if [[ "${status}" == "healthy" ]]; then
echo -e "\n✅ The container is \e[1;32mhealthy\e[0m after \e[1;5m${i}\e[0m seconds\n"
docker stop $CI_PROJECT_NAME >/dev/null
exit 0
elif [[ "${status}" == "unhealthy" ]]; then
echo -e "❌ The container is \e[1;33munhealthy\e[0m"
exit 1
elif [[ "${status}" == "starting" ]]; then
echo "... starting"
else
echo -e "❓ The container is in \e[1;31munknown\e[0m state ($status)"
exit 1
fi
else
echo -e "❌ \e[1;31mDocker error\e[0m"
fi
sleep 1
done
Push:
variables:
GIT_STRATEGY: none
stage: Push
needs:
- job: "Checkout"
artifacts: true
- job: "Tests"
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_TAG =~ /^v.+$/
script:
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$tag
- docker push $CI_REGISTRY_IMAGE:$tag
- |
if [[ "$latest" == "true" ]] ; then
docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
docker push $CI_REGISTRY_IMAGE:latest
fi