.gitlab-ci.yml 15 KB

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