@newskit-render/core 0.0.0-d55b7d88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/.ci/trigger-circleci-workflow.sh +37 -0
  2. package/.eslintignore +23 -0
  3. package/.eslintrc +74 -0
  4. package/.prettierignore +19 -0
  5. package/.prettierrc +7 -0
  6. package/CHANGELOG.md +7638 -0
  7. package/Dockerfile +14 -0
  8. package/Dockerfile.withNewRelic +15 -0
  9. package/README.md +274 -0
  10. package/__tests__/pages/__snapshots__/brightcove.test.tsx.snap +20 -0
  11. package/__tests__/pages/__snapshots__/home.test.tsx.snap +1195 -0
  12. package/__tests__/pages/brightcove.test.tsx +34 -0
  13. package/__tests__/pages/empty.test.tsx +10 -0
  14. package/__tests__/pages/home.test.tsx +16 -0
  15. package/app-context/InstrumentationContextProvider.tsx +36 -0
  16. package/assets/fontFamily.ts +416 -0
  17. package/assets/fonts/Graphik-Black-App.ttf +0 -0
  18. package/assets/fonts/Graphik-BlackItalic-App.ttf +0 -0
  19. package/assets/fonts/Graphik-Bold-App.ttf +0 -0
  20. package/assets/fonts/Graphik-BoldItalic-App.ttf +0 -0
  21. package/assets/fonts/Graphik-Extralight-App.ttf +0 -0
  22. package/assets/fonts/Graphik-ExtralightItalic-App.ttf +0 -0
  23. package/assets/fonts/Graphik-Light-App.ttf +0 -0
  24. package/assets/fonts/Graphik-LightItalic-App.ttf +0 -0
  25. package/assets/fonts/Graphik-Medium-App.ttf +0 -0
  26. package/assets/fonts/Graphik-Medium-Web.woff2 +0 -0
  27. package/assets/fonts/Graphik-MediumItalic-App.ttf +0 -0
  28. package/assets/fonts/Graphik-Regular-App.ttf +0 -0
  29. package/assets/fonts/Graphik-Regular-Web.woff2 +0 -0
  30. package/assets/fonts/Graphik-RegularItalic-App.ttf +0 -0
  31. package/assets/fonts/Graphik-Semibold-App.ttf +0 -0
  32. package/assets/fonts/Graphik-Semibold-Web.woff2 +0 -0
  33. package/assets/fonts/Graphik-SemiboldItalic-App.ttf +0 -0
  34. package/assets/fonts/Graphik-Super-App.ttf +0 -0
  35. package/assets/fonts/Graphik-SuperItalic-App.ttf +0 -0
  36. package/assets/fonts/Graphik-Thin-App.ttf +0 -0
  37. package/assets/fonts/Graphik-ThinItalic-App.ttf +0 -0
  38. package/assets/fonts/Montserrat-Black.ttf +0 -0
  39. package/assets/fonts/Montserrat-BlackItalic.ttf +0 -0
  40. package/assets/fonts/Montserrat-Bold.ttf +0 -0
  41. package/assets/fonts/Montserrat-BoldItalic.ttf +0 -0
  42. package/assets/fonts/Montserrat-ExtraBold.ttf +0 -0
  43. package/assets/fonts/Montserrat-ExtraBoldItalic.ttf +0 -0
  44. package/assets/fonts/Montserrat-ExtraLight.ttf +0 -0
  45. package/assets/fonts/Montserrat-ExtraLightItalic.ttf +0 -0
  46. package/assets/fonts/Montserrat-Italic.ttf +0 -0
  47. package/assets/fonts/Montserrat-Light.ttf +0 -0
  48. package/assets/fonts/Montserrat-LightItalic.ttf +0 -0
  49. package/assets/fonts/Montserrat-Medium.ttf +0 -0
  50. package/assets/fonts/Montserrat-MediumItalic.ttf +0 -0
  51. package/assets/fonts/Montserrat-Regular.ttf +0 -0
  52. package/assets/fonts/Montserrat-SemiBold.ttf +0 -0
  53. package/assets/fonts/Montserrat-SemiBoldItalic.ttf +0 -0
  54. package/assets/fonts/Montserrat-Thin.ttf +0 -0
  55. package/assets/fonts/Montserrat-ThinItalic.ttf +0 -0
  56. package/assets/fonts/PublicoHeadline-Black-App.ttf +0 -0
  57. package/assets/fonts/PublicoHeadline-BlackItalic-App.ttf +0 -0
  58. package/assets/fonts/PublicoHeadline-Bold-App.ttf +0 -0
  59. package/assets/fonts/PublicoHeadline-Bold-Web.woff2 +0 -0
  60. package/assets/fonts/PublicoHeadline-BoldItalic-App.ttf +0 -0
  61. package/assets/fonts/PublicoHeadline-Extrabold-App.ttf +0 -0
  62. package/assets/fonts/PublicoHeadline-ExtraboldItalic-App.ttf +0 -0
  63. package/assets/fonts/PublicoHeadline-Italic-App.ttf +0 -0
  64. package/assets/fonts/PublicoHeadline-Light-App.ttf +0 -0
  65. package/assets/fonts/PublicoHeadline-LightItalic-App.ttf +0 -0
  66. package/assets/fonts/PublicoHeadline-Medium-App.ttf +0 -0
  67. package/assets/fonts/PublicoHeadline-MediumItalic-App.ttf +0 -0
  68. package/assets/fonts/PublicoHeadline-Roman-App.ttf +0 -0
  69. package/assets/fonts/PublicoHeadline-Roman-Web.woff2 +0 -0
  70. package/assets/fonts/PublicoText-Bold-App.ttf +0 -0
  71. package/assets/fonts/PublicoText-BoldItalic-App.ttf +0 -0
  72. package/assets/fonts/PublicoText-Italic-App.ttf +0 -0
  73. package/assets/fonts/PublicoText-Italic-Web.woff2 +0 -0
  74. package/assets/fonts/PublicoText-Roman-App.ttf +0 -0
  75. package/assets/fonts/PublicoText-Roman-Web.woff2 +0 -0
  76. package/assets/fonts/PublicoText-Semibold-App.ttf +0 -0
  77. package/assets/fonts/PublicoText-SemiboldItalic-App.ttf +0 -0
  78. package/assets/fonts/Roboto-Bold.ttf +0 -0
  79. package/assets/fonts/Roboto-Light.ttf +0 -0
  80. package/assets/fonts/Roboto-Medium.ttf +0 -0
  81. package/assets/fonts/Roboto-Regular.ttf +0 -0
  82. package/assets/fonts/TheSun-Bold.ttf +0 -0
  83. package/assets/fonts/TheSun-BoldItalic.ttf +0 -0
  84. package/assets/fonts/TheSun-HeavyCondensed.ttf +0 -0
  85. package/assets/fonts/TheSun-HeavyNarrow.ttf +0 -0
  86. package/assets/fonts/TheSun-Italic.ttf +0 -0
  87. package/assets/fonts/TheSun-Medium.ttf +0 -0
  88. package/assets/fonts/TheSun-MediumItalic.ttf +0 -0
  89. package/assets/fonts/TheSun-Regular.ttf +0 -0
  90. package/assets/fonts/TimesDigital-Bold.ttf +0 -0
  91. package/assets/fonts/TimesDigital-BoldItalic.ttf +0 -0
  92. package/assets/fonts/TimesDigital-BoldSC.ttf +0 -0
  93. package/assets/fonts/TimesDigital-Italic.ttf +0 -0
  94. package/assets/fonts/TimesDigital-Regular.ttf +0 -0
  95. package/assets/fonts/TimesDigital-RegularSC.ttf +0 -0
  96. package/assets/fonts/TimesDigitalW04-Bold.ttf +0 -0
  97. package/assets/fonts/TimesDigitalW04-BoldItalic.ttf +0 -0
  98. package/assets/fonts/TimesDigitalW04-BoldSC.ttf +0 -0
  99. package/assets/fonts/TimesDigitalW04-Italic.ttf +0 -0
  100. package/assets/fonts/TimesDigitalW04-Regular.ttf +0 -0
  101. package/assets/fonts/TimesDigitalW04-RegularSC.ttf +0 -0
  102. package/assets/fonts/TimesModern-Regular.otf +0 -0
  103. package/assets/fonts/attribuitions.mdx +35 -0
  104. package/assets/fonts/bitter-medium.woff +0 -0
  105. package/assets/fonts/bitter-medium.woff2 +0 -0
  106. package/assets/fonts/bitter-mediumitalic.woff +0 -0
  107. package/assets/fonts/bitter-mediumitalic.woff2 +0 -0
  108. package/assets/fonts/bitter-regular.woff +0 -0
  109. package/assets/fonts/bitter-regular.woff2 +0 -0
  110. package/assets/fonts/bitter-semibold.woff +0 -0
  111. package/assets/fonts/bitter-semibold.woff2 +0 -0
  112. package/assets/fonts/dmmono-medium.woff +0 -0
  113. package/assets/fonts/dmmono-medium.woff2 +0 -0
  114. package/assets/fonts/dmsans-bold-webfont.woff +0 -0
  115. package/assets/fonts/dmsans-bold-webfont.woff2 +0 -0
  116. package/assets/fonts/dmsans-bolditalic-webfont.woff +0 -0
  117. package/assets/fonts/dmsans-bolditalic-webfont.woff2 +0 -0
  118. package/assets/fonts/dmsans-italic-webfont.woff +0 -0
  119. package/assets/fonts/dmsans-italic-webfont.woff2 +0 -0
  120. package/assets/fonts/dmsans-medium-webfont.woff +0 -0
  121. package/assets/fonts/dmsans-medium-webfont.woff2 +0 -0
  122. package/assets/fonts/dmsans-mediumitalic-webfont.woff +0 -0
  123. package/assets/fonts/dmsans-mediumitalic-webfont.woff2 +0 -0
  124. package/assets/fonts/dmsans-regular-webfont.woff +0 -0
  125. package/assets/fonts/dmsans-regular-webfont.woff2 +0 -0
  126. package/assets/fonts/notosans-bold-webfont.woff +0 -0
  127. package/assets/fonts/notosans-bold-webfont.woff2 +0 -0
  128. package/assets/fonts/notosans-italic-webfont.woff +0 -0
  129. package/assets/fonts/notosans-italic-webfont.woff2 +0 -0
  130. package/assets/fonts/notosans-medium-webfont.woff +0 -0
  131. package/assets/fonts/notosans-medium-webfont.woff2 +0 -0
  132. package/assets/fonts/notosans-regular-webfont.woff +0 -0
  133. package/assets/fonts/notosans-regular-webfont.woff2 +0 -0
  134. package/assets/fonts/poppins-bold-webfont.woff +0 -0
  135. package/assets/fonts/poppins-bold-webfont.woff2 +0 -0
  136. package/assets/fonts/poppins-bolditalic-webfont.woff +0 -0
  137. package/assets/fonts/poppins-bolditalic-webfont.woff2 +0 -0
  138. package/assets/fonts/poppins-extrabold-webfont.woff +0 -0
  139. package/assets/fonts/poppins-extrabold-webfont.woff2 +0 -0
  140. package/assets/fonts/poppins-extrabolditalic-webfont.woff +0 -0
  141. package/assets/fonts/poppins-extrabolditalic-webfont.woff2 +0 -0
  142. package/assets/fonts/poppins-italic-webfont.woff +0 -0
  143. package/assets/fonts/poppins-italic-webfont.woff2 +0 -0
  144. package/assets/fonts/poppins-light-webfont.woff +0 -0
  145. package/assets/fonts/poppins-light-webfont.woff2 +0 -0
  146. package/assets/fonts/poppins-lightitalic-webfont.woff +0 -0
  147. package/assets/fonts/poppins-lightitalic-webfont.woff2 +0 -0
  148. package/assets/fonts/poppins-medium-webfont.woff +0 -0
  149. package/assets/fonts/poppins-medium-webfont.woff2 +0 -0
  150. package/assets/fonts/poppins-mediumitalic-webfont.woff +0 -0
  151. package/assets/fonts/poppins-mediumitalic-webfont.woff2 +0 -0
  152. package/assets/fonts/poppins-regular-webfont.woff +0 -0
  153. package/assets/fonts/poppins-regular-webfont.woff2 +0 -0
  154. package/assets/fonts/poppins-semibold-webfont.woff +0 -0
  155. package/assets/fonts/poppins-semibold-webfont.woff2 +0 -0
  156. package/assets/fonts/poppins-semibolditalic-webfont.woff +0 -0
  157. package/assets/fonts/poppins-semibolditalic-webfont.woff2 +0 -0
  158. package/assets/fonts/source-serif-pro-600.woff +0 -0
  159. package/assets/fonts/source-serif-pro-600.woff2 +0 -0
  160. package/assets/fonts/source-serif-pro-600italic.woff +0 -0
  161. package/assets/fonts/source-serif-pro-600italic.woff2 +0 -0
  162. package/assets/fonts/source-serif-pro-700.woff +0 -0
  163. package/assets/fonts/source-serif-pro-700.woff2 +0 -0
  164. package/assets/fonts/source-serif-pro-700italic.woff +0 -0
  165. package/assets/fonts/source-serif-pro-700italic.woff2 +0 -0
  166. package/assets/fonts/source-serif-pro-italic.woff +0 -0
  167. package/assets/fonts/source-serif-pro-italic.woff2 +0 -0
  168. package/assets/fonts/source-serif-pro-regular.woff +0 -0
  169. package/assets/fonts/source-serif-pro-regular.woff2 +0 -0
  170. package/components/AccountDropdown/AccountDropdown.tsx +65 -0
  171. package/components/AccountDropdown/__tests__/AcountDropdown.test.tsx +83 -0
  172. package/components/AccountDropdown/accounts.ts +47 -0
  173. package/components/AccountDropdown/index.tsx +2 -0
  174. package/components/AccountDropdown/utils.ts +21 -0
  175. package/components/ErrorPage/ErrorPage.tsx +135 -0
  176. package/components/ad/index.tsx +35 -0
  177. package/components/article/Highlights.tsx +77 -0
  178. package/components/article/MetaBox.tsx +50 -0
  179. package/components/article/RelatedArticles.tsx +53 -0
  180. package/components/article/RelatedTopics.tsx +59 -0
  181. package/components/article/ShareBarComponent.tsx +53 -0
  182. package/components/article/__tests__/__snapshots__/index.test.tsx.snap +1568 -0
  183. package/components/article/__tests__/index.test.tsx +171 -0
  184. package/components/article/__tests__/mocks.ts +105 -0
  185. package/components/article/index.tsx +320 -0
  186. package/components/common/BackToHomepage.tsx +37 -0
  187. package/components/common/NavLink.tsx +26 -0
  188. package/components/common/NewskitLogo.tsx +52 -0
  189. package/components/common/NewskitLogoShort.tsx +48 -0
  190. package/components/common/SectionTitleBar.tsx +57 -0
  191. package/components/common/ShareButton.tsx +18 -0
  192. package/components/common/ViewMoreButton.tsx +20 -0
  193. package/components/common/iconNavLink/IconNavLink.tsx +70 -0
  194. package/components/common/iconNavLink/__tests__/IconNavLink.test.tsx +35 -0
  195. package/components/common/iconNavLink/index.ts +3 -0
  196. package/components/common/iconNavLink/types.ts +24 -0
  197. package/components/common/icons/IconAccount.tsx +13 -0
  198. package/components/common/icons/IconFilledTwitter.tsx +14 -0
  199. package/components/common/icons/StyledIconFilledChevronRight.tsx +12 -0
  200. package/components/footer/__snapshots__/index.test.tsx.snap +192 -0
  201. package/components/footer/index.test.tsx +13 -0
  202. package/components/footer/index.tsx +151 -0
  203. package/components/header/banner-messages.ts +39 -0
  204. package/components/header/index.tsx +52 -0
  205. package/components/header/navigation-links.ts +20 -0
  206. package/components/layout/Gutter.tsx +11 -0
  207. package/components/layout/LayoutTemplate.tsx +26 -0
  208. package/components/layout/MainGrid.tsx +66 -0
  209. package/components/layout/index.tsx +3 -0
  210. package/components/layout/layoutTypes.ts +13 -0
  211. package/components/section/ArticleSlice.tsx +35 -0
  212. package/components/section/CollectionBlock.tsx +54 -0
  213. package/components/section/SectionContext.tsx +9 -0
  214. package/components/section/__tests__/ArticleSlice.test.tsx +128 -0
  215. package/components/section/__tests__/CollectionBlock.test.tsx +83 -0
  216. package/components/section/__tests__/pageBlock.test.tsx +24 -0
  217. package/components/section/__tests__/sectionUtils.test.ts +94 -0
  218. package/components/section/index.tsx +39 -0
  219. package/components/section/layouts/Block.tsx +79 -0
  220. package/components/section/layouts/FallBack.tsx +24 -0
  221. package/components/section/layouts/Lead.tsx +43 -0
  222. package/components/section/layouts/Rows.tsx +82 -0
  223. package/components/section/layouts/SectionTitle.tsx +57 -0
  224. package/components/section/layouts/__tests__/Lead.test.tsx +37 -0
  225. package/components/section/layouts/__tests__/Rows.test.tsx +40 -0
  226. package/components/section/layouts/__tests__/SectionTitle.test.tsx +37 -0
  227. package/components/section/layouts/__tests__/__snapshots__/Lead.test.tsx.snap +180 -0
  228. package/components/section/layouts/__tests__/__snapshots__/SectionTitle.test.tsx.snap +354 -0
  229. package/components/section/layouts/gridUtils.ts +21 -0
  230. package/components/section/layouts/index.tsx +4 -0
  231. package/components/section/layouts/types.ts +13 -0
  232. package/components/section/pageBlock.tsx +23 -0
  233. package/components/section/sectionUtils.ts +61 -0
  234. package/components/teaser/index.test.tsx +50 -0
  235. package/components/teaser/index.tsx +64 -0
  236. package/components/teaser/teaserVariants.ts +33 -0
  237. package/components/teaser/variant-types.ts +49 -0
  238. package/components/teaser/variants/featureVariant.ts +42 -0
  239. package/components/teaser/variants/horizontal.ts +14 -0
  240. package/components/teaser/variants/titleTeaserVariant.ts +32 -0
  241. package/components/teaser/variants/titleVertical.ts +24 -0
  242. package/components/utils/index.test.ts +12 -0
  243. package/components/utils/index.ts +6 -0
  244. package/config/__tests__/index.test.ts +54 -0
  245. package/config/environment.ts +80 -0
  246. package/config/index.ts +2 -0
  247. package/config/multiTenancy.ts +11 -0
  248. package/constants/index.ts +2 -0
  249. package/context/app-context/AppContext.test.tsx +56 -0
  250. package/context/app-context/holidayStopListContextOverrides.ts +18 -0
  251. package/context/app-context/index.tsx +34 -0
  252. package/context/app-context/paymentMethodContext.tsx +70 -0
  253. package/context/index.tsx +2 -0
  254. package/context/multi-tenancy/MultiTenancy.test.tsx +48 -0
  255. package/context/multi-tenancy/index.tsx +32 -0
  256. package/css/index.ts +15 -0
  257. package/cypress/axe/terminal-log.js +19 -0
  258. package/cypress/config/visual.config.ts +11 -0
  259. package/cypress/config/visual.skip.config.ts +10 -0
  260. package/cypress/e2e/account/accessibility.cy.js +88 -0
  261. package/cypress/e2e/account/banners.cy.js +169 -0
  262. package/cypress/e2e/account/cancellation.cy.js +219 -0
  263. package/cypress/e2e/account/holiday-stops.cy.js +109 -0
  264. package/cypress/e2e/account/main-api.cy.js +102 -0
  265. package/cypress/e2e/account/newsletters-and-alerts.cy.js +149 -0
  266. package/cypress/e2e/account/newsletters-page.cy.js +69 -0
  267. package/cypress/e2e/account/payment-page.cy.js +98 -0
  268. package/cypress/e2e/account/personal-details.cy.js +1161 -0
  269. package/cypress/e2e/account/subscription-and-billing.cy.js +434 -0
  270. package/cypress/e2e/checkout/account-creation.cy.js +8 -0
  271. package/cypress/e2e/checkout/payment-details.cy.js +19 -0
  272. package/cypress/e2e/core/home-page.cy.js +6 -0
  273. package/cypress/e2e/help-hub/accessibility.cy.js +35 -0
  274. package/cypress/e2e/help-hub/article-page.cy.js +115 -0
  275. package/cypress/e2e/help-hub/landing-page.cy.js +94 -0
  276. package/cypress/e2e/help-hub/result-page.cy.js +117 -0
  277. package/cypress/fixtures/empty.html +10 -0
  278. package/cypress/fixtures/example.json +5 -0
  279. package/cypress/fixtures/holiday-stops.json +40 -0
  280. package/cypress/fixtures/paymentFailure.js +24 -0
  281. package/cypress/fixtures/testDates.js +26 -0
  282. package/cypress/support/commands.js +125 -0
  283. package/cypress/support/consentValues.js +5839 -0
  284. package/cypress/support/e2e.js +22 -0
  285. package/cypress/support/users.js +58 -0
  286. package/cypress/visual/account/print-visual-regression.cy.js +9 -0
  287. package/cypress/visual/account/visual-regression.cy.js +40 -0
  288. package/cypress/visual/empty/empty.cy.js +5 -0
  289. package/cypress.config.ts +38 -0
  290. package/helpers/__tests__/getUser.test.ts +45 -0
  291. package/helpers/__tests__/logger.test.ts +62 -0
  292. package/helpers/__tests__/useThemeDropdownObject.test.ts +49 -0
  293. package/helpers/a11y.ts +7 -0
  294. package/helpers/addCacheHeaders.ts +8 -0
  295. package/helpers/getUser.ts +37 -0
  296. package/helpers/getYear.ts +1 -0
  297. package/helpers/global-types.ts +186 -0
  298. package/helpers/logger/getWinstonLogger.ts +19 -0
  299. package/helpers/logger/index.ts +20 -0
  300. package/helpers/logger/replaceConsoleWithLogger.ts +14 -0
  301. package/helpers/mocks/articleMock.ts +50 -0
  302. package/helpers/mocks/getPageMock.ts +369 -0
  303. package/helpers/mocks/getRadioPostMock.ts +71 -0
  304. package/helpers/mocks/getRadioPostsMock.ts +26 -0
  305. package/helpers/mocks/getRecommendationsMock.ts +20 -0
  306. package/helpers/mocks/index.ts +7 -0
  307. package/helpers/multiTenancy.ts +19 -0
  308. package/helpers/setupTests.ts +5 -0
  309. package/helpers/test-utils.tsx +33 -0
  310. package/helpers/useThemeDropdownObject.tsx +73 -0
  311. package/infrastructure/.circleci/config.yml +1187 -0
  312. package/infrastructure/INFRASTRUCTURE.md +142 -0
  313. package/infrastructure/build_and_deploy.png +0 -0
  314. package/infrastructure/helm/Chart.yaml +21 -0
  315. package/infrastructure/helm/templates/_helpers.tpl +87 -0
  316. package/infrastructure/helm/templates/deployment.yaml +45 -0
  317. package/infrastructure/helm/templates/horizontalpodautoscaler.yaml +21 -0
  318. package/infrastructure/helm/templates/ingress.yaml +31 -0
  319. package/infrastructure/helm/templates/networkpolicy.yaml +26 -0
  320. package/infrastructure/helm/templates/secret.yaml +12 -0
  321. package/infrastructure/helm/templates/service.yaml +15 -0
  322. package/infrastructure/helm/values-dev.yaml +39 -0
  323. package/infrastructure/helm/values-local.yaml +30 -0
  324. package/infrastructure/helm/values-pr.yaml +40 -0
  325. package/infrastructure/helm/values-prod.yaml +39 -0
  326. package/infrastructure/helm/values-staging.yaml +39 -0
  327. package/infrastructure/helm/values.yaml +44 -0
  328. package/infrastructure/pull_request.png +0 -0
  329. package/infrastructure/release-documentation-cli.config.json +18 -0
  330. package/infrastructure/remove_pr.png +0 -0
  331. package/infrastructure/terraform-ecr/dev.tfvars +3 -0
  332. package/infrastructure/terraform-ecr/ecr.tf +69 -0
  333. package/infrastructure/terraform-ecr/main.tf +3 -0
  334. package/infrastructure/terraform-ecr/variables.tf +19 -0
  335. package/infrastructure/terraform-ecr/versions.tf +12 -0
  336. package/infrastructure/terraform-newrelic/alerts.tf +290 -0
  337. package/infrastructure/terraform-newrelic/dashboards.tf +347 -0
  338. package/infrastructure/terraform-newrelic/dev.tfvars +3 -0
  339. package/infrastructure/terraform-newrelic/lighthouse-script-dev.js +53 -0
  340. package/infrastructure/terraform-newrelic/lighthouse-script-prod.js +54 -0
  341. package/infrastructure/terraform-newrelic/lighthouse-script-stage.js +54 -0
  342. package/infrastructure/terraform-newrelic/main.tf +11 -0
  343. package/infrastructure/terraform-newrelic/monitors.tf +11 -0
  344. package/infrastructure/terraform-newrelic/prod.tfvars +3 -0
  345. package/infrastructure/terraform-newrelic/staging.tfvars +3 -0
  346. package/infrastructure/terraform-newrelic/variables.tf +33 -0
  347. package/infrastructure/terraform-newrelic/versions.tf +18 -0
  348. package/jest.config.js +40 -0
  349. package/jest.config.pact.js +18 -0
  350. package/newrelic.js +86 -0
  351. package/next-env.d.ts +5 -0
  352. package/next.config.js +95 -0
  353. package/package.json +127 -0
  354. package/pages/_app.tsx +117 -0
  355. package/pages/_document.tsx +112 -0
  356. package/pages/_error.tsx +68 -0
  357. package/pages/account/add/[field].tsx +34 -0
  358. package/pages/account/cancellation/index.tsx +22 -0
  359. package/pages/account/delete/confirm/index.tsx +16 -0
  360. package/pages/account/delete/error/index.tsx +16 -0
  361. package/pages/account/delete/index.tsx +16 -0
  362. package/pages/account/delete/success/index.tsx +16 -0
  363. package/pages/account/dream-team/index.tsx +19 -0
  364. package/pages/account/edit/[field].tsx +45 -0
  365. package/pages/account/family/index.tsx +19 -0
  366. package/pages/account/holiday-stop/index.tsx +19 -0
  367. package/pages/account/holiday-stop/previous-holiday-stops.tsx +19 -0
  368. package/pages/account/holiday-stop/upcoming-holiday-stops.tsx +19 -0
  369. package/pages/account/index.tsx +33 -0
  370. package/pages/account/newsletters/index.tsx +19 -0
  371. package/pages/account/newsletters-and-alerts/index.tsx +24 -0
  372. package/pages/account/payment/[paymentMethod].tsx +37 -0
  373. package/pages/account/payment/index.tsx +23 -0
  374. package/pages/account/payment-methods/index.tsx +21 -0
  375. package/pages/account/subscription-and-billing/index.tsx +29 -0
  376. package/pages/api/account/get-session/index.ts +33 -0
  377. package/pages/api/account/invoice/index.ts +35 -0
  378. package/pages/api/account/mutate/index.ts +8 -0
  379. package/pages/api/account/query/index.ts +7 -0
  380. package/pages/api/auth/[...nextauth].ts +11 -0
  381. package/pages/api/competitions-sitemap.ts +19 -0
  382. package/pages/api/feed.ts +23 -0
  383. package/pages/api/health-check.ts +7 -0
  384. package/pages/api/news-sitemap.ts +18 -0
  385. package/pages/api/pages-sitemap.ts +27 -0
  386. package/pages/api/robots.ts +19 -0
  387. package/pages/api/sitemap.ts +24 -0
  388. package/pages/checkout/account-creation/index.tsx +13 -0
  389. package/pages/checkout/payment-details/index.tsx +10 -0
  390. package/pages/empty.tsx +6 -0
  391. package/pages/help-hub/article/[title]/index.tsx +25 -0
  392. package/pages/help-hub/error.tsx +23 -0
  393. package/pages/help-hub/index.tsx +51 -0
  394. package/pages/help-hub/results.tsx +25 -0
  395. package/pages/index.tsx +19 -0
  396. package/pages/player/brightcove.tsx +19 -0
  397. package/pages/rss/create/index.tsx +18 -0
  398. package/pages/rss/feed/[feedId]/index.tsx +21 -0
  399. package/pages/rss/index.tsx +18 -0
  400. package/public/ads.min.js +8175 -0
  401. package/public/assets/display-base-header.svg +25 -0
  402. package/public/assets/display-personalDetails-header-sun.svg +55 -0
  403. package/public/assets/display-personalDetails-header-times.svg +90 -0
  404. package/public/assets/display-personalDetails-header-vr.svg +46 -0
  405. package/public/assets/dream-team.svg +10 -0
  406. package/public/assets/navigationPrimary-brandMark-sun.svg +9 -0
  407. package/public/assets/navigationPrimary-brandMark-times.svg +18 -0
  408. package/public/assets/navigationPrimary-brandMark-vr.svg +10 -0
  409. package/public/assets/newsletters/bestoftimes-101.png +0 -0
  410. package/public/assets/newsletters/books-115.png +0 -0
  411. package/public/assets/newsletters/environment-140.png +0 -0
  412. package/public/assets/newsletters/fashion-108.png +0 -0
  413. package/public/assets/newsletters/food-106.png +0 -0
  414. package/public/assets/newsletters/football-111.png +0 -0
  415. package/public/assets/newsletters/ireland-152.png +0 -0
  416. package/public/assets/newsletters/law-121.png +0 -0
  417. package/public/assets/newsletters/money-107.png +0 -0
  418. package/public/assets/newsletters/moneymentor-150.png +0 -0
  419. package/public/assets/newsletters/placeholder.png +0 -0
  420. package/public/assets/newsletters/politics-119.png +0 -0
  421. package/public/assets/newsletters/property-113.png +0 -0
  422. package/public/assets/newsletters/puzzles-125.png +0 -0
  423. package/public/assets/newsletters/scotland-134.png +0 -0
  424. package/public/assets/newsletters/theatre-127.png +0 -0
  425. package/public/assets/newsletters/travel-149.png +0 -0
  426. package/public/assets/newsletters/tv-133.png +0 -0
  427. package/public/assets/newsletters/us-153.png +0 -0
  428. package/public/assets/no-subscription.svg +15 -0
  429. package/public/assets/pending-activation.svg +16 -0
  430. package/public/assets/personal-details-header.svg +91 -0
  431. package/public/assets/plchldr150x100.png +0 -0
  432. package/public/assets/previous-subscription.svg +15 -0
  433. package/public/assets/primary-navigation-logo-white.svg +6 -0
  434. package/public/assets/primary-navigation-logo.svg +6 -0
  435. package/public/assets/tls-logo-white.svg +3 -0
  436. package/public/favicon.ico +0 -0
  437. package/public/icon.png +0 -0
  438. package/public/prebid.min.js +1 -0
  439. package/queries/getPage.ts +100 -0
  440. package/queries/getRadioPost.ts +61 -0
  441. package/queries/getRadioPosts.ts +16 -0
  442. package/queries/getUserSubscription.ts +9 -0
  443. package/queries/index.ts +3 -0
  444. package/scripts/k8s-local.sh +137 -0
  445. package/scripts/nr-exports.sh +7 -0
  446. package/temp/_app.tsx +15 -0
  447. package/temp/_document.tsx +61 -0
  448. package/temp/app-context-test.tsx +51 -0
  449. package/temp/app-context.tsx +25 -0
  450. package/temp/config-index.ts +1 -0
  451. package/temp/context-index.tsx +1 -0
  452. package/temp/header.tsx +45 -0
  453. package/temp/next.config.js +56 -0
  454. package/tsconfig.json +51 -0
  455. package/tsconfig.test.json +6 -0
  456. package/validation/index.tsx +24 -0
@@ -0,0 +1,1187 @@
1
+ version: 2.1
2
+
3
+ parameters:
4
+ run_build_workflow:
5
+ type: boolean
6
+ default: true
7
+ run_deploy_to_dev_workflow:
8
+ type: boolean
9
+ default: false
10
+ run_deploy_to_staging_workflow:
11
+ type: boolean
12
+ default: false
13
+ run_deploy_to_prod_workflow:
14
+ type: boolean
15
+ default: false
16
+
17
+ orbs:
18
+ slack: circleci/slack@3.4.2
19
+ browser-tools: circleci/browser-tools@1.3.0
20
+ release-api: nukengprod/release-api@0.5.8
21
+ aws-cli: circleci/aws-cli@3.1
22
+
23
+ executors:
24
+ helm:
25
+ docker:
26
+ - image: nukengprodservice/helm:0.1.181
27
+ auth:
28
+ username: ${DOCKER_USERNAME}
29
+ password: ${DOCKER_PASSWORD}
30
+ resource_class: xlarge
31
+
32
+ node:
33
+ docker:
34
+ - image: cimg/node:18.17.0-browsers
35
+ auth:
36
+ username: ${DOCKER_USERNAME}
37
+ password: ${DOCKER_PASSWORD}
38
+ resource_class: xlarge
39
+
40
+ terraform:
41
+ docker:
42
+ - image: hashicorp/terraform:1.3.9
43
+ auth:
44
+ username: ${DOCKER_USERNAME}
45
+ password: ${DOCKER_PASSWORD}
46
+ resource_class: xlarge
47
+
48
+ commands:
49
+ aws_assume_role:
50
+ description: Assume AWS role
51
+ parameters:
52
+ aws_access_key_id:
53
+ description: AWS Access Key Id
54
+ type: string
55
+ default: '${AWS_ACCESS_KEY_ID}'
56
+ aws_secret_key:
57
+ description: AWS Secret Key
58
+ type: string
59
+ default: '${AWS_SECRET_ACCESS_KEY}'
60
+ aws_assume_role_arn:
61
+ description: AWS ARN For Assume Role
62
+ type: string
63
+ default: '${AWS_ASSUME_ROLE_ARN}'
64
+ aws_region:
65
+ description: AWS region
66
+ type: string
67
+ default: 'eu-west-1'
68
+ job_type:
69
+ description: The job type to be used
70
+ type: string
71
+ default: 'default'
72
+ eks_cluster:
73
+ description: EKS cluster for kubeconfig
74
+ type: string
75
+ default: '${AWS_EKS_CLUSTER}'
76
+ update_kubeconfig:
77
+ description: Whether to create a kubeconfig
78
+ type: boolean
79
+ default: false
80
+ steps:
81
+ - run:
82
+ name: Assume AWS role
83
+ command: |
84
+ export AWS_ACCESS_KEY_ID=<< parameters.aws_access_key_id >>
85
+ export AWS_SECRET_ACCESS_KEY=<< parameters.aws_secret_key >>
86
+ export temp_role=$(aws sts assume-role \
87
+ --role-arn "<< parameters.aws_assume_role_arn >>" \
88
+ --role-session-name "circle-ci-assume")
89
+ export AWS_ACCESS_KEY_ID_TEMP=$(echo $temp_role | jq .Credentials.AccessKeyId | xargs)
90
+ export AWS_SECRET_ACCESS_KEY_TEMP=$(echo $temp_role | jq .Credentials.SecretAccessKey | xargs)
91
+ export AWS_SESSION_TOKEN_TEMP=$(echo $temp_role | jq .Credentials.SessionToken | xargs)
92
+ echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID_TEMP" >> $BASH_ENV
93
+ echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_TEMP" >> $BASH_ENV
94
+ echo "export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN_TEMP" >> $BASH_ENV
95
+ source $BASH_ENV
96
+ cat $BASH_ENV | grep AWS_ACCESS_KEY_ID >> assume_role_creds_<< parameters.job_type >>.txt
97
+ cat $BASH_ENV | grep AWS_SECRET_ACCESS_KEY >> assume_role_creds_<< parameters.job_type >>.txt
98
+ cat $BASH_ENV | grep AWS_SESSION_TOKEN >> assume_role_creds_<< parameters.job_type >>.txt
99
+ - when:
100
+ condition: << parameters.update_kubeconfig >>
101
+ steps:
102
+ - run:
103
+ name: Update kubeconfig clustername
104
+ command: aws --region << parameters.aws_region >> eks update-kubeconfig --name << parameters.eks_cluster >>
105
+ - run:
106
+ name: Update kubectl credentials
107
+ command: cp ~/.kube/config kube_<< parameters.job_type >>.config
108
+ - persist_to_workspace:
109
+ root: ./
110
+ paths:
111
+ - assume_role_creds_<< parameters.job_type >>.txt
112
+ - kube_<< parameters.job_type >>.config
113
+
114
+ aws_assume_role_file:
115
+ description: Assume AWS role from the workspace file
116
+ parameters:
117
+ job_type:
118
+ description: The job type to be used
119
+ type: string
120
+ default: 'default'
121
+ steps:
122
+ - run:
123
+ name: Assume role from file
124
+ command: |
125
+ cat assume_role_creds_<< parameters.job_type >>.txt >> $BASH_ENV
126
+ source $BASH_ENV
127
+
128
+ terraform_init:
129
+ description: Run Terraform Init
130
+ parameters:
131
+ path:
132
+ type: string
133
+ terraform_arg:
134
+ description: provide terraform arguments
135
+ type: string
136
+ default: ''
137
+ steps:
138
+ - run:
139
+ name: Terraform init
140
+ command: |
141
+ source $BASH_ENV
142
+ cd << parameters.path >>
143
+ terraform init << parameters.terraform_arg >>
144
+
145
+ terraform_plan:
146
+ description: Run Terraform Plan
147
+ parameters:
148
+ path:
149
+ type: string
150
+ terraform_arg:
151
+ description: provide terraform arguments
152
+ type: string
153
+ default: ''
154
+ steps:
155
+ - run:
156
+ name: Terraform plan
157
+ command: |
158
+ source $BASH_ENV
159
+ cd << parameters.path >>
160
+ terraform plan -out=tfplan -input=false << parameters.terraform_arg >>
161
+
162
+ terraform_apply:
163
+ description: Run Terraform Apply
164
+ parameters:
165
+ path:
166
+ type: string
167
+ steps:
168
+ - run:
169
+ name: Terraform apply
170
+ command: |
171
+ source $BASH_ENV
172
+ cd << parameters.path >>
173
+ terraform apply -input=false tfplan
174
+
175
+ terraform_force_apply:
176
+ description: Run Terraform Apply
177
+ parameters:
178
+ path:
179
+ type: string
180
+ steps:
181
+ - run:
182
+ name: Terraform forced apply
183
+ command: |
184
+ source $BASH_ENV
185
+ cd << parameters.path >>
186
+ terraform apply -auto-approve
187
+
188
+ git_config_user:
189
+ description: Configure git user
190
+ parameters:
191
+ user:
192
+ type: string
193
+ default: ${GIT_USERNAME}
194
+ email:
195
+ type: string
196
+ default: '${GIT_EMAIL}'
197
+ steps:
198
+ - run:
199
+ name: Configure git user
200
+ command: |
201
+ git config --global user.email "<< parameters.email >>"
202
+ git config --global user.name "<< parameters.user >>"
203
+
204
+ # This job relies on working with Pull Requests
205
+ set_helm_environment:
206
+ description: 'Set environment variables for helm'
207
+ parameters:
208
+ environment:
209
+ type: string
210
+ release:
211
+ description: Helm release name i.e ncu-newskit-render
212
+ type: string
213
+ default: <% HELM_RELEASE_NAME >
214
+ namespace:
215
+ description: Kubernetes namespace
216
+ type: string
217
+ node_env:
218
+ description: Node environment name
219
+ type: string
220
+ default: production
221
+ steps:
222
+ - run:
223
+ name: 'Set environment variables for helm'
224
+ command: |
225
+ export PKG_VERSION=$(jq -r .version package.json)
226
+ echo "export PKG_VERSION=$PKG_VERSION" >> $BASH_ENV
227
+ echo 'export KUBECONFIG=$(pwd)/kube_eks_<< parameters.environment >>.config' >> $BASH_ENV
228
+ echo 'export HELM_OPT_NAMESPACE="-n << parameters.namespace >>"' >> $BASH_ENV
229
+ echo 'export HELM_VAL_ENV=<< parameters.environment >>' >> $BASH_ENV
230
+ echo 'export NODE_ENV=<< parameters.node_env >>' >> $BASH_ENV
231
+ if [ -n "$CIRCLE_PULL_REQUEST" ]; then
232
+ export PR_NUMBER=$(echo ${CIRCLE_PULL_REQUEST} |rev | cut -d "/" -f1 |rev)
233
+ echo "export PR_NUMBER=$PR_NUMBER" >> $BASH_ENV
234
+ echo 'export HELM_OPT_SET="--set alb.prSuffix=pr-$PR_NUMBER"' >> $BASH_ENV
235
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set image.tag=PR-$PR_NUMBER "' >> $BASH_ENV
236
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.NEWSKIT_API_X_API_KEY=${NEWSKIT_API_X_API_KEY}"' >> $BASH_ENV
237
+ echo 'export HELM_NAME="<< parameters.release >>-pr$PR_NUMBER"' >> $BASH_ENV
238
+ else
239
+ export PR_NUMBER=$(git log --format=%B -n 1 HEAD | grep -oE -m 1 '\(#[0-9]+\)' | grep -oE '[0-9]+')
240
+ echo "export PR_NUMBER=$PR_NUMBER" >> $BASH_ENV
241
+ echo 'export HELM_OPT_SET="--set image.tag=$PKG_VERSION "' >> $BASH_ENV
242
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.NEWSKIT_API_X_API_KEY=${NEWSKIT_API_X_API_KEY}"' >> $BASH_ENV
243
+ if [ "<< parameters.environment >>" = pr ]; then
244
+ echo 'export HELM_NAME="<< parameters.release >>-pr$PR_NUMBER"' >> $BASH_ENV
245
+ else
246
+ echo 'export HELM_NAME="<< parameters.release >>"' >> $BASH_ENV
247
+ fi
248
+ fi
249
+
250
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.SOURCEPOINT_ACCOUNT_ID=${SOURCEPOINT_ACCOUNT_ID}"' >> $BASH_ENV
251
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.SOURCEPOINT_PROPERTY_HREF=${SOURCEPOINT_PROPERTY_HREF}"' >> $BASH_ENV
252
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.SOURCEPOINT_PROPERTY_ID=${SOURCEPOINT_PROPERTY_ID}"' >> $BASH_ENV
253
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.EXPERIMENTATION_WEB=${EXPERIMENTATION_WEB}"' >> $BASH_ENV
254
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.TEALIUM_ACCOUNT_ID=${TEALIUM_ACCOUNT_ID}"' >> $BASH_ENV
255
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.TEALIUM_PROFILE_ID=${TEALIUM_PROFILE_ID}"' >> $BASH_ENV
256
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set envs.TEALIUM_ENV=${TEALIUM_ENV}"' >> $BASH_ENV
257
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}"' >> $BASH_ENV
258
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ACCOUNT_PROVIDER_GRAPHQL_URL=${ACCOUNT_PROVIDER_GRAPHQL_URL}"' >> $BASH_ENV
259
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ACCOUNT_PROVIDER_INTERNAL_AUTH0_DOMAIN=${ACCOUNT_PROVIDER_INTERNAL_AUTH0_DOMAIN}"' >> $BASH_ENV
260
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ACCOUNT_PROVIDER_INTERNAL_CONNECTION=${ACCOUNT_PROVIDER_INTERNAL_CONNECTION}"' >> $BASH_ENV
261
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ACCOUNT_PROVIDER_INTERNAL_CLIENT_ID=${ACCOUNT_PROVIDER_INTERNAL_CLIENT_ID}"' >> $BASH_ENV
262
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.STRIPE_KEY=${STRIPE_KEY}"' >> $BASH_ENV
263
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.LOQACCOUNT_KEY=${LOQACCOUNT_KEY}"' >> $BASH_ENV
264
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.OKTA_CLIENT_ID=${OKTA_CLIENT_ID}"' >> $BASH_ENV
265
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.OKTA_CLIENT_SECRET=${OKTA_CLIENT_SECRET}"' >> $BASH_ENV
266
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.OKTA_DOMAIN=${OKTA_DOMAIN}"' >> $BASH_ENV
267
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.NEXTAUTH_URL=${NEXTAUTH_URL}"' >> $BASH_ENV
268
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.NEXTAUTH_SECRET=${NEXTAUTH_SECRET}"' >> $BASH_ENV
269
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.SN_PASSWORD=${SN_PASSWORD}"' >> $BASH_ENV
270
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.SN_USERNAME=${SN_USERNAME}"' >> $BASH_ENV
271
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.SN_ENVIRONMENT=${SN_ENVIRONMENT}"' >> $BASH_ENV
272
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ZUORA_PAGE_ID=${ZUORA_PAGE_ID}"' >> $BASH_ENV
273
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.ZUORA_RSA_SIGNATURE_URI=${ZUORA_RSA_SIGNATURE_URI}"' >> $BASH_ENV
274
+ echo 'export HELM_OPT_SET="$HELM_OPT_SET --set secret.items.OPTIMIZELY_SDK_KEY=${OPTIMIZELY_SDK_KEY}"' >> $BASH_ENV
275
+ echo 'export HELM_PATH="helm"' >> $BASH_ENV
276
+ echo 'export HELM_VALUES="--values $HELM_PATH/values-$HELM_VAL_ENV.yaml"' >> $BASH_ENV
277
+ echo 'export HELM_INSTALL="helm install --atomic $HELM_VALUES $HELM_OPT_SET $HELM_OPT_NAMESPACE"' >> $BASH_ENV
278
+ echo 'export HELM_UNINSTALL="helm uninstall $HELM_OPT_NAMESPACE"' >> $BASH_ENV
279
+ echo 'export HELM_LIST="helm list $HELM_OPT_NAMESPACE"' >> $BASH_ENV
280
+ echo 'export HELM_LIST_ALL="$HELM_LIST --all --short"' >> $BASH_ENV
281
+ echo 'export HELM_UPGRADE="helm upgrade --atomic $HELM_VALUES $HELM_OPT_SET $HELM_OPT_NAMESPACE"' >> $BASH_ENV
282
+
283
+ jobs:
284
+ init_aws:
285
+ parameters:
286
+ aws_access_key_id:
287
+ description: AWS Access Key Id
288
+ type: string
289
+ default: '${AWS_ACCESS_KEY_ID}'
290
+ aws_secret_key:
291
+ description: AWS Secret Key
292
+ type: string
293
+ default: '${AWS_SECRET_ACCESS_KEY}'
294
+ aws_assume_role_arn:
295
+ description: AWS ARN For Assume Role
296
+ type: string
297
+ default: '${AWS_ASSUME_ROLE_ARN}'
298
+ job_type:
299
+ type: string
300
+ default: 'default'
301
+ update_kubeconfig:
302
+ type: boolean
303
+ default: true
304
+ working_directory: ~/project
305
+ executor: helm
306
+ steps:
307
+ - run:
308
+ name: Install openssh client
309
+ command: apk add openssh-client
310
+ - checkout
311
+ - aws_assume_role:
312
+ aws_access_key_id: << parameters.aws_access_key_id >>
313
+ aws_secret_key: << parameters.aws_secret_key >>
314
+ aws_assume_role_arn: << parameters.aws_assume_role_arn >>
315
+ job_type: << parameters.job_type >>
316
+ update_kubeconfig: << parameters.update_kubeconfig >>
317
+ init_aws_oidc:
318
+ parameters:
319
+ aws_oidc_role_arn:
320
+ description: AWS Access Key Id
321
+ type: string
322
+ default: ${AWS_OIDC_ROLE_ARN_ECR}
323
+ job_type:
324
+ type: string
325
+ default: 'default'
326
+ executor: aws-cli/default
327
+ working_directory: ~/project
328
+ steps:
329
+ - checkout
330
+ - aws-cli/setup:
331
+ profile-name: cci-ecr
332
+ role-arn: << parameters.aws_oidc_role_arn >>
333
+ role-session-name: cci-ecr-session
334
+ - run:
335
+ name: save to file
336
+ command: |
337
+ source $BASH_ENV
338
+ cat $BASH_ENV | grep AWS_ACCESS_KEY_ID >> assume_role_creds_<< parameters.job_type >>.txt
339
+ cat $BASH_ENV | grep AWS_SECRET_ACCESS_KEY >> assume_role_creds_<< parameters.job_type >>.txt
340
+ cat $BASH_ENV | grep AWS_SESSION_TOKEN >> assume_role_creds_<< parameters.job_type >>.txt
341
+ - persist_to_workspace:
342
+ root: ./
343
+ paths:
344
+ - assume_role_creds_<< parameters.job_type >>.txt
345
+
346
+ deploy_terraform:
347
+ parameters:
348
+ team:
349
+ description: Used to generate the S3 bucket key i.e. product-platforms
350
+ type: string
351
+ default: <% TEAM >
352
+ project:
353
+ description: Used to generate the S3 bucket key i.e. ncu-newskit-render
354
+ type: string
355
+ folder:
356
+ description: Used to generate the S3 bucket key and navigate to terraform folder i.e. infrastructure-ecr
357
+ type: string
358
+ environment:
359
+ type: string
360
+ default: dev
361
+ apply:
362
+ type: boolean
363
+ default: false
364
+ working_directory: ~/project
365
+ executor: terraform
366
+ steps:
367
+ - checkout
368
+ - attach_workspace:
369
+ at: ~/project
370
+ - aws_assume_role_file
371
+ - terraform_init:
372
+ path: << parameters.folder >>
373
+ terraform_arg: -backend-config="key=<<parameters.team >>/<< parameters.project >>/<< parameters.folder >>/<< parameters.environment >>/terraform.tfstate"
374
+ - terraform_plan:
375
+ path: << parameters.folder >>
376
+ terraform_arg: -var-file=<< parameters.environment >>.tfvars
377
+ - when:
378
+ condition: << parameters.apply >>
379
+ steps:
380
+ - terraform_apply:
381
+ path: << parameters.folder >>
382
+
383
+ install_deps:
384
+ working_directory: ~/project
385
+ executor: node
386
+ steps:
387
+ - checkout
388
+ - restore_cache:
389
+ keys:
390
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
391
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-
392
+ - restore_cache:
393
+ keys:
394
+ - cypress-{{ .Environment.CYPRESS_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
395
+ - run:
396
+ name: 'Install dependencies'
397
+ command: <% PACKAGE_INSTALL >
398
+ - run:
399
+ name: 'Build the project'
400
+ command: <% PACKAGE_RUN > build
401
+ - save_cache:
402
+ key: <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
403
+ paths:
404
+ - ~/.cache/yarn
405
+ - ~/.npm
406
+ - node_modules
407
+ - .next/cache
408
+ - save_cache:
409
+ key: cypress-{{ .Environment.CYPRESS_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
410
+ paths:
411
+ - ~/.cache/Cypress
412
+ - persist_to_workspace:
413
+ root: ./
414
+ paths: .next
415
+
416
+ lint:
417
+ executor: node
418
+ steps:
419
+ - checkout
420
+ - attach_workspace:
421
+ at: ~/project
422
+ - restore_cache:
423
+ keys:
424
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
425
+ - run:
426
+ name: 'Run lint'
427
+ command: <% PACKAGE_RUN > lint
428
+
429
+ test_unit:
430
+ executor: node
431
+ steps:
432
+ - checkout
433
+ - attach_workspace:
434
+ at: ~/project
435
+ - restore_cache:
436
+ keys:
437
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
438
+ - run:
439
+ name: 'Run tests'
440
+ command: |
441
+ mkdir tests
442
+ <% PACKAGE_RUN > test:unit:ci
443
+ environment:
444
+ JEST_JUNIT_OUTPUT_DIR: /home/circleci/project/tests
445
+ - store_test_results:
446
+ path: tests
447
+ - store_artifacts:
448
+ path: tests
449
+ destination: tests
450
+
451
+ e2e_test:
452
+ executor: node
453
+ steps:
454
+ - checkout
455
+ - attach_workspace:
456
+ at: ~/project
457
+ - restore_cache:
458
+ keys:
459
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
460
+ - restore_cache:
461
+ keys:
462
+ - cypress-{{ .Environment.CYPRESS_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
463
+ - run:
464
+ name: 'Export Newskit API variables'
465
+ command: |
466
+ echo "export NEWSKIT_API_X_API_KEY=$NEWSKIT_API_X_API_KEY" >> $BASH_ENV
467
+ echo "export NEWSKIT_API_ENV_URL=$NEWSKIT_API_ENV_URL" >> $BASH_ENV
468
+ - run:
469
+ name: 'install cypress dependencies'
470
+ command: |
471
+ sudo apt-get update
472
+ sudo apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb
473
+ - browser-tools/install-chrome
474
+ - browser-tools/install-chromedriver
475
+ - run:
476
+ name: Check chrome install
477
+ command: |
478
+ google-chrome --version
479
+ chromedriver --version
480
+ - run:
481
+ name: 'start server'
482
+ command: |
483
+ yarn start:test:server
484
+ background: true
485
+ - run:
486
+ name: 'Wait test server'
487
+ command: |
488
+ yarn wait:server
489
+ - run:
490
+ name: 'Run e2e tests'
491
+ command: |
492
+ <% PACKAGE_RUN > test:e2e
493
+ - store_artifacts:
494
+ path: cypress/screenshots
495
+ - store_artifacts:
496
+ path: cypress/videos
497
+
498
+ publish_docker:
499
+ parameters:
500
+ project:
501
+ description: Project name that will be used to tag docker images i.e ncu-newskit-render
502
+ type: string
503
+ default: <% PROJECT_NAME >
504
+ dockerfile:
505
+ type: string
506
+ default: "Dockerfile.withNewRelic"
507
+ working_directory: ~/project
508
+ executor: node
509
+ steps:
510
+ - checkout
511
+ - attach_workspace:
512
+ at: ~/project
513
+ - restore_cache:
514
+ keys:
515
+ - <% PACKAGE_MANAGER >-build-{{ .Environment.BUILD_CACHE_VERSION }}-{{ checksum "<% PACKAGE_MANAGER_LOCK_FILE >" }}
516
+ - setup_remote_docker
517
+ - run:
518
+ name: Install aws cli
519
+ command: |
520
+ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 4EB27DB2A3B88B8B
521
+ sudo apt-get update
522
+ sudo apt-get install python-is-python3 python3-pip
523
+ sudo pip install awscli
524
+ - aws_assume_role_file
525
+ - run:
526
+ name: Publish Docker containers to AWS ECR
527
+ command: |
528
+ if [ -n "$CIRCLE_PULL_REQUEST" ]; then
529
+ export PR_NUMBER=$(echo ${CIRCLE_PULL_REQUEST} |rev | cut -d "/" -f1 |rev)
530
+ TAGS="PR-$PR_NUMBER"
531
+ else
532
+ TAG_VERSION=$(jq -r .version package.json)
533
+ TAGS="$TAG_VERSION latest"
534
+ fi
535
+ DOCKER_REGISTRY_URL="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com"
536
+
537
+ <% PACKAGE_DOCKER_BUILD >
538
+
539
+ echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
540
+ docker build -f << parameters.dockerfile >> -t << parameters.project >> .
541
+ $(aws ecr get-login --no-include-email)
542
+ for tag in $TAGS; do
543
+ docker tag << parameters.project >> $DOCKER_REGISTRY_URL/<< parameters.project >>:$tag;
544
+ docker push $DOCKER_REGISTRY_URL/<< parameters.project >>:$tag;
545
+ done
546
+
547
+ uninstall_helm:
548
+ parameters:
549
+ environment:
550
+ description: Environment name
551
+ type: string
552
+ release:
553
+ description: Helm release name i.e ncu-newskit-render
554
+ type: string
555
+ default: <% HELM_RELEASE_NAME >
556
+ namespace:
557
+ description: Kubernetes namespace without environment suffix
558
+ type: string
559
+ default: <% K8S_NAMESPACE >
560
+ working_directory: ~/project
561
+ executor: helm
562
+ steps:
563
+ - run:
564
+ name: Install ssh client
565
+ command: apk add openssh-client
566
+ - checkout
567
+ - attach_workspace:
568
+ at: ~/project
569
+ - aws_assume_role_file:
570
+ job_type: eks_<< parameters.environment >>
571
+ - set_helm_environment:
572
+ environment: << parameters.environment >>
573
+ release: << parameters.release >>
574
+ namespace: << parameters.namespace>>-<< parameters.environment >>
575
+ - run:
576
+ name: Helm uninstall
577
+ command: |
578
+ source $BASH_ENV
579
+ if $HELM_LIST | grep -q $HELM_NAME; then $HELM_UNINSTALL $HELM_NAME; fi
580
+
581
+ remove_all_pr_environments:
582
+ parameters:
583
+ namespace:
584
+ description: Kubernetes namespace without environment suffix
585
+ type: string
586
+ default: <% K8S_NAMESPACE >
587
+ working_directory: ~/project
588
+ executor: helm
589
+ steps:
590
+ - run:
591
+ name: Install ssh client
592
+ command: apk add openssh-client
593
+ - checkout
594
+ - attach_workspace:
595
+ at: ~/project
596
+ - aws_assume_role_file:
597
+ job_type: eks_pr
598
+ - set_helm_environment:
599
+ environment: pr
600
+ namespace: << parameters.namespace>>-pr
601
+ - run:
602
+ name: Remove all PR environments
603
+ command: |
604
+ source $BASH_ENV
605
+ if [ -n "$($HELM_LIST_ALL)" ]; then $HELM_LIST_ALL | xargs $HELM_UNINSTALL; fi
606
+
607
+ upgrade_helm:
608
+ parameters:
609
+ environment:
610
+ description: Environment name
611
+ type: string
612
+ node_env:
613
+ description: Node environment name
614
+ type: string
615
+ default: production
616
+ create:
617
+ description: Whether to create a new Helm package
618
+ type: boolean
619
+ default: false
620
+ release:
621
+ description: Helm release name i.e ncu-newskit-render
622
+ type: string
623
+ default: <% HELM_RELEASE_NAME >
624
+ helm_repo:
625
+ description: Helm S3 repo url
626
+ type: string
627
+ default: s3://<% HELM_BUCKET_NAME >
628
+ namespace:
629
+ description: Kubernetes namespace without environment suffix
630
+ type: string
631
+ default: <% K8S_NAMESPACE >
632
+ working_directory: ~/project
633
+ executor: helm
634
+ steps:
635
+ - run:
636
+ name: Install ssh client
637
+ command: apk add openssh-client
638
+ - checkout
639
+ - attach_workspace:
640
+ at: ~/project
641
+ - set_helm_environment:
642
+ environment: << parameters.environment >>
643
+ node_env: << parameters.node_env >>
644
+ release: << parameters.release >>
645
+ namespace: << parameters.namespace >>-<< parameters.environment >>
646
+ - run:
647
+ name: Install helm s3 plugin
648
+ command: helm plugin install https://github.com/hypnoglow/helm-s3.git
649
+ - aws_assume_role_file
650
+ - when:
651
+ condition: << parameters.create >>
652
+ steps:
653
+ - run:
654
+ name: Helm package and upload
655
+ command: |
656
+ source $BASH_ENV
657
+ export HELM_S3_MODE=3
658
+ if ! aws s3 ls << parameters.helm_repo >>/<< parameters.release >>/ | grep index.yaml; then
659
+ helm s3 init << parameters.helm_repo >>/<< parameters.release >>
660
+ else
661
+ echo "Repo already initialized";
662
+ fi
663
+ helm repo add << parameters.release >> << parameters.helm_repo >>/<< parameters.release >>
664
+ helm package -u --version $PKG_VERSION --app-version $PKG_VERSION $HELM_PATH;
665
+ mv << parameters.release >>-*.tgz << parameters.release >>-$PKG_VERSION.tgz;
666
+ if [ "$HELM_VAL_ENV" != "pr" ]; then
667
+ helm s3 push --force ./<< parameters.release >>-$PKG_VERSION.tgz << parameters.release >>;
668
+ fi
669
+ - unless:
670
+ condition: << parameters.create >>
671
+ steps:
672
+ - run:
673
+ name: Download helm chart
674
+ command: |
675
+ source $BASH_ENV
676
+ helm repo add << parameters.release >> << parameters.helm_repo >>/<< parameters.release >>
677
+ helm pull << parameters.release >>/<< parameters.release >> --version $PKG_VERSION;
678
+
679
+ - aws_assume_role_file:
680
+ job_type: eks_<< parameters.environment >>
681
+ - run:
682
+ name: Helm deploy
683
+ command: |
684
+ source $BASH_ENV
685
+ $HELM_UPGRADE --install $HELM_NAME << parameters.release >>-*.tgz --version $PKG_VERSION
686
+ - when:
687
+ condition:
688
+ and:
689
+ - not:
690
+ equal: [pr, << parameters.environment >>]
691
+ steps:
692
+ - run:
693
+ name: Add Deployment Marker to New Relic
694
+ command: |
695
+ CURRENT_VERSION=$(jq -r .version ./package.json)
696
+ APP_ID=$(curl -s -X GET "https://api.newrelic.com/v2/applications.json" -H "X-Api-Key:${TF_VAR_newrelic_api_key}" -G -d "filter[name]=<% PROJECT_PREFIX >:<% PROJECT_NAME >:<< parameters.environment >>" | jq -r '.applications[]' | jq -r '.id')
697
+ curl -X POST "https://api.newrelic.com/v2/applications/$APP_ID/deployments.json" -H "Api-Key:${TF_VAR_newrelic_api_key}" -i -H "Content-Type: application/json" -d '{ "deployment": { "revision": "'$CURRENT_VERSION'" } }'
698
+
699
+ bump_version:
700
+ executor: node
701
+ working_directory: ~/project
702
+ steps:
703
+ - add_ssh_keys:
704
+ fingerprints:
705
+ - '<% SSH_KEY >'
706
+ - checkout
707
+ - attach_workspace:
708
+ at: ~/project
709
+ - git_config_user
710
+ - run:
711
+ name: Run standard-version
712
+ command: |
713
+ npx standard-version --releaseCommitMessageFormat='chore(release): {{currentTag}} [ci skip]'
714
+ git push --follow-tags origin master
715
+ - persist_to_workspace:
716
+ root: ./
717
+ paths:
718
+ - package.json
719
+
720
+ add_github_comment:
721
+ executor: node
722
+ steps:
723
+ - run:
724
+ name: Post a comment to GitHub
725
+ command: |
726
+ PR_RESPONSE=$(curl --location --request GET "https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls?head=$CIRCLE_PROJECT_USERNAME:$CIRCLE_BRANCH&state=open" \
727
+ -u $GIT_USERNAME:$GIT_ACCESS_TOKEN)
728
+
729
+ if [ $(echo $PR_RESPONSE | jq length) -eq 0 ]; then
730
+ echo "No PR found to update"
731
+ else
732
+ PR_COMMENT_URL=$(echo $PR_RESPONSE | jq -r ".[]._links.comments.href")
733
+ PR_NUMBER=$(echo ${CIRCLE_PULL_REQUEST##*/})
734
+ fi
735
+ curl --location --request POST "$PR_COMMENT_URL" \
736
+ -u $GIT_USERNAME:$GIT_ACCESS_TOKEN \
737
+ --header 'Content-Type: application/json' \
738
+ --data-raw '{
739
+ "body": "This PR has been automatically deployed [here]('https://pr-${PR_NUMBER}-<% PROJECT_NAME >.ceng-dev.newsuk.tech')."
740
+ }'
741
+
742
+ slack_deploy_approval:
743
+ parameters:
744
+ approval:
745
+ type: boolean
746
+ default: false
747
+ version:
748
+ type: string
749
+ default: ${CIRCLE_TAG}
750
+ package_name:
751
+ type: string
752
+ default: <% PROJECT_NAME >
753
+ environment:
754
+ type: string
755
+ executor: node
756
+ steps:
757
+ - checkout
758
+ - attach_workspace:
759
+ at: ~/project
760
+ - when:
761
+ condition: << parameters.approval >>
762
+ steps:
763
+ - slack/approval:
764
+ message: 'Deployment of << parameters.package_name >>@<< parameters.version >> to << parameters.environment >> requires approval'
765
+ webhook: ${SLACK_CIRCLECI_DEPLOYMENTS_WEBHOOK}
766
+ color: '#32a852'
767
+ - unless:
768
+ condition: << parameters.approval >>
769
+ steps:
770
+ - slack/approval:
771
+ message: '<< parameters.package_name >>@<< parameters.version >> is being deployed to << parameters.environment >>'
772
+ webhook: ${SLACK_CIRCLECI_DEPLOYMENTS_WEBHOOK}
773
+ color: '#32a852'
774
+
775
+ trigger_workflow_by_workspace:
776
+ parameters:
777
+ workflow:
778
+ type: string
779
+ executor: node
780
+ steps:
781
+ - checkout
782
+ - attach_workspace:
783
+ at: ~/project
784
+ - run:
785
+ command: cat package.json | jq -r .version
786
+ - run:
787
+ name: Trigger << parameters.workflow >>
788
+ command: |
789
+ set -x
790
+ VERSION=v$(cat package.json | jq -r .version)
791
+ .ci/trigger-circleci-workflow.sh << parameters.workflow >> $VERSION
792
+
793
+ trigger_workflow_by_circle_tag:
794
+ parameters:
795
+ workflow:
796
+ type: string
797
+ executor: node
798
+ steps:
799
+ - checkout
800
+ - run:
801
+ name: Trigger << parameters.workflow >>
802
+ command: |
803
+ .ci/trigger-circleci-workflow.sh << parameters.workflow >> $CIRCLE_TAG
804
+
805
+ # Optional filters assuming trunk based development
806
+ ## For PR workflow
807
+ only_on_pr_branch: &only_on_pr_branch
808
+ filters:
809
+ branches:
810
+ ignore:
811
+ - master
812
+ - main
813
+ - develop
814
+ # if you have release branches you might add
815
+ # - /^release.*/
816
+
817
+ ## For master workflow
818
+ only_on_master_branch: &only_on_master_branch
819
+ filters:
820
+ branches:
821
+ only:
822
+ - master
823
+ - main
824
+
825
+ only_on_tags: &only_on_tags
826
+ filters:
827
+ tags:
828
+ only: /^v.*/
829
+
830
+ workflows:
831
+ pull_request:
832
+ jobs:
833
+ - install_deps:
834
+ name: install_deps
835
+ context: <% PROJECT_NAME >-dev
836
+ <<: *only_on_pr_branch
837
+ - lint:
838
+ <<: *only_on_pr_branch
839
+ context: <% PROJECT_NAME >-dev
840
+ requires:
841
+ - install_deps
842
+ - test_unit:
843
+ <<: *only_on_pr_branch
844
+ context: <% PROJECT_NAME >-dev
845
+ requires:
846
+ - install_deps
847
+ - e2e_test:
848
+ <<: *only_on_pr_branch
849
+ context: <% PROJECT_NAME >-dev
850
+ name: e2e_test
851
+ requires:
852
+ - install_deps
853
+ - init_aws:
854
+ <<: *only_on_pr_branch
855
+ context: <% PROJECT_NAME >-dev
856
+ name: init_aws_eks_pr
857
+ job_type: 'eks_pr'
858
+ requires:
859
+ - install_deps
860
+ - init_aws_oidc:
861
+ <<: *only_on_pr_branch
862
+ context: <% PROJECT_NAME >-dev
863
+ name: aws_oidc
864
+ requires:
865
+ - install_deps
866
+ - test_unit
867
+ - lint
868
+ - deploy_terraform:
869
+ <<: *only_on_pr_branch
870
+ context: <% PROJECT_NAME >-dev
871
+ name: deploy_terraform__<< matrix.folder >>
872
+ matrix:
873
+ parameters:
874
+ folder: [terraform-ecr, terraform-newrelic]
875
+ project: '<% PROJECT_NAME >'
876
+ apply: false
877
+ requires:
878
+ - aws_oidc
879
+ - publish_docker:
880
+ <<: *only_on_pr_branch
881
+ context: <% PROJECT_NAME >-dev
882
+ name: publish_docker
883
+ dockerfile: "Dockerfile"
884
+ requires:
885
+ - install_deps
886
+ - aws_oidc
887
+ - upgrade_helm:
888
+ <<: *only_on_pr_branch
889
+ context: <% PROJECT_NAME >-dev
890
+ name: deploy_to_pr
891
+ create: true
892
+ environment: pr
893
+ node_env: development
894
+ requires:
895
+ - init_aws_eks_pr
896
+ - publish_docker
897
+ - add_github_comment:
898
+ <<: *only_on_pr_branch
899
+ context: <% PROJECT_NAME >-prod
900
+ requires:
901
+ - deploy_to_pr
902
+
903
+ remove_pr:
904
+ when:
905
+ not:
906
+ equal: [scheduled_pipeline, << pipeline.trigger_source >>]
907
+ jobs:
908
+ - init_aws:
909
+ <<: *only_on_master_branch
910
+ context: <% PROJECT_NAME >-dev
911
+ name: init_aws_eks_pr
912
+ job_type: 'eks_pr'
913
+ - uninstall_helm:
914
+ <<: *only_on_master_branch
915
+ context: <% PROJECT_NAME >-dev
916
+ name: destroy_pr
917
+ environment: pr
918
+ requires:
919
+ - init_aws_eks_pr
920
+
921
+ build_and_deploy:
922
+ when:
923
+ and:
924
+ - equal: [true, << pipeline.parameters.run_build_workflow >>]
925
+ - not:
926
+ equal: [scheduled_pipeline, << pipeline.trigger_source >>]
927
+ jobs:
928
+ - bump_version:
929
+ <<: *only_on_master_branch
930
+ context: <% PROJECT_NAME >-dev
931
+ name: bump_version
932
+ - install_deps:
933
+ name: install_deps
934
+ context: <% PROJECT_NAME >-dev
935
+ <<: *only_on_master_branch
936
+ requires:
937
+ - bump_version
938
+ - e2e_test:
939
+ <<: *only_on_master_branch
940
+ context: <% PROJECT_NAME >-dev
941
+ name: e2e_test
942
+ requires:
943
+ - install_deps
944
+ - init_aws:
945
+ <<: *only_on_master_branch
946
+ context: <% PROJECT_NAME >-dev
947
+ name: init_aws_eks_dev
948
+ job_type: 'eks_dev'
949
+ requires:
950
+ - install_deps
951
+ - init_aws_oidc:
952
+ <<: *only_on_master_branch
953
+ context: <% PROJECT_NAME >-dev
954
+ name: aws_oidc
955
+ requires:
956
+ - install_deps
957
+ - deploy_terraform:
958
+ <<: *only_on_master_branch
959
+ context: <% PROJECT_NAME >-dev
960
+ name: deploy_terraform_ecr
961
+ project: '<% PROJECT_NAME >'
962
+ folder: 'terraform-ecr'
963
+ environment: dev
964
+ apply: true
965
+ requires:
966
+ - aws_oidc
967
+ - publish_docker:
968
+ <<: *only_on_master_branch
969
+ context: <% PROJECT_NAME >-dev
970
+ name: publish_docker
971
+ requires:
972
+ - install_deps
973
+ - e2e_test
974
+ - aws_oidc
975
+ - deploy_terraform_ecr
976
+ - trigger_workflow_by_workspace:
977
+ <<: *only_on_master_branch
978
+ context: <% PROJECT_NAME >-dev
979
+ name: trigger_deploy_to_dev_workflow
980
+ workflow: deploy_to_dev_workflow
981
+ requires:
982
+ - publish_docker
983
+
984
+ deploy_to_dev_workflow:
985
+ when:
986
+ and:
987
+ - equal: [true, << pipeline.parameters.run_deploy_to_dev_workflow >>]
988
+ - not:
989
+ equal: [scheduled_pipeline, << pipeline.trigger_source >>]
990
+ jobs:
991
+ - slack_deploy_approval:
992
+ <<: *only_on_tags
993
+ context: <% PROJECT_NAME >-dev
994
+ approval: false
995
+ environment: DEV
996
+ - install_deps:
997
+ name: install_deps
998
+ context: <% PROJECT_NAME >-dev
999
+ <<: *only_on_tags
1000
+ - init_aws:
1001
+ <<: *only_on_tags
1002
+ context: <% PROJECT_NAME >-dev
1003
+ name: init_aws_eks_dev
1004
+ job_type: 'eks_dev'
1005
+ requires:
1006
+ - install_deps
1007
+ - init_aws_oidc:
1008
+ <<: *only_on_tags
1009
+ context: <% PROJECT_NAME >-dev
1010
+ name: aws_oidc_dev
1011
+ requires:
1012
+ - slack_deploy_approval
1013
+ - upgrade_helm:
1014
+ <<: *only_on_tags
1015
+ context: <% PROJECT_NAME >-dev
1016
+ name: deploy_to_dev
1017
+ create: true
1018
+ environment: dev
1019
+ node_env: development
1020
+ requires:
1021
+ - aws_oidc_dev
1022
+ - init_aws_eks_dev
1023
+ - deploy_terraform:
1024
+ <<: *only_on_tags
1025
+ context: <% PROJECT_NAME >-dev
1026
+ name: deploy_terraform_newrelic_dev
1027
+ project: '<% PROJECT_NAME >'
1028
+ folder: 'terraform-newrelic'
1029
+ environment: dev
1030
+ apply: true
1031
+ requires:
1032
+ - deploy_to_dev
1033
+ - trigger_workflow_by_circle_tag:
1034
+ <<: *only_on_tags
1035
+ context: <% PROJECT_NAME >-dev
1036
+ name: trigger_deploy_to_staging_workflow
1037
+ workflow: deploy_to_staging_workflow
1038
+ requires:
1039
+ - deploy_terraform_newrelic_dev
1040
+
1041
+ deploy_to_staging_workflow:
1042
+ when:
1043
+ and:
1044
+ - equal:
1045
+ [true, << pipeline.parameters.run_deploy_to_staging_workflow >>]
1046
+ - not:
1047
+ equal: [scheduled_pipeline, << pipeline.trigger_source >>]
1048
+ jobs:
1049
+ - slack_deploy_approval:
1050
+ <<: *only_on_tags
1051
+ context: <% PROJECT_NAME >-stage
1052
+ name: slack_deploy_approval
1053
+ approval: true
1054
+ environment: STAGING
1055
+ - approve_deploy_to_staging:
1056
+ <<: *only_on_tags
1057
+ type: approval
1058
+ - init_aws_oidc:
1059
+ <<: *only_on_tags
1060
+ context: <% PROJECT_NAME >-stage
1061
+ name: aws_oidc_staging
1062
+ requires:
1063
+ - approve_deploy_to_staging
1064
+ - init_aws:
1065
+ <<: *only_on_tags
1066
+ name: init_aws_eks_staging
1067
+ context: <% PROJECT_NAME >-stage
1068
+ job_type: 'eks_staging'
1069
+ requires:
1070
+ - aws_oidc_staging
1071
+ - upgrade_helm:
1072
+ <<: *only_on_tags
1073
+ name: deploy_to_staging
1074
+ context: <% PROJECT_NAME >-stage
1075
+ environment: staging
1076
+ requires:
1077
+ - init_aws_eks_staging
1078
+ - deploy_terraform:
1079
+ <<: *only_on_tags
1080
+ context: <% PROJECT_NAME >-stage
1081
+ name: deploy_terraform_newrelic_staging
1082
+ project: '<% PROJECT_NAME >'
1083
+ folder: 'terraform-newrelic'
1084
+ environment: staging
1085
+ apply: true
1086
+ requires:
1087
+ - deploy_to_staging
1088
+ - trigger_workflow_by_circle_tag:
1089
+ <<: *only_on_tags
1090
+ context: <% PROJECT_NAME >-stage
1091
+ name: trigger_deploy_to_prod_workflow
1092
+ workflow: deploy_to_prod_workflow
1093
+ requires:
1094
+ - deploy_to_staging
1095
+
1096
+ deploy_to_prod_workflow:
1097
+ when:
1098
+ and:
1099
+ - equal: [true, << pipeline.parameters.run_deploy_to_prod_workflow >>]
1100
+ - not:
1101
+ equal: [scheduled_pipeline, << pipeline.trigger_source >>]
1102
+ jobs:
1103
+ - slack_deploy_approval:
1104
+ <<: *only_on_tags
1105
+ context: <% PROJECT_NAME >-prod
1106
+ name: slack_deploy_approval
1107
+ approval: true
1108
+ environment: PROD
1109
+ - approve_deploy_to_prod:
1110
+ <<: *only_on_tags
1111
+ type: approval
1112
+ - init_aws_oidc:
1113
+ <<: *only_on_tags
1114
+ context: <% PROJECT_NAME >-prod
1115
+ name: aws_oidc_prod
1116
+ requires:
1117
+ - approve_deploy_to_prod
1118
+ - release-api/prerelease:
1119
+ <<: *only_on_tags
1120
+ context: <% PROJECT_NAME >-prod
1121
+ use_specific_github_creds: false #!Comment!Optional - use it only if your team have GitHub user and API token
1122
+ change_request_app_id: ''
1123
+ change_request_description: ''
1124
+ short_description: ''
1125
+ email_address: ''
1126
+ platform: ''
1127
+ os_type: ''
1128
+ partner: ''
1129
+ product_owner: ''
1130
+ priority: ''
1131
+ business_justification: ''
1132
+ testing_method: ''
1133
+ testing_tools: ''
1134
+ requires:
1135
+ - approve_deploy_to_prod
1136
+ - init_aws:
1137
+ <<: *only_on_tags
1138
+ name: init_aws_eks_prod
1139
+ context: <% PROJECT_NAME >-prod
1140
+ job_type: 'eks_prod'
1141
+ requires:
1142
+ - aws_oidc_prod
1143
+ - upgrade_helm:
1144
+ <<: *only_on_tags
1145
+ name: deploy_to_prod
1146
+ context: <% PROJECT_NAME >-prod
1147
+ environment: prod
1148
+ requires:
1149
+ - init_aws_eks_prod
1150
+ - deploy_terraform:
1151
+ <<: *only_on_tags
1152
+ context: <% PROJECT_NAME >-prod
1153
+ name: deploy_terraform_newrelic_prod
1154
+ project: '<% PROJECT_NAME >'
1155
+ folder: 'terraform-newrelic'
1156
+ environment: prod
1157
+ apply: true
1158
+ requires:
1159
+ - deploy_to_prod
1160
+ - release-api/release:
1161
+ <<: *only_on_tags
1162
+ context: <% PROJECT_NAME >-prod
1163
+ use_specific_github_creds: false #!Comment!Optional - use it only if your team have GitHub user and API token
1164
+ create_newrelic_deployment: false #!Comment! Set this to false, if your application does not have NewRelic App Name
1165
+ requires:
1166
+ - release-api/prerelease
1167
+ - approve_deploy_to_prod
1168
+ - deploy_to_prod
1169
+
1170
+ # You must go to project setting > triggers and add a trigger call remove_old_environments
1171
+ # in CircleCi. This should be set to be triggered at midnight or around that time.
1172
+ remove_old_environments:
1173
+ when:
1174
+ and:
1175
+ - equal: [scheduled_pipeline, << pipeline.trigger_source >>]
1176
+ - equal: ['remove_old_environments', << pipeline.schedule.name >>]
1177
+ jobs:
1178
+ - init_aws:
1179
+ <<: *only_on_master_branch
1180
+ context: <% PROJECT_NAME >-dev
1181
+ name: init_aws_eks_pr
1182
+ job_type: 'eks_pr'
1183
+ - remove_all_pr_environments:
1184
+ <<: *only_on_master_branch
1185
+ context: <% PROJECT_NAME >-dev
1186
+ requires:
1187
+ - init_aws_eks_pr