e2e-reusable.yml 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # Reusable kind-based e2e pipeline, split into two jobs so the disk-heavy build
  2. # and the kind test run never share a runner. The build job compiles the
  3. # controller + e2e images and exports them as tarballs; the test job loads those
  4. # tarballs into kind and runs the suite, needing no Go toolchain or buildx.
  5. name: e2e reusable
  6. on:
  7. workflow_call:
  8. secrets:
  9. GCP_SERVICE_ACCOUNT_KEY:
  10. required: false
  11. GCP_FED_REGION:
  12. required: false
  13. GCP_GSA_NAME:
  14. required: false
  15. GCP_KSA_NAME:
  16. required: false
  17. GCP_FED_PROJECT_ID:
  18. required: false
  19. AWS_OIDC_ROLE_ARN:
  20. required: false
  21. AWS_SA_NAME:
  22. required: false
  23. AWS_SA_NAMESPACE:
  24. required: false
  25. TFC_AZURE_CLIENT_ID:
  26. required: false
  27. TFC_AZURE_CLIENT_SECRET:
  28. required: false
  29. TFC_AZURE_TENANT_ID:
  30. required: false
  31. TFC_AZURE_SUBSCRIPTION_ID:
  32. required: false
  33. TFC_VAULT_URL:
  34. required: false
  35. SCALEWAY_API_URL:
  36. required: false
  37. SCALEWAY_REGION:
  38. required: false
  39. SCALEWAY_PROJECT_ID:
  40. required: false
  41. SCALEWAY_ACCESS_KEY:
  42. required: false
  43. SCALEWAY_SECRET_KEY:
  44. required: false
  45. DELINEA_TLD:
  46. required: false
  47. DELINEA_URL_TEMPLATE:
  48. required: false
  49. DELINEA_TENANT:
  50. required: false
  51. DELINEA_CLIENT_ID:
  52. required: false
  53. DELINEA_CLIENT_SECRET:
  54. required: false
  55. SECRETSERVER_USERNAME:
  56. required: false
  57. SECRETSERVER_PASSWORD:
  58. required: false
  59. SECRETSERVER_URL:
  60. required: false
  61. GRAFANA_URL:
  62. required: false
  63. GRAFANA_TOKEN:
  64. required: false
  65. AKEYLESS_ACCESS_ID:
  66. required: false
  67. AKEYLESS_ACCESS_TYPE:
  68. required: false
  69. AKEYLESS_ACCESS_TYPE_PARAM:
  70. required: false
  71. GITLAB_TOKEN:
  72. required: false
  73. GITLAB_PROJECT_ID:
  74. required: false
  75. GITLAB_ENVIRONMENT:
  76. required: false
  77. ORACLE_USER_OCID:
  78. required: false
  79. ORACLE_TENANCY_OCID:
  80. required: false
  81. ORACLE_REGION:
  82. required: false
  83. ORACLE_FINGERPRINT:
  84. required: false
  85. ORACLE_KEY:
  86. required: false
  87. permissions:
  88. contents: read
  89. env:
  90. KIND_VERSION: 'v0.30.0'
  91. KIND_IMAGE: 'kindest/node:v1.33.4'
  92. AWS_REGION: "eu-central-1"
  93. # SHA under test on the fork path. Populated by a dispatcher: an explicit
  94. # `/ok-to-test sha=<sha>` comment (ok-to-test.yml), or the reviewed commit_id
  95. # of a PR review carrying /ok-to-test (ok-to-test-review.yml). Empty on the
  96. # trusted pull_request path, where the checkout falls back to github.sha (the
  97. # PR merge ref).
  98. TARGET_SHA: ${{ github.event.client_payload.slash_command.args.named.sha }}
  99. # Ephemeral tag: images are only ever loaded into kind, never pushed, so a
  100. # fixed tag keeps the build and test jobs in sync without passing a version.
  101. VERSION: "e2e"
  102. jobs:
  103. build:
  104. runs-on: ubuntu-latest
  105. permissions:
  106. contents: read
  107. steps:
  108. - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
  109. with:
  110. egress-policy: audit
  111. - name: Checkout
  112. uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
  113. with:
  114. ref: ${{ env.TARGET_SHA || github.sha }}
  115. persist-credentials: false
  116. - name: Fetch History
  117. run: git fetch --prune --unshallow
  118. - name: Free Disk Space
  119. uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
  120. with:
  121. tool-cache: true
  122. android: true
  123. dotnet: true
  124. haskell: true
  125. large-packages: false
  126. docker-images: false
  127. swap-storage: false
  128. - name: Setup Go
  129. uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
  130. with:
  131. go-version-file: go.mod
  132. - name: Find the Go Cache
  133. id: go
  134. run: |
  135. echo "build-cache=$(go env GOCACHE)" >> "$GITHUB_OUTPUT"
  136. echo "mod-cache=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT"
  137. - name: Cache the Go Build Cache
  138. uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
  139. with:
  140. path: ${{ steps.go.outputs.build-cache }}
  141. key: ${{ runner.os }}-build-unit-tests-${{ github.sha }}-${{ hashFiles('**/go.sum') }}
  142. restore-keys: ${{ runner.os }}-build-unit-tests-
  143. - name: Cache Go Dependencies
  144. uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
  145. with:
  146. path: ${{ steps.go.outputs.mod-cache }}
  147. key: ${{ runner.os }}-pkg-${{ github.sha }}-${{ hashFiles('**/go.sum') }}
  148. restore-keys: ${{ runner.os }}-pkg-
  149. - name: Setup Docker Buildx
  150. uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
  151. with:
  152. install: true
  153. - name: Build images
  154. env:
  155. DOCKER_BUILD_ARGS: --load
  156. run: make -C e2e test.build
  157. - name: Upload image tarballs
  158. uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
  159. with:
  160. name: e2e-images
  161. path: e2e/image-artifacts/*.tar
  162. retention-days: 1
  163. test:
  164. needs: build
  165. runs-on: ubuntu-latest
  166. permissions:
  167. id-token: write # for oidc auth with aws/gcp/azure
  168. contents: read # for checkout
  169. env:
  170. # Role ARN (an identifier, not a credential) lives at job level so the AWS
  171. # step can be skipped when it is absent, e.g. fork runs without secrets.
  172. # The actual provider credentials stay scoped to the Run e2e step below.
  173. AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
  174. steps:
  175. - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
  176. with:
  177. egress-policy: audit
  178. - name: Checkout
  179. uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
  180. with:
  181. ref: ${{ env.TARGET_SHA || github.sha }}
  182. persist-credentials: false
  183. - name: Configure AWS Credentials
  184. if: env.AWS_OIDC_ROLE_ARN != ''
  185. uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
  186. with:
  187. role-to-assume: ${{ env.AWS_OIDC_ROLE_ARN }}
  188. aws-region: ${{ env.AWS_REGION }}
  189. - name: Setup kind
  190. uses: engineerd/setup-kind@aa272fe2a7309878ffc2a81c56cfe3ef108ae7d0 # v0.5.0
  191. with:
  192. version: ${{ env.KIND_VERSION }}
  193. wait: 10m
  194. image: ${{ env.KIND_IMAGE }}
  195. name: external-secrets
  196. - name: Download image tarballs
  197. uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
  198. with:
  199. name: e2e-images
  200. path: e2e/image-artifacts
  201. - name: Run e2e
  202. env:
  203. GCP_SERVICE_ACCOUNT_KEY: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
  204. GCP_FED_REGION: ${{ secrets.GCP_FED_REGION }}
  205. GCP_GSA_NAME: ${{ secrets.GCP_GSA_NAME }}
  206. GCP_KSA_NAME: ${{ secrets.GCP_KSA_NAME }}
  207. GCP_FED_PROJECT_ID: ${{ secrets.GCP_FED_PROJECT_ID }}
  208. AWS_SA_NAME: ${{ secrets.AWS_SA_NAME }}
  209. AWS_SA_NAMESPACE: ${{ secrets.AWS_SA_NAMESPACE }}
  210. TFC_AZURE_CLIENT_ID: ${{ secrets.TFC_AZURE_CLIENT_ID }}
  211. TFC_AZURE_CLIENT_SECRET: ${{ secrets.TFC_AZURE_CLIENT_SECRET }}
  212. TFC_AZURE_TENANT_ID: ${{ secrets.TFC_AZURE_TENANT_ID }}
  213. TFC_AZURE_SUBSCRIPTION_ID: ${{ secrets.TFC_AZURE_SUBSCRIPTION_ID }}
  214. TFC_VAULT_URL: ${{ secrets.TFC_VAULT_URL }}
  215. SCALEWAY_API_URL: ${{ secrets.SCALEWAY_API_URL }}
  216. SCALEWAY_REGION: ${{ secrets.SCALEWAY_REGION }}
  217. SCALEWAY_PROJECT_ID: ${{ secrets.SCALEWAY_PROJECT_ID }}
  218. SCALEWAY_ACCESS_KEY: ${{ secrets.SCALEWAY_ACCESS_KEY }}
  219. SCALEWAY_SECRET_KEY: ${{ secrets.SCALEWAY_SECRET_KEY }}
  220. DELINEA_TLD: ${{ secrets.DELINEA_TLD }}
  221. DELINEA_URL_TEMPLATE: ${{ secrets.DELINEA_URL_TEMPLATE }}
  222. DELINEA_TENANT: ${{ secrets.DELINEA_TENANT }}
  223. DELINEA_CLIENT_ID: ${{ secrets.DELINEA_CLIENT_ID }}
  224. DELINEA_CLIENT_SECRET: ${{ secrets.DELINEA_CLIENT_SECRET }}
  225. SECRETSERVER_USERNAME: ${{ secrets.SECRETSERVER_USERNAME }}
  226. SECRETSERVER_PASSWORD: ${{ secrets.SECRETSERVER_PASSWORD }}
  227. SECRETSERVER_URL: ${{ secrets.SECRETSERVER_URL }}
  228. GRAFANA_URL: ${{ secrets.GRAFANA_URL }}
  229. GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
  230. AKEYLESS_ACCESS_ID: ${{ secrets.AKEYLESS_ACCESS_ID }}
  231. AKEYLESS_ACCESS_TYPE: ${{ secrets.AKEYLESS_ACCESS_TYPE }}
  232. AKEYLESS_ACCESS_TYPE_PARAM: ${{ secrets.AKEYLESS_ACCESS_TYPE_PARAM }}
  233. GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
  234. GITLAB_PROJECT_ID: ${{ secrets.GITLAB_PROJECT_ID }}
  235. GITLAB_ENVIRONMENT: ${{ secrets.GITLAB_ENVIRONMENT }}
  236. ORACLE_USER_OCID: ${{ secrets.ORACLE_USER_OCID }}
  237. ORACLE_TENANCY_OCID: ${{ secrets.ORACLE_TENANCY_OCID }}
  238. ORACLE_REGION: ${{ secrets.ORACLE_REGION }}
  239. ORACLE_FINGERPRINT: ${{ secrets.ORACLE_FINGERPRINT }}
  240. ORACLE_KEY: ${{ secrets.ORACLE_KEY }}
  241. run: make -C e2e test.run