e2e.yml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. # Run secret-dependent e2e tests only after /ok-to-test approval
  2. on:
  3. pull_request:
  4. repository_dispatch:
  5. types: [ok-to-test-command]
  6. permissions:
  7. contents: read
  8. name: e2e tests
  9. env:
  10. # Common versions
  11. KIND_VERSION: 'v0.30.0'
  12. KIND_IMAGE: 'kindest/node:v1.33.4'
  13. # SHA under test on the fork path. Two dispatchers populate it: an explicit
  14. # `/ok-to-test sha=<sha>` comment (ok-to-test.yml) or a PR review whose body
  15. # carries /ok-to-test (ok-to-test-review.yml, pinned to the reviewed
  16. # commit_id). A bare comment leaves it empty and guard-fork rejects the run
  17. # rather than testing the PR head or main. Also empty on the trusted
  18. # pull_request path, where the checkout falls back to github.sha.
  19. TARGET_SHA: ${{ github.event.client_payload.slash_command.args.named.sha }}
  20. AWS_REGION: "eu-central-1"
  21. jobs:
  22. # Same-repo pull request: build and test run as two jobs on separate runners.
  23. integration-trusted:
  24. permissions:
  25. id-token: write # for oidc auth with aws/gcp/azure
  26. contents: read # for checkout
  27. if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && github.actor !='dependabot[bot]'
  28. uses: ./.github/workflows/e2e-reusable.yml
  29. secrets:
  30. GCP_SERVICE_ACCOUNT_KEY: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
  31. GCP_FED_REGION: ${{ secrets.GCP_FED_REGION }}
  32. GCP_GSA_NAME: ${{ secrets.GCP_GSA_NAME }}
  33. GCP_KSA_NAME: ${{ secrets.GCP_KSA_NAME }}
  34. GCP_FED_PROJECT_ID: ${{ secrets.GCP_FED_PROJECT_ID }}
  35. AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
  36. AWS_SA_NAME: ${{ secrets.AWS_SA_NAME }}
  37. AWS_SA_NAMESPACE: ${{ secrets.AWS_SA_NAMESPACE }}
  38. TFC_AZURE_CLIENT_ID: ${{ secrets.TFC_AZURE_CLIENT_ID }}
  39. TFC_AZURE_CLIENT_SECRET: ${{ secrets.TFC_AZURE_CLIENT_SECRET }}
  40. TFC_AZURE_TENANT_ID: ${{ secrets.TFC_AZURE_TENANT_ID }}
  41. TFC_AZURE_SUBSCRIPTION_ID: ${{ secrets.TFC_AZURE_SUBSCRIPTION_ID }}
  42. TFC_VAULT_URL: ${{ secrets.TFC_VAULT_URL }}
  43. SCALEWAY_API_URL: ${{ secrets.SCALEWAY_API_URL }}
  44. SCALEWAY_REGION: ${{ secrets.SCALEWAY_REGION }}
  45. SCALEWAY_PROJECT_ID: ${{ secrets.SCALEWAY_PROJECT_ID }}
  46. SCALEWAY_ACCESS_KEY: ${{ secrets.SCALEWAY_ACCESS_KEY }}
  47. SCALEWAY_SECRET_KEY: ${{ secrets.SCALEWAY_SECRET_KEY }}
  48. DELINEA_TLD: ${{ secrets.DELINEA_TLD }}
  49. DELINEA_URL_TEMPLATE: ${{ secrets.DELINEA_URL_TEMPLATE }}
  50. DELINEA_TENANT: ${{ secrets.DELINEA_TENANT }}
  51. DELINEA_CLIENT_ID: ${{ secrets.DELINEA_CLIENT_ID }}
  52. DELINEA_CLIENT_SECRET: ${{ secrets.DELINEA_CLIENT_SECRET }}
  53. SECRETSERVER_USERNAME: ${{ secrets.SECRETSERVER_USERNAME }}
  54. SECRETSERVER_PASSWORD: ${{ secrets.SECRETSERVER_PASSWORD }}
  55. SECRETSERVER_URL: ${{ secrets.SECRETSERVER_URL }}
  56. GRAFANA_URL: ${{ secrets.GRAFANA_URL }}
  57. GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
  58. AKEYLESS_ACCESS_ID: ${{ secrets.AKEYLESS_ACCESS_ID }}
  59. AKEYLESS_ACCESS_TYPE: ${{ secrets.AKEYLESS_ACCESS_TYPE }}
  60. AKEYLESS_ACCESS_TYPE_PARAM: ${{ secrets.AKEYLESS_ACCESS_TYPE_PARAM }}
  61. GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
  62. GITLAB_PROJECT_ID: ${{ secrets.GITLAB_PROJECT_ID }}
  63. GITLAB_ENVIRONMENT: ${{ secrets.GITLAB_ENVIRONMENT }}
  64. ORACLE_USER_OCID: ${{ secrets.ORACLE_USER_OCID }}
  65. ORACLE_TENANCY_OCID: ${{ secrets.ORACLE_TENANCY_OCID }}
  66. ORACLE_REGION: ${{ secrets.ORACLE_REGION }}
  67. ORACLE_FINGERPRINT: ${{ secrets.ORACLE_FINGERPRINT }}
  68. ORACLE_KEY: ${{ secrets.ORACLE_KEY }}
  69. # A /ok-to-test *comment* must carry an explicit sha=. A bare comment has no
  70. # trustworthy pinned commit (the dispatch would otherwise read the live PR
  71. # head, which a later push can move), so reject it here instead of testing the
  72. # wrong code. Reviews carry commit_id and arrive already pinned via
  73. # ok-to-test-review.yml, so this guard never fires for them.
  74. guard-fork:
  75. if: github.event_name == 'repository_dispatch'
  76. runs-on: ubuntu-latest
  77. permissions:
  78. pull-requests: write # to explain a rejected /ok-to-test on the PR
  79. contents: read
  80. steps:
  81. - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
  82. with:
  83. egress-policy: audit
  84. # Require a full 40-char commit SHA. This rejects a bare /ok-to-test (empty
  85. # TARGET_SHA) and a malformed sha= (e.g. a branch name like `main`, a short
  86. # SHA, or a flag), so the checkout ref is always a pinned commit. The review
  87. # path supplies review.commit_id, which is always a full SHA.
  88. - name: Validate the target sha
  89. id: check
  90. run: |
  91. if printf '%s' "$TARGET_SHA" | grep -qE '^[0-9a-fA-F]{40}$'; then
  92. echo "valid=true" >> "$GITHUB_OUTPUT"
  93. echo "target sha $TARGET_SHA"
  94. else
  95. echo "valid=false" >> "$GITHUB_OUTPUT"
  96. fi
  97. - name: Generate token
  98. id: create_token
  99. if: steps.check.outputs.valid == 'false'
  100. uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
  101. env:
  102. APP_ID: ${{ secrets.APP_ID }}
  103. with:
  104. app-id: ${{ env.APP_ID }}
  105. private-key: ${{ secrets.PRIVATE_KEY }}
  106. owner: ${{ github.repository_owner }}
  107. repositories: ${{ github.event.repository.name }}
  108. permission-issues: write
  109. permission-pull-requests: write
  110. - name: Explain the rejection on the PR
  111. if: steps.check.outputs.valid == 'false'
  112. uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
  113. with:
  114. token: ${{ steps.create_token.outputs.token }}
  115. issue-number: ${{ github.event.client_payload.pull_request.number }}
  116. body: |
  117. [Bot] - :warning: A `/ok-to-test` comment needs an explicit full commit SHA: `/ok-to-test sha=<40-char-sha>`. Alternatively submit a PR review (Approve or Comment) whose body contains `/ok-to-test` to test the exact commit you reviewed.
  118. - name: Fail without a valid target sha
  119. if: steps.check.outputs.valid == 'false'
  120. run: |
  121. echo "::error::/ok-to-test needs sha=<full 40-char commit SHA>; refusing to fall back to the PR head or main"
  122. exit 1
  123. # Repo owner approved a fork PR via /ok-to-test (comment with sha= or review).
  124. integration-fork:
  125. permissions:
  126. id-token: write # for oidc auth with aws/gcp/azure
  127. contents: read # for checkout
  128. needs: guard-fork
  129. if: github.event_name == 'repository_dispatch'
  130. uses: ./.github/workflows/e2e-reusable.yml
  131. secrets:
  132. GCP_SERVICE_ACCOUNT_KEY: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
  133. GCP_FED_REGION: ${{ secrets.GCP_FED_REGION }}
  134. GCP_GSA_NAME: ${{ secrets.GCP_GSA_NAME }}
  135. GCP_KSA_NAME: ${{ secrets.GCP_KSA_NAME }}
  136. GCP_FED_PROJECT_ID: ${{ secrets.GCP_FED_PROJECT_ID }}
  137. AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
  138. AWS_SA_NAME: ${{ secrets.AWS_SA_NAME }}
  139. AWS_SA_NAMESPACE: ${{ secrets.AWS_SA_NAMESPACE }}
  140. TFC_AZURE_CLIENT_ID: ${{ secrets.TFC_AZURE_CLIENT_ID }}
  141. TFC_AZURE_CLIENT_SECRET: ${{ secrets.TFC_AZURE_CLIENT_SECRET }}
  142. TFC_AZURE_TENANT_ID: ${{ secrets.TFC_AZURE_TENANT_ID }}
  143. TFC_AZURE_SUBSCRIPTION_ID: ${{ secrets.TFC_AZURE_SUBSCRIPTION_ID }}
  144. TFC_VAULT_URL: ${{ secrets.TFC_VAULT_URL }}
  145. SCALEWAY_API_URL: ${{ secrets.SCALEWAY_API_URL }}
  146. SCALEWAY_REGION: ${{ secrets.SCALEWAY_REGION }}
  147. SCALEWAY_PROJECT_ID: ${{ secrets.SCALEWAY_PROJECT_ID }}
  148. SCALEWAY_ACCESS_KEY: ${{ secrets.SCALEWAY_ACCESS_KEY }}
  149. SCALEWAY_SECRET_KEY: ${{ secrets.SCALEWAY_SECRET_KEY }}
  150. DELINEA_TLD: ${{ secrets.DELINEA_TLD }}
  151. DELINEA_URL_TEMPLATE: ${{ secrets.DELINEA_URL_TEMPLATE }}
  152. DELINEA_TENANT: ${{ secrets.DELINEA_TENANT }}
  153. DELINEA_CLIENT_ID: ${{ secrets.DELINEA_CLIENT_ID }}
  154. DELINEA_CLIENT_SECRET: ${{ secrets.DELINEA_CLIENT_SECRET }}
  155. SECRETSERVER_USERNAME: ${{ secrets.SECRETSERVER_USERNAME }}
  156. SECRETSERVER_PASSWORD: ${{ secrets.SECRETSERVER_PASSWORD }}
  157. SECRETSERVER_URL: ${{ secrets.SECRETSERVER_URL }}
  158. GRAFANA_URL: ${{ secrets.GRAFANA_URL }}
  159. GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
  160. AKEYLESS_ACCESS_ID: ${{ secrets.AKEYLESS_ACCESS_ID }}
  161. AKEYLESS_ACCESS_TYPE: ${{ secrets.AKEYLESS_ACCESS_TYPE }}
  162. AKEYLESS_ACCESS_TYPE_PARAM: ${{ secrets.AKEYLESS_ACCESS_TYPE_PARAM }}
  163. GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
  164. GITLAB_PROJECT_ID: ${{ secrets.GITLAB_PROJECT_ID }}
  165. GITLAB_ENVIRONMENT: ${{ secrets.GITLAB_ENVIRONMENT }}
  166. ORACLE_USER_OCID: ${{ secrets.ORACLE_USER_OCID }}
  167. ORACLE_TENANCY_OCID: ${{ secrets.ORACLE_TENANCY_OCID }}
  168. ORACLE_REGION: ${{ secrets.ORACLE_REGION }}
  169. ORACLE_FINGERPRINT: ${{ secrets.ORACLE_FINGERPRINT }}
  170. ORACLE_KEY: ${{ secrets.ORACLE_KEY }}
  171. # Report the fork run result back onto the originating pull request.
  172. report-fork:
  173. if: ${{ always() && github.event_name == 'repository_dispatch' && needs.integration-fork.result != 'skipped' }}
  174. needs: integration-fork
  175. runs-on: ubuntu-latest
  176. permissions:
  177. pull-requests: write # to publish the status as comments
  178. contents: read
  179. steps:
  180. - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
  181. with:
  182. egress-policy: audit
  183. - id: create_token
  184. uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
  185. env:
  186. APP_ID: ${{ secrets.APP_ID }}
  187. with:
  188. app-id: ${{ env.APP_ID }}
  189. private-key: ${{ secrets.PRIVATE_KEY }}
  190. owner: ${{ github.repository_owner }}
  191. repositories: ${{ github.event.repository.name }}
  192. permission-issues: write
  193. permission-pull-requests: write
  194. - name: Update on Success
  195. if: needs.integration-fork.result == 'success'
  196. uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
  197. with:
  198. token: ${{ steps.create_token.outputs.token }}
  199. issue-number: ${{ github.event.client_payload.pull_request.number }}
  200. body: |
  201. [Bot] - :white_check_mark: [e2e for ${{ env.TARGET_SHA }} passed](https://github.com/external-secrets/external-secrets/actions/runs/${{ github.run_id }})
  202. - name: Update on Failure
  203. if: needs.integration-fork.result != 'success'
  204. uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
  205. with:
  206. token: ${{ steps.create_token.outputs.token }}
  207. issue-number: ${{ github.event.client_payload.pull_request.number }}
  208. body: |
  209. [Bot] - :x: [e2e for ${{ env.TARGET_SHA }} failed](https://github.com/external-secrets/external-secrets/actions/runs/${{ github.run_id }})