matrix.yaml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. # Source of truth for the non-managed e2e fan-out (e2e.yml). Each area is one CI
  2. # leg: a suite binary run under a Ginkgo label filter. The build job compiles
  3. # the images once; each selected area runs as its own matrix leg on its own kind
  4. # cluster, so a flaky addon in one provider cannot fail the others. On a pull
  5. # request the selection is the legs the diff can affect (see paths below); every
  6. # other event runs all enabled areas.
  7. #
  8. # Fields:
  9. # name leg id, shown as "test (<name>)" in the checks list.
  10. # suite which suite binary to run (TEST_SUITES). One suite per leg so a
  11. # label filter never has to span binaries that lack the labels.
  12. # labels Ginkgo -label-filter (GINKGO_LABELS). This workflow is
  13. # non-managed only; the managed IRSA/workload-identity specs run
  14. # in e2e-managed.yml, so every filter ends with "&& !managed".
  15. # providers provider case names this leg covers. Used only by
  16. # check-matrix.sh to prove every provider compiled into the suite
  17. # (suites/provider/cases/import.go) is tested somewhere. Not read
  18. # by CI at run time.
  19. # secret_groups external credential groups this leg receives. The reusable
  20. # workflow injects a provider's secrets only when its group is
  21. # listed here, so a vault leg never sees AWS creds. Empty means
  22. # the leg runs against in-cluster addons only (fork-safe). Group
  23. # names map to secret sets in e2e-reusable.yml.
  24. # needs_secrets convenience mirror of "secret_groups is non-empty". Documents
  25. # intent; not read by CI.
  26. # paths globs whose change triggers this leg. Read by the resolver
  27. # (matrix.py json --changed) on pull requests; every enabled
  28. # area runs on other events. Required on enabled areas, or the
  29. # leg would sit out nearly every PR.
  30. # always opt this leg out of affected-only filtering, so it runs on
  31. # every PR whatever changed. Set on the required floor only:
  32. # something must always run, or the matrix could come out empty.
  33. # enabled whether CI runs this leg at all. Disabled areas still count
  34. # for coverage and document the target matrix; flip to true to
  35. # expand the fan-out.
  36. #
  37. # All legs are enabled. Set enabled: false on an area to skip it (e.g. while a
  38. # provider's e2e is being fixed) without deleting its definition.
  39. # Shared machinery no single leg owns: a change here runs every enabled leg.
  40. # Not belt-and-braces: apis/, pkg/ and runtime/ appear in only four areas'
  41. # paths, so per-area matching alone would skip every provider leg on a core
  42. # change, losing coverage exactly when it matters most.
  43. #
  44. # The e2e entries are listed file by file on purpose. Globs are fnmatch, where
  45. # * crosses /, so "e2e/*" would also match e2e/suites/... and make every change
  46. # run everything. e2e/README.md is left out so a docs edit stays cheap.
  47. full_matrix_paths:
  48. - "apis/**"
  49. - "pkg/**"
  50. - "runtime/**"
  51. - "cmd/**"
  52. - "deploy/**"
  53. - "hack/**"
  54. - "go.mod"
  55. - "go.sum"
  56. - "Makefile"
  57. - "Dockerfile*"
  58. - ".github/workflows/**"
  59. # Every leg runs the same image and the same kind cluster, so all of this is
  60. # shared: the Dockerfile ADDs entrypoint.sh, k8s/ and all four suite
  61. # binaries, and the Makefile creates the cluster from kind.yaml.
  62. - "e2e/Dockerfile"
  63. - "e2e/entrypoint.sh"
  64. - "e2e/go.mod"
  65. - "e2e/go.sum"
  66. - "e2e/kind.yaml"
  67. - "e2e/Makefile"
  68. - "e2e/matrix.py"
  69. - "e2e/matrix.yaml"
  70. - "e2e/run.sh"
  71. - "e2e/tools.go"
  72. - "e2e/framework/**"
  73. - "e2e/k8s/**"
  74. - "e2e/suites/provider/cases/common/**"
  75. - "e2e/suites/provider/cases/import.go"
  76. # The provider suite's bootstrap sits one level above every provider leg's
  77. # cases/<name>/** globs, so nothing else selects it. check rule 6 keeps any
  78. # future sibling from going uncovered the same way.
  79. - "e2e/suites/provider/suite_test.go"
  80. areas:
  81. # In-cluster only, no external credentials. The required floor: never
  82. # filtered out, so it runs whatever a pull request changed. Not "including
  83. # forks": a fork PR runs no leg at all until /ok-to-test dispatches.
  84. - name: core-smoke
  85. suite: provider
  86. labels: "(fake || kubernetes || template) && !managed"
  87. providers: [fake, kubernetes, template]
  88. secret_groups: []
  89. needs_secrets: false
  90. paths:
  91. - "apis/**"
  92. - "pkg/**"
  93. - "runtime/**"
  94. - "cmd/**"
  95. - "deploy/**"
  96. - "e2e/framework/**"
  97. - "e2e/suites/provider/cases/fake/**"
  98. - "e2e/suites/provider/cases/kubernetes/**"
  99. - "e2e/suites/provider/cases/template/**"
  100. - "e2e/suites/provider/cases/common/**"
  101. # The providers these specs drive through the controller. Listed even
  102. # though always: true already forces this leg, so coverage does not
  103. # silently depend on that flag staying set.
  104. - "providers/v1/fake/**"
  105. - "providers/v1/kubernetes/**"
  106. always: true
  107. enabled: true
  108. # The CRD provider reads arbitrary custom resources from the local cluster
  109. # API, so it needs no credentials and no addon. It gets its own leg rather
  110. # than joining core-smoke because its specs install a cluster-scoped test CRD
  111. # and cluster-wide RBAC, heavier setup than the rest of that leg carries.
  112. # Like every enabled area it feeds e2e-required, so a failure here does turn
  113. # the gate red; the split buys attribution (the failing leg names the
  114. # provider) and keeps a crd break from also failing the fake, kubernetes, and
  115. # template specs.
  116. - name: crd
  117. suite: provider
  118. labels: "crd && !managed"
  119. providers: [crd]
  120. secret_groups: []
  121. needs_secrets: false
  122. paths:
  123. - "providers/v1/crd/**"
  124. - "e2e/suites/provider/cases/crd/**"
  125. enabled: true
  126. # Self-hosted secret backends, installed as in-cluster addons (no cloud
  127. # creds). One leg per provider so a broken addon (e.g. conjur) fails only its
  128. # own leg, not the others, and the leg name matches what it runs.
  129. - name: vault
  130. suite: provider
  131. labels: "vault && !managed"
  132. providers: [vault]
  133. secret_groups: []
  134. needs_secrets: false
  135. paths:
  136. - "providers/v1/vault/**"
  137. - "e2e/suites/provider/cases/vault/**"
  138. enabled: true
  139. - name: openbao
  140. suite: provider
  141. labels: "openbao && !managed"
  142. providers: [openbao]
  143. secret_groups: []
  144. needs_secrets: false
  145. paths:
  146. - "providers/v1/openbao/**"
  147. - "e2e/suites/provider/cases/openbao/**"
  148. enabled: true
  149. - name: conjur
  150. suite: provider
  151. labels: "conjur && !managed"
  152. providers: [conjur]
  153. secret_groups: []
  154. needs_secrets: false
  155. paths:
  156. - "providers/v1/conjur/**"
  157. - "e2e/suites/provider/cases/conjur/**"
  158. enabled: true
  159. # Cloud provider, non-managed specs. Needs AWS OIDC credentials.
  160. - name: aws
  161. suite: provider
  162. labels: "aws && !managed"
  163. providers: [aws]
  164. secret_groups: [aws]
  165. needs_secrets: true
  166. paths:
  167. - "providers/v1/aws/**"
  168. - "e2e/suites/provider/cases/aws/**"
  169. enabled: true
  170. # ---- Cloud / external-API providers (each scoped to its own secret group). ----
  171. - name: gcp
  172. suite: provider
  173. labels: "gcp && !managed"
  174. providers: [gcp]
  175. secret_groups: [gcp]
  176. needs_secrets: true
  177. paths:
  178. - "providers/v1/gcp/**"
  179. - "e2e/suites/provider/cases/gcp/**"
  180. enabled: true
  181. - name: azure
  182. suite: provider
  183. labels: "azure && !managed"
  184. providers: [azure]
  185. secret_groups: [azure]
  186. needs_secrets: true
  187. paths:
  188. - "providers/v1/azure/**"
  189. - "e2e/suites/provider/cases/azure/**"
  190. enabled: true
  191. - name: scaleway
  192. suite: provider
  193. labels: "scaleway && !managed"
  194. providers: [scaleway]
  195. secret_groups: [scaleway]
  196. needs_secrets: true
  197. paths:
  198. - "providers/v1/scaleway/**"
  199. - "e2e/suites/provider/cases/scaleway/**"
  200. enabled: true
  201. - name: delinea
  202. suite: provider
  203. labels: "delinea && !managed"
  204. providers: [delinea]
  205. secret_groups: [delinea]
  206. needs_secrets: true
  207. paths:
  208. - "providers/v1/delinea/**"
  209. - "e2e/suites/provider/cases/delinea/**"
  210. enabled: true
  211. - name: secretserver
  212. suite: provider
  213. labels: "secretserver && !managed"
  214. providers: [secretserver]
  215. secret_groups: [secretserver]
  216. needs_secrets: true
  217. paths:
  218. - "providers/v1/secretserver/**"
  219. - "e2e/suites/provider/cases/secretserver/**"
  220. enabled: true
  221. # Infisical runs against an in-cluster Infisical addon (addon.NewInfisical),
  222. # not an external tenant, so it needs no repo secrets despite being a SaaS.
  223. - name: infisical
  224. suite: provider
  225. labels: "infisical && !managed"
  226. providers: [infisical]
  227. secret_groups: []
  228. needs_secrets: false
  229. paths:
  230. - "providers/v1/infisical/**"
  231. - "e2e/suites/provider/cases/infisical/**"
  232. enabled: true
  233. # Non-provider suites. No provider labels, so providers is empty; they run the
  234. # whole non-managed suite. flux and argocd exercise ESO under GitOps tools and
  235. # need no creds.
  236. #
  237. # The generator suite is split in two: the grafana generator talks to a live
  238. # external Grafana Cloud instance (its own leg below), while every other
  239. # generator runs in-cluster. This leg runs all generators except grafana; the
  240. # ecr and sts generators mint tokens against real AWS, so it needs the aws
  241. # group.
  242. - name: generator
  243. suite: generator
  244. labels: "!managed && !grafana"
  245. providers: []
  246. secret_groups: [aws]
  247. needs_secrets: true
  248. paths:
  249. - "apis/**"
  250. - "pkg/**"
  251. - "runtime/**"
  252. - "generators/**"
  253. - "e2e/suites/generator/**"
  254. enabled: true
  255. # The grafana generator, isolated. It depends on a live external Grafana Cloud
  256. # instance (GRAFANA_URL / GRAFANA_TOKEN); the suite even wakes a sleepy
  257. # instance in BeforeEach. Kept as its own leg so its external flakiness is
  258. # attributable and never masks the other generators.
  259. - name: grafana
  260. suite: generator
  261. labels: "grafana && !managed"
  262. providers: []
  263. secret_groups: [grafana]
  264. needs_secrets: true
  265. paths:
  266. - "generators/v1/grafana/**"
  267. # The whole suite dir, not just grafana.go: the bootstrap and the shared
  268. # assertion helper live beside it, and naming files one by one would miss
  269. # the next shared one somebody adds.
  270. - "e2e/suites/generator/**"
  271. enabled: true
  272. - name: flux
  273. suite: flux
  274. labels: "!managed"
  275. providers: []
  276. secret_groups: []
  277. needs_secrets: false
  278. paths:
  279. - "apis/**"
  280. - "pkg/**"
  281. - "runtime/**"
  282. - "e2e/suites/flux/**"
  283. - "e2e/suites/provider/cases/fake/**" # flux.go drives the fake provider
  284. enabled: true
  285. - name: argocd
  286. suite: argocd
  287. labels: "!managed"
  288. providers: []
  289. secret_groups: []
  290. needs_secrets: false
  291. paths:
  292. - "apis/**"
  293. - "pkg/**"
  294. - "runtime/**"
  295. - "e2e/suites/argocd/**"
  296. - "e2e/suites/provider/cases/fake/**" # argocd.go drives the fake provider
  297. enabled: true