_pr_entrypoint.yaml 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. name: PR Entrypoint
  2. concurrency:
  3. group: pr-entrypoint-${{ github.event_name }}-${{ github.ref }}
  4. cancel-in-progress: true
  5. on:
  6. pull_request:
  7. workflow_dispatch:
  8. inputs:
  9. ref:
  10. required: false
  11. env:
  12. IS_CI: "yes"
  13. jobs:
  14. sanity-checks:
  15. runs-on: ${{ fromJSON(github.repository_owner == 'emqx' && '["self-hosted","ephemeral"]' || '["ubuntu-22.04"]') }}
  16. container: "ghcr.io/emqx/emqx-builder/5.1-4:1.14.5-25.3.2-2-ubuntu22.04"
  17. outputs:
  18. ct-matrix: ${{ steps.matrix.outputs.ct-matrix }}
  19. ct-host: ${{ steps.matrix.outputs.ct-host }}
  20. ct-docker: ${{ steps.matrix.outputs.ct-docker }}
  21. version-emqx: ${{ steps.matrix.outputs.version-emqx }}
  22. version-emqx-enterprise: ${{ steps.matrix.outputs.version-emqx-enterprise }}
  23. runner_labels: ${{ github.repository_owner == 'emqx' && '["self-hosted", "ephemeral"]' || '["ubuntu-22.04"]' }}
  24. builder: "ghcr.io/emqx/emqx-builder/5.1-4:1.14.5-25.3.2-2-ubuntu22.04"
  25. builder_vsn: "5.1-4"
  26. otp_vsn: "25.3.2-2"
  27. elixir_vsn: "1.14.5"
  28. steps:
  29. - uses: actions/checkout@v3
  30. with:
  31. ref: ${{ github.event.inputs.ref }}
  32. fetch-depth: 0
  33. - name: Work around https://github.com/actions/checkout/issues/766
  34. run: |
  35. git config --global --add safe.directory "$GITHUB_WORKSPACE"
  36. - name: Run gitlint
  37. env:
  38. BEFORE_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
  39. AFTER_REF: ${{ github.sha }}
  40. run: |
  41. pip install gitlint
  42. gitlint --commits $BEFORE_REF..$AFTER_REF --config .github/workflows/.gitlint
  43. - name: Run shellcheck
  44. run: |
  45. DEBIAN_FRONTEND=noninteractive apt-get update -qy && apt-get install -qy shellcheck
  46. ./scripts/shellcheck.sh
  47. - name: Run shell tests
  48. run: |
  49. DEBIAN_FRONTEND=noninteractive apt-get update -qy && apt-get install -qy shelltestrunner
  50. scripts/shelltest/run_tests.sh
  51. - name: Check workflow files
  52. env:
  53. ACTIONLINT_VSN: 1.6.25
  54. run: |
  55. wget https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VSN}/actionlint_${ACTIONLINT_VSN}_linux_amd64.tar.gz
  56. tar zxf actionlint_${ACTIONLINT_VSN}_linux_amd64.tar.gz actionlint
  57. # TODO: enable shellcheck when all the current issues are fixed
  58. ./actionlint -color \
  59. -shellcheck= \
  60. -ignore 'label ".+" is unknown' \
  61. -ignore 'value "emqx-enterprise" in "exclude"' \
  62. -ignore 'value "emqx-enterprise-elixir" in "exclude"'
  63. - name: Check line-break at EOF
  64. run: |
  65. ./scripts/check-nl-at-eof.sh
  66. - name: Check apps version
  67. run: |
  68. ./scripts/apps-version-check.sh
  69. - name: Setup mix
  70. env:
  71. MIX_ENV: emqx-enterprise
  72. PROFILE: emqx-enterprise
  73. run: |
  74. mix local.hex --force --if-missing && mix local.rebar --force --if-missing
  75. - name: Check formatting
  76. env:
  77. MIX_ENV: emqx-enterprise
  78. PROFILE: emqx-enterprise
  79. run: |
  80. ./scripts/check-format.sh
  81. - name: Run elvis check
  82. run: |
  83. ./scripts/elvis-check.sh $GITHUB_BASE_REF
  84. - name: Generate CT Matrix
  85. id: matrix
  86. run: |
  87. APPS="$(./scripts/find-apps.sh --ci)"
  88. MATRIX="$(echo "${APPS}" | jq -c '
  89. [
  90. (.[] | select(.profile == "emqx") | . + {
  91. builder: "5.1-4",
  92. otp: "25.3.2-2",
  93. elixir: "1.14.5"
  94. }),
  95. (.[] | select(.profile == "emqx-enterprise") | . + {
  96. builder: "5.1-4",
  97. otp: ["25.3.2-2"][],
  98. elixir: "1.14.5"
  99. })
  100. ]
  101. ')"
  102. echo "${MATRIX}" | jq
  103. CT_MATRIX="$(echo "${MATRIX}" | jq -c 'map({profile, builder, otp, elixir}) | unique')"
  104. CT_HOST="$(echo "${MATRIX}" | jq -c 'map(select(.runner == "host"))')"
  105. CT_DOCKER="$(echo "${MATRIX}" | jq -c 'map(select(.runner == "docker"))')"
  106. echo "ct-matrix=${CT_MATRIX}" | tee -a $GITHUB_OUTPUT
  107. echo "ct-host=${CT_HOST}" | tee -a $GITHUB_OUTPUT
  108. echo "ct-docker=${CT_DOCKER}" | tee -a $GITHUB_OUTPUT
  109. echo "version-emqx=$(./pkg-vsn.sh emqx)" | tee -a $GITHUB_OUTPUT
  110. echo "version-emqx-enterprise=$(./pkg-vsn.sh emqx-enterprise)" | tee -a $GITHUB_OUTPUT
  111. compile:
  112. runs-on: ${{ fromJSON(needs.sanity-checks.outputs.runner_labels) }}
  113. container: ${{ needs.sanity-checks.outputs.builder }}
  114. needs:
  115. - sanity-checks
  116. strategy:
  117. matrix:
  118. profile:
  119. - emqx
  120. - emqx-enterprise
  121. steps:
  122. - uses: actions/checkout@v3
  123. with:
  124. fetch-depth: 0
  125. - name: Work around https://github.com/actions/checkout/issues/766
  126. run: |
  127. git config --global --add safe.directory "$GITHUB_WORKSPACE"
  128. - id: compile
  129. env:
  130. PROFILE: ${{ matrix.profile }}
  131. ENABLE_COVER_COMPILE: 1
  132. run: |
  133. make ensure-rebar3
  134. make ${PROFILE}-compile test-compile
  135. echo "PROFILE=${PROFILE}" | tee -a .env
  136. echo "PKG_VSN=$(./pkg-vsn.sh ${PROFILE})" | tee -a .env
  137. zip -ryq -x@.github/workflows/.zipignore $PROFILE.zip .
  138. - uses: actions/upload-artifact@v3
  139. with:
  140. name: ${{ matrix.profile }}
  141. path: ${{ matrix.profile }}.zip
  142. retention-days: 1
  143. run_emqx_app_tests:
  144. needs:
  145. - sanity-checks
  146. - compile
  147. uses: ./.github/workflows/run_emqx_app_tests.yaml
  148. with:
  149. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  150. builder: ${{ needs.sanity-checks.outputs.builder }}
  151. before_ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
  152. after_ref: ${{ github.sha }}
  153. run_test_cases:
  154. needs:
  155. - sanity-checks
  156. - compile
  157. uses: ./.github/workflows/run_test_cases.yaml
  158. with:
  159. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  160. builder: ${{ needs.sanity-checks.outputs.builder }}
  161. ct-matrix: ${{ needs.sanity-checks.outputs.ct-matrix }}
  162. ct-host: ${{ needs.sanity-checks.outputs.ct-host }}
  163. ct-docker: ${{ needs.sanity-checks.outputs.ct-docker }}
  164. static_checks:
  165. needs:
  166. - sanity-checks
  167. - compile
  168. uses: ./.github/workflows/static_checks.yaml
  169. with:
  170. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  171. builder: ${{ needs.sanity-checks.outputs.builder }}
  172. ct-matrix: ${{ needs.sanity-checks.outputs.ct-matrix }}
  173. build_slim_packages:
  174. needs:
  175. - sanity-checks
  176. uses: ./.github/workflows/build_slim_packages.yaml
  177. with:
  178. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  179. builder: ${{ needs.sanity-checks.outputs.builder }}
  180. builder_vsn: ${{ needs.sanity-checks.outputs.builder_vsn }}
  181. otp_vsn: ${{ needs.sanity-checks.outputs.otp_vsn }}
  182. elixir_vsn: ${{ needs.sanity-checks.outputs.elixir_vsn }}
  183. build_docker_for_test:
  184. needs:
  185. - sanity-checks
  186. uses: ./.github/workflows/build_docker_for_test.yaml
  187. with:
  188. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  189. otp_vsn: ${{ needs.sanity-checks.outputs.otp_vsn }}
  190. elixir_vsn: ${{ needs.sanity-checks.outputs.elixir_vsn }}
  191. version-emqx: ${{ needs.sanity-checks.outputs.version-emqx }}
  192. version-emqx-enterprise: ${{ needs.sanity-checks.outputs.version-emqx-enterprise }}
  193. spellcheck:
  194. needs:
  195. - sanity-checks
  196. - build_slim_packages
  197. uses: ./.github/workflows/spellcheck.yaml
  198. with:
  199. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  200. run_conf_tests:
  201. needs:
  202. - sanity-checks
  203. - compile
  204. uses: ./.github/workflows/run_conf_tests.yaml
  205. with:
  206. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  207. builder: ${{ needs.sanity-checks.outputs.builder }}
  208. check_deps_integrity:
  209. needs:
  210. - sanity-checks
  211. uses: ./.github/workflows/check_deps_integrity.yaml
  212. with:
  213. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  214. builder: ${{ needs.sanity-checks.outputs.builder }}
  215. run_jmeter_tests:
  216. needs:
  217. - sanity-checks
  218. - build_docker_for_test
  219. uses: ./.github/workflows/run_jmeter_tests.yaml
  220. with:
  221. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  222. version-emqx: ${{ needs.sanity-checks.outputs.version-emqx }}
  223. run_docker_tests:
  224. needs:
  225. - sanity-checks
  226. - build_docker_for_test
  227. uses: ./.github/workflows/run_docker_tests.yaml
  228. with:
  229. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  230. version-emqx: ${{ needs.sanity-checks.outputs.version-emqx }}
  231. version-emqx-enterprise: ${{ needs.sanity-checks.outputs.version-emqx-enterprise }}
  232. run_helm_tests:
  233. needs:
  234. - sanity-checks
  235. - build_docker_for_test
  236. uses: ./.github/workflows/run_helm_tests.yaml
  237. with:
  238. runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
  239. version-emqx: ${{ needs.sanity-checks.outputs.version-emqx }}
  240. version-emqx-enterprise: ${{ needs.sanity-checks.outputs.version-emqx-enterprise }}