total rebase
[anni] / .gitlab-ci.yml
1 image: git.pleroma.social:5050/pleroma/pleroma/ci-base
2
3 variables: &global_variables
4   # Only used for the release
5   ELIXIR_VER: 1.12.3
6   POSTGRES_DB: pleroma_test
7   POSTGRES_USER: postgres
8   POSTGRES_PASSWORD: postgres
9   DB_HOST: postgres
10   DB_PORT: "5432"
11   MIX_ENV: test
12
13 workflow:
14   rules:
15     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
16     - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
17       when: never
18     - if: $CI_COMMIT_BRANCH
19
20 cache: &global_cache_policy
21   key:
22     files:
23       - mix.lock
24   paths:
25     - deps
26     - _build
27
28 stages:
29   - build
30   - lint
31   - test
32   - check-changelog
33   - benchmark
34   - deploy
35   - release
36   - docker
37   - docker-combine
38
39 before_script:
40   - echo $MIX_ENV
41   - rm -rf _build/*/lib/pleroma
42   - mix deps.get
43
44 after_script:
45   - rm -rf _build/*/lib/pleroma
46
47 check-changelog:
48   stage: check-changelog
49   image: alpine
50   rules:
51     - if: $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH == 'pleroma/pleroma' && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == 'weblate-extract'
52       when: never
53     - if: $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH == 'pleroma/pleroma' && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == 'weblate'
54       when: never
55     - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"
56   before_script: ''
57   after_script: ''
58   cache: {}
59   script:
60     - apk add git
61     - sh ./tools/check-changelog
62
63 .build_changes_policy:
64   rules:
65     - changes:
66         - ".gitlab-ci.yml"
67         - "**/*.ex"
68         - "**/*.exs"
69         - "mix.lock"
70
71 .using-ci-base:
72   tags:
73     - amd64
74
75 build-1.12.3:
76   extends:
77   - .build_changes_policy
78   - .using-ci-base
79   stage: build
80   script:
81   - mix compile --force
82
83 build-1.15.7-otp-25:
84   extends:
85   - .build_changes_policy
86   - .using-ci-base
87   stage: build
88   image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.15
89   allow_failure: true
90   script:
91   - mix compile --force
92
93 spec-build:
94   extends:
95   - .using-ci-base
96   stage: build
97   rules:
98     - changes:
99         - ".gitlab-ci.yml"
100         - "lib/pleroma/web/api_spec/**/*.ex"
101         - "lib/pleroma/web/api_spec.ex"
102   artifacts:
103     paths:
104     - spec.json
105   script:
106   - mix pleroma.openapi_spec spec.json
107
108 benchmark:
109   extends:
110   - .using-ci-base
111   stage: benchmark
112   when: manual
113   variables:
114     MIX_ENV: benchmark
115   services:
116   - name: postgres:11.22-alpine
117     alias: postgres
118     command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
119   script:
120     - mix ecto.create
121     - mix ecto.migrate
122     - mix pleroma.load_testing
123
124 unit-testing-1.12.3:
125   extends:
126   - .build_changes_policy
127   - .using-ci-base
128   stage: test
129   cache: &testing_cache_policy
130     <<: *global_cache_policy
131     policy: pull
132   services: &testing_services
133   - name: postgres:13-alpine
134     alias: postgres
135     command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
136   script: &testing_script
137     - mix ecto.create
138     - mix ecto.migrate
139     - mix test --cover --preload-modules
140   coverage: '/^Line total: ([^ ]*%)$/'
141   artifacts:
142     reports:
143       coverage_report:
144         coverage_format: cobertura
145         path: coverage.xml
146
147 unit-testing-1.15.7-otp-25:
148   extends:
149   - .build_changes_policy
150   - .using-ci-base
151   stage: test
152   image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.15-otp25
153   allow_failure: true
154   cache: *testing_cache_policy
155   services: *testing_services
156   script: *testing_script
157
158 unit-testing-1.12-erratic:
159   extends:
160   - .build_changes_policy
161   - .using-ci-base
162   stage: test
163   retry: 2
164   allow_failure: true
165   cache: *testing_cache_policy
166   services: *testing_services
167   script:
168     - mix ecto.create
169     - mix ecto.migrate
170     - mix test --only=erratic
171
172 formatting-1.13:
173   extends: .build_changes_policy
174   image: &formatting_elixir elixir:1.13-alpine
175   stage: lint
176   cache: *testing_cache_policy
177   before_script: &current_bfr_script
178     - apk update
179     - apk add build-base cmake file-dev git openssl
180     - mix local.hex --force
181     - mix local.rebar --force
182     - mix deps.get
183   script:
184     - mix format --check-formatted
185
186 cycles-1.13:
187   extends: .build_changes_policy
188   image: *formatting_elixir
189   stage: lint
190   cache: {}
191   before_script: *current_bfr_script
192   script:
193     - mix compile
194     - mix xref graph --format cycles --label compile | awk '{print $0} END{exit ($0 != "No cycles found")}'
195
196 analysis:
197   extends:
198   - .build_changes_policy
199   - .using-ci-base
200   stage: lint
201   cache: *testing_cache_policy
202   script:
203     - mix credo --strict --only=warnings,todo,fixme,consistency,readability
204
205 dialyzer:
206   extends:
207   - .build_changes_policy
208   - .using-ci-base
209   stage: lint
210   allow_failure: true
211   when: manual 
212   cache: *testing_cache_policy
213   tags:
214     - feld
215   script:
216     - mix dialyzer
217
218 docs-deploy:
219   stage: deploy
220   cache: *testing_cache_policy
221   image: alpine:latest
222   only:
223   - stable@pleroma/pleroma
224   - develop@pleroma/pleroma
225   before_script:
226   - apk add curl
227   script:
228   - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
229 review_app:
230   image: alpine:3.9
231   stage: deploy
232   before_script:
233     - apk update && apk add openssh-client git
234   when: manual
235   environment:
236     name: review/$CI_COMMIT_REF_NAME
237     url: https://$CI_ENVIRONMENT_SLUG.pleroma.online/
238     on_stop: stop_review_app
239   only:
240     - branches
241   except:
242     - master
243     - develop
244   script:
245     - echo "$CI_ENVIRONMENT_SLUG"
246     - mkdir -p ~/.ssh
247     - eval $(ssh-agent -s)
248     - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
249     - ssh-keyscan -H "pleroma.online" >> ~/.ssh/known_hosts
250     - (ssh -t dokku@pleroma.online -- apps:create "$CI_ENVIRONMENT_SLUG") || true
251     - (ssh -t dokku@pleroma.online -- git:set "$CI_ENVIRONMENT_SLUG" keep-git-dir true) || true
252     - ssh -t dokku@pleroma.online -- config:set "$CI_ENVIRONMENT_SLUG" APP_NAME="$CI_ENVIRONMENT_SLUG" APP_HOST="$CI_ENVIRONMENT_SLUG.pleroma.online" MIX_ENV=dokku
253     - (ssh -t dokku@pleroma.online -- postgres:create $(echo $CI_ENVIRONMENT_SLUG | sed -e 's/-/_/g')_db) || true
254     - (ssh -t dokku@pleroma.online -- postgres:link $(echo $CI_ENVIRONMENT_SLUG | sed -e 's/-/_/g')_db "$CI_ENVIRONMENT_SLUG") || true
255     - (ssh -t dokku@pleroma.online -- certs:add "$CI_ENVIRONMENT_SLUG" /home/dokku/server.crt /home/dokku/server.key) || true
256     - git push -f dokku@pleroma.online:$CI_ENVIRONMENT_SLUG $CI_COMMIT_SHA:refs/heads/master
257
258 spec-deploy:
259   stage: deploy
260   artifacts:
261     paths:
262     - spec.json
263   only:
264     - develop@pleroma/pleroma
265   image: alpine:latest
266   before_script:
267     - apk add curl
268   script:
269     - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
270
271
272 stop_review_app:
273   image: alpine:3.9
274   stage: deploy
275   before_script:
276     - apk update && apk add openssh-client git
277   when: manual
278   environment:
279     name: review/$CI_COMMIT_REF_NAME
280     action: stop
281   script:
282     - echo "$CI_ENVIRONMENT_SLUG"
283     - mkdir -p ~/.ssh
284     - eval $(ssh-agent -s)
285     - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
286     - ssh-keyscan -H "pleroma.online" >> ~/.ssh/known_hosts
287     - ssh -t dokku@pleroma.online -- --force apps:destroy "$CI_ENVIRONMENT_SLUG"
288     - ssh -t dokku@pleroma.online -- --force postgres:destroy $(echo $CI_ENVIRONMENT_SLUG | sed -e 's/-/_/g')_db
289
290 amd64:
291   stage: release
292   image: elixir:$ELIXIR_VER
293   only: &release-only
294   - stable@pleroma/pleroma
295   - develop@pleroma/pleroma
296   - /^maint/.*$/@pleroma/pleroma
297   - /^release/.*$/@pleroma/pleroma
298   tags:
299     - amd64
300   artifacts: &release-artifacts
301     name: "pleroma-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME"
302     paths:
303       - release/*
304     # Ideally it would be never for master branch and with the next commit for develop,
305     # but Gitlab does not support neither `only` for artifacts
306     # nor setting it to never from .gitlab-ci.yml
307     # nor expiring with the next commit
308     expire_in: 42 yrs
309
310   cache: &release-cache
311     key: $CI_COMMIT_REF_NAME-$CI_JOB_NAME
312     paths:
313           - deps
314   variables: &release-variables
315     MIX_ENV: prod
316     VIX_COMPILATION_MODE: PLATFORM_PROVIDED_LIBVIPS
317   before_script: &before-release
318   - apt-get update && apt-get install -y cmake libmagic-dev libvips-dev erlang-dev
319   - echo "import Config" > config/prod.secret.exs
320   - mix local.hex --force
321   - mix local.rebar --force
322   script: &release
323     - mix deps.get --only prod
324     - mkdir release
325     - export PLEROMA_BUILD_BRANCH=$CI_COMMIT_REF_NAME
326     - mix release --path release
327
328
329 amd64-musl:
330   stage: release
331   artifacts: *release-artifacts
332   only: *release-only
333   image: elixir:$ELIXIR_VER-alpine
334   tags:
335     - amd64
336   cache: *release-cache
337   variables: *release-variables
338   before_script: &before-release-musl
339   - apk add git build-base cmake file-dev openssl vips-dev
340   - echo "import Config" > config/prod.secret.exs
341   - mix local.hex --force
342   - mix local.rebar --force
343   script: *release
344
345 arm:
346   stage: release
347   artifacts: *release-artifacts
348   only: *release-only
349   tags:
350     - arm32-specified
351   image: arm32v7/elixir:$ELIXIR_VER
352   cache: *release-cache
353   variables: *release-variables
354   before_script: *before-release
355   script: *release
356
357 arm-musl:
358   stage: release
359   artifacts: *release-artifacts
360   only: *release-only
361   tags:
362     - arm32-specified
363   image: arm32v7/elixir:$ELIXIR_VER-alpine
364   cache: *release-cache
365   variables: *release-variables
366   before_script: *before-release-musl
367   script: *release
368
369 arm64:
370   stage: release
371   artifacts: *release-artifacts
372   only: *release-only
373   tags:
374     - arm
375   image: arm64v8/elixir:$ELIXIR_VER
376   cache: *release-cache
377   variables: *release-variables
378   before_script: *before-release
379   script: *release
380
381 arm64-musl:
382   stage: release
383   artifacts: *release-artifacts
384   only: *release-only
385   tags:
386     - arm
387   image: arm64v8/elixir:$ELIXIR_VER-alpine
388   cache: *release-cache
389   variables: *release-variables
390   before_script: *before-release-musl
391   script: *release
392
393 .kaniko:
394   stage: docker
395   image:
396     name: gcr.io/kaniko-project/executor:debug
397     entrypoint: [""]
398   cache: {}
399   dependencies: []
400   before_script: &before-kaniko
401     - export CI_JOB_TIMESTAMP=$(date --utc -Iseconds)
402     - export CI_VCS_REF=$CI_COMMIT_SHORT_SHA
403     - export IMAGE_TAG=$CI_REGISTRY_IMAGE/$BUILD_ARCH_IMG_SUFFIX:$CI_COMMIT_SHORT_SHA
404     - export IMAGE_TAG_SLUG=$CI_REGISTRY_IMAGE/$BUILD_ARCH_IMG_SUFFIX:$CI_COMMIT_REF_SLUG
405     - export IMAGE_TAG_LATEST=$CI_REGISTRY_IMAGE/$BUILD_ARCH_IMG_SUFFIX:latest
406     - export IMAGE_TAG_LATEST_STABLE=$CI_REGISTRY_IMAGE/$BUILD_ARCH_IMG_SUFFIX:latest-stable
407     - mkdir -p /kaniko/.docker
408     - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
409
410 .kaniko-latest:
411   extends: .kaniko
412   only:
413     - develop@pleroma/pleroma
414   script:
415     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --custom-platform=$BUILD_ARCH --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP --build-arg ELIXIR_IMG=$ELIXIR_IMG --destination $IMAGE_TAG --destination $IMAGE_TAG_SLUG --destination $IMAGE_TAG_LATEST
416
417 .kaniko-stable:
418   extends: .kaniko
419   only:
420     - stable@pleroma/pleroma
421   script:
422     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --custom-platform=$BUILD_ARCH --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP --build-arg ELIXIR_IMG=$ELIXIR_IMG --destination $IMAGE_TAG --destination $IMAGE_TAG_SLUG --destination $IMAGE_TAG_LATEST_STABLE
423
424 .kaniko-release:
425   extends: .kaniko
426   only:
427     - /^release/.*$/@pleroma/pleroma
428   script:
429     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --custom-platform=$BUILD_ARCH --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP --build-arg ELIXIR_IMG=$ELIXIR_IMG --destination $IMAGE_TAG --destination $IMAGE_TAG_SLUG
430
431 .kaniko-adhoc:
432   extends: .kaniko
433   only:
434     - /^build-docker/.*$/@pleroma/pleroma
435   script:
436     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --custom-platform=$BUILD_ARCH --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP --build-arg ELIXIR_IMG=$ELIXIR_IMG --destination $IMAGE_TAG --destination $IMAGE_TAG_SLUG
437
438 .kaniko:linux/amd64:
439   variables:
440     BUILD_ARCH: linux/amd64
441     BUILD_ARCH_IMG_SUFFIX: linux-amd64
442     ELIXIR_IMG: hexpm/elixir
443   tags:
444     - amd64
445
446 .kaniko:linux/arm64:
447   variables:
448     BUILD_ARCH: linux/arm64/v8
449     BUILD_ARCH_IMG_SUFFIX: linux-arm64-v8
450     ELIXIR_IMG: hexpm/elixir
451   tags:
452     - arm
453
454 .kaniko:linux/arm:
455   variables:
456     BUILD_ARCH: linux/arm/v7
457     BUILD_ARCH_IMG_SUFFIX: linux-arm-v7
458     ELIXIR_IMG: git.pleroma.social:5050/pleroma/ci-image/elixir-linux-arm-v7
459   tags:
460     - arm32-specified
461
462 kaniko-latest:linux/amd64:
463   extends:
464     - .kaniko-latest
465     - .kaniko:linux/amd64
466
467 kaniko-latest:linux/arm64:
468   extends:
469     - .kaniko-latest
470     - .kaniko:linux/arm64
471
472 kaniko-latest:linux/arm:
473   extends:
474     - .kaniko-latest
475     - .kaniko:linux/arm
476
477 kaniko-stable:linux/amd64:
478   extends:
479     - .kaniko-stable
480     - .kaniko:linux/amd64
481
482 kaniko-stable:linux/arm64:
483   extends:
484     - .kaniko-stable
485     - .kaniko:linux/arm64
486
487 kaniko-stable:linux/arm:
488   extends:
489     - .kaniko-stable
490     - .kaniko:linux/arm
491
492 kaniko-release:linux/amd64:
493   extends:
494     - .kaniko-release
495     - .kaniko:linux/amd64
496
497 kaniko-release:linux/arm64:
498   extends:
499     - .kaniko-release
500     - .kaniko:linux/arm64
501
502 kaniko-release:linux/arm:
503   extends:
504     - .kaniko-release
505     - .kaniko:linux/arm
506
507 .docker-combine:
508   stage: docker-combine
509   image: docker:cli
510   cache: {}
511   before_script:
512     - 'BUILD_ARCHES="linux-amd64 linux-arm64-v8 linux-arm-v7"'
513     - export IMAGE_TAG=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
514     - export IMAGE_TAG_SLUG=$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
515     - export IMAGE_TAG_LATEST=$CI_REGISTRY_IMAGE:latest
516     - export IMAGE_TAG_LATEST_STABLE=$CI_REGISTRY_IMAGE:latest-stable
517     - 'IMAGES=; for arch in $BUILD_ARCHES; do IMAGES="$IMAGES $CI_REGISTRY_IMAGE/$arch:$CI_COMMIT_SHORT_SHA"; done'
518     - 'IMAGES_SLUG=; for arch in $BUILD_ARCHES; do IMAGES_SLUG="$IMAGES_SLUG $CI_REGISTRY_IMAGE/$arch:$CI_COMMIT_REF_SLUG"; done'
519     - 'IMAGES_LATEST=; for arch in $BUILD_ARCHES; do IMAGES_LATEST="$IMAGES_LATEST $CI_REGISTRY_IMAGE/$arch:latest"; done'
520     - 'IMAGES_LATEST_STABLE=; for arch in $BUILD_ARCHES; do IMAGES_LATEST_STABLE="$IMAGES_LATEST_STABLE $CI_REGISTRY_IMAGE/$arch:latest"; done'
521     - mkdir -p ~/.docker
522     - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > ~/.docker/config.json
523
524 docker-combine:latest:
525   extends: .docker-combine
526   only:
527     - develop@pleroma/pleroma
528   script:
529     - 'docker manifest create $IMAGE_TAG $IMAGES'
530     - 'docker manifest push $IMAGE_TAG'
531     - 'docker manifest create $IMAGE_TAG_SLUG $IMAGES_SLUG'
532     - 'docker manifest push $IMAGE_TAG_SLUG'
533     - 'docker manifest create $IMAGE_TAG_LATEST $IMAGES_LATEST'
534     - 'docker manifest push $IMAGE_TAG_LATEST'
535
536 docker-combine:stable:
537   extends: .docker-combine
538   only:
539     - stable@pleroma/pleroma
540   script:
541     - 'docker manifest create $IMAGE_TAG $IMAGES'
542     - 'docker manifest push $IMAGE_TAG'
543     - 'docker manifest create $IMAGE_TAG_SLUG $IMAGES_SLUG'
544     - 'docker manifest push $IMAGE_TAG_SLUG'
545     - 'docker manifest create $IMAGE_TAG_LATEST_STABLE $IMAGES_LATEST_STABLE'
546     - 'docker manifest push $IMAGE_TAG_LATEST_STABLE'
547
548 docker-combine:release:
549   extends: .docker-combine
550   only:
551     - /^release/.*$/@pleroma/pleroma
552   script:
553     - 'docker manifest create $IMAGE_TAG $IMAGES'
554     - 'docker manifest push $IMAGE_TAG'
555     - 'docker manifest create $IMAGE_TAG_SLUG $IMAGES_SLUG'
556     - 'docker manifest push $IMAGE_TAG_SLUG'