[{"data":1,"prerenderedAt":2509},["ShallowReactive",2],{"content-query-MI5FR3bdX4":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"tags":10,"body":16,"_type":2503,"_id":2504,"_source":2505,"_file":2506,"_stem":2507,"_extension":2508},"/codes/gitlab-ci-pipeline","codes",false,"","GitLab CI Pipeline for ECS Deployments","A production-grade GitLab CI pipeline that builds, tests, and deploys containerized applications to ECS Fargate in under 15 minutes.",[11,12,13,14,15],"gitlab-ci","aws","ecs","ci/cd","docker",{"type":17,"children":18,"toc":2494},"root",[19,28,34,41,286,292,2262,2268,2275,2339,2345,2350,2438,2444,2488],{"type":20,"tag":21,"props":22,"children":24},"element","h1",{"id":23},"gitlab-ci-pipeline-from-commit-to-production-in-15-minutes",[25],{"type":26,"value":27},"text","GitLab CI Pipeline — From Commit to Production in 15 Minutes",{"type":20,"tag":29,"props":30,"children":31},"p",{},[32],{"type":26,"value":33},"This is my go-to pipeline structure for deploying containerized services to ECS Fargate. It handles building, testing, security scanning, and deployment with automatic rollback.",{"type":20,"tag":35,"props":36,"children":38},"h2",{"id":37},"pipeline-architecture",[39],{"type":26,"value":40},"Pipeline Architecture",{"type":20,"tag":42,"props":43,"children":47},"pre",{"className":44,"code":45,"language":46,"meta":7,"style":7},"language-mermaid shiki shiki-themes material-theme-lighter github-light github-dark","graph LR\n    subgraph \"Build Stage\"\n        A[Lint & Static Analysis] --> B[Unit Tests]\n        B --> C[Docker Build]\n        C --> D[Push to ECR]\n    end\n\n    subgraph \"Test Stage\"\n        D --> E[Integration Tests]\n        E --> F[Security Scan]\n    end\n\n    subgraph \"Deploy Stage\"\n        F --> G{Branch?}\n        G -->|develop| H[Deploy to Staging]\n        G -->|main| I[Deploy to Production]\n        H --> J[Smoke Tests]\n        I --> K[Health Check]\n        K --> L{Healthy?}\n        L -->|No| M[Auto Rollback]\n        L -->|Yes| N[Done ✓]\n    end\n\n    style A fill:#4dabf7\n    style N fill:#51cf66\n    style M fill:#ff6b6b\n","mermaid",[48],{"type":20,"tag":49,"props":50,"children":51},"code",{"__ignoreMap":7},[52,64,73,82,91,100,109,119,128,137,146,154,162,171,180,189,198,207,216,225,234,243,251,259,268,277],{"type":20,"tag":53,"props":54,"children":57},"span",{"class":55,"line":56},"line",1,[58],{"type":20,"tag":53,"props":59,"children":61},{"style":60},"--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8",[62],{"type":26,"value":63},"graph LR\n",{"type":20,"tag":53,"props":65,"children":67},{"class":55,"line":66},2,[68],{"type":20,"tag":53,"props":69,"children":70},{"style":60},[71],{"type":26,"value":72},"    subgraph \"Build Stage\"\n",{"type":20,"tag":53,"props":74,"children":76},{"class":55,"line":75},3,[77],{"type":20,"tag":53,"props":78,"children":79},{"style":60},[80],{"type":26,"value":81},"        A[Lint & Static Analysis] --> B[Unit Tests]\n",{"type":20,"tag":53,"props":83,"children":85},{"class":55,"line":84},4,[86],{"type":20,"tag":53,"props":87,"children":88},{"style":60},[89],{"type":26,"value":90},"        B --> C[Docker Build]\n",{"type":20,"tag":53,"props":92,"children":94},{"class":55,"line":93},5,[95],{"type":20,"tag":53,"props":96,"children":97},{"style":60},[98],{"type":26,"value":99},"        C --> D[Push to ECR]\n",{"type":20,"tag":53,"props":101,"children":103},{"class":55,"line":102},6,[104],{"type":20,"tag":53,"props":105,"children":106},{"style":60},[107],{"type":26,"value":108},"    end\n",{"type":20,"tag":53,"props":110,"children":112},{"class":55,"line":111},7,[113],{"type":20,"tag":53,"props":114,"children":116},{"emptyLinePlaceholder":115},true,[117],{"type":26,"value":118},"\n",{"type":20,"tag":53,"props":120,"children":122},{"class":55,"line":121},8,[123],{"type":20,"tag":53,"props":124,"children":125},{"style":60},[126],{"type":26,"value":127},"    subgraph \"Test Stage\"\n",{"type":20,"tag":53,"props":129,"children":131},{"class":55,"line":130},9,[132],{"type":20,"tag":53,"props":133,"children":134},{"style":60},[135],{"type":26,"value":136},"        D --> E[Integration Tests]\n",{"type":20,"tag":53,"props":138,"children":140},{"class":55,"line":139},10,[141],{"type":20,"tag":53,"props":142,"children":143},{"style":60},[144],{"type":26,"value":145},"        E --> F[Security Scan]\n",{"type":20,"tag":53,"props":147,"children":149},{"class":55,"line":148},11,[150],{"type":20,"tag":53,"props":151,"children":152},{"style":60},[153],{"type":26,"value":108},{"type":20,"tag":53,"props":155,"children":157},{"class":55,"line":156},12,[158],{"type":20,"tag":53,"props":159,"children":160},{"emptyLinePlaceholder":115},[161],{"type":26,"value":118},{"type":20,"tag":53,"props":163,"children":165},{"class":55,"line":164},13,[166],{"type":20,"tag":53,"props":167,"children":168},{"style":60},[169],{"type":26,"value":170},"    subgraph \"Deploy Stage\"\n",{"type":20,"tag":53,"props":172,"children":174},{"class":55,"line":173},14,[175],{"type":20,"tag":53,"props":176,"children":177},{"style":60},[178],{"type":26,"value":179},"        F --> G{Branch?}\n",{"type":20,"tag":53,"props":181,"children":183},{"class":55,"line":182},15,[184],{"type":20,"tag":53,"props":185,"children":186},{"style":60},[187],{"type":26,"value":188},"        G -->|develop| H[Deploy to Staging]\n",{"type":20,"tag":53,"props":190,"children":192},{"class":55,"line":191},16,[193],{"type":20,"tag":53,"props":194,"children":195},{"style":60},[196],{"type":26,"value":197},"        G -->|main| I[Deploy to Production]\n",{"type":20,"tag":53,"props":199,"children":201},{"class":55,"line":200},17,[202],{"type":20,"tag":53,"props":203,"children":204},{"style":60},[205],{"type":26,"value":206},"        H --> J[Smoke Tests]\n",{"type":20,"tag":53,"props":208,"children":210},{"class":55,"line":209},18,[211],{"type":20,"tag":53,"props":212,"children":213},{"style":60},[214],{"type":26,"value":215},"        I --> K[Health Check]\n",{"type":20,"tag":53,"props":217,"children":219},{"class":55,"line":218},19,[220],{"type":20,"tag":53,"props":221,"children":222},{"style":60},[223],{"type":26,"value":224},"        K --> L{Healthy?}\n",{"type":20,"tag":53,"props":226,"children":228},{"class":55,"line":227},20,[229],{"type":20,"tag":53,"props":230,"children":231},{"style":60},[232],{"type":26,"value":233},"        L -->|No| M[Auto Rollback]\n",{"type":20,"tag":53,"props":235,"children":237},{"class":55,"line":236},21,[238],{"type":20,"tag":53,"props":239,"children":240},{"style":60},[241],{"type":26,"value":242},"        L -->|Yes| N[Done ✓]\n",{"type":20,"tag":53,"props":244,"children":246},{"class":55,"line":245},22,[247],{"type":20,"tag":53,"props":248,"children":249},{"style":60},[250],{"type":26,"value":108},{"type":20,"tag":53,"props":252,"children":254},{"class":55,"line":253},23,[255],{"type":20,"tag":53,"props":256,"children":257},{"emptyLinePlaceholder":115},[258],{"type":26,"value":118},{"type":20,"tag":53,"props":260,"children":262},{"class":55,"line":261},24,[263],{"type":20,"tag":53,"props":264,"children":265},{"style":60},[266],{"type":26,"value":267},"    style A fill:#4dabf7\n",{"type":20,"tag":53,"props":269,"children":271},{"class":55,"line":270},25,[272],{"type":20,"tag":53,"props":273,"children":274},{"style":60},[275],{"type":26,"value":276},"    style N fill:#51cf66\n",{"type":20,"tag":53,"props":278,"children":280},{"class":55,"line":279},26,[281],{"type":20,"tag":53,"props":282,"children":283},{"style":60},[284],{"type":26,"value":285},"    style M fill:#ff6b6b\n",{"type":20,"tag":35,"props":287,"children":289},{"id":288},"the-pipeline",[290],{"type":26,"value":291},"The Pipeline",{"type":20,"tag":42,"props":293,"children":297},{"className":294,"code":295,"language":296,"meta":7,"style":7},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","stages:\n  - build\n  - test\n  - deploy\n\nvariables:\n  DOCKER_BUILDKIT: \"1\"\n  ECR_REGISTRY: \"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com\"\n  IMAGE_NAME: \"${ECR_REGISTRY}/${CI_PROJECT_NAME}\"\n  IMAGE_TAG: \"${CI_COMMIT_SHORT_SHA}\"\n\n# ---------- BUILD STAGE ----------\n\nlint:\n  stage: build\n  image: node:20-alpine\n  script:\n    - npm ci --prefer-offline\n    - npm run lint\n  cache:\n    key: ${CI_COMMIT_REF_SLUG}\n    paths:\n      - node_modules/\n  rules:\n    - if: $CI_MERGE_REQUEST_IID\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\nunit-test:\n  stage: build\n  image: node:20-alpine\n  script:\n    - npm ci --prefer-offline\n    - npm run test:unit -- --coverage\n  coverage: '/All files[^|]*\\|[^|]*\\s+([\\d\\.]+)/'\n  artifacts:\n    reports:\n      coverage_report:\n        coverage_format: cobertura\n        path: coverage/cobertura-coverage.xml\n  cache:\n    key: ${CI_COMMIT_REF_SLUG}\n    paths:\n      - node_modules/\n\ndocker-build:\n  stage: build\n  image: docker:24-dind\n  services:\n    - docker:24-dind\n  before_script:\n    - apk add --no-cache aws-cli\n    - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY\n  script:\n    - docker build --cache-from $IMAGE_NAME:latest -t $IMAGE_NAME:$IMAGE_TAG -t $IMAGE_NAME:latest .\n    - docker push $IMAGE_NAME:$IMAGE_TAG\n    - docker push $IMAGE_NAME:latest\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\n# ---------- TEST STAGE ----------\n\nintegration-test:\n  stage: test\n  image: node:20-alpine\n  script:\n    - npm ci --prefer-offline\n    - npm run test:integration\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\nsecurity-scan:\n  stage: test\n  image:\n    name: aquasec/trivy:latest\n    entrypoint: [\"\"]\n  script:\n    - trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE_NAME:$IMAGE_TAG\n  allow_failure: false\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\n# ---------- DEPLOY STAGE ----------\n\n.deploy_template: &deploy_template\n  stage: deploy\n  image: \n    name: amazon/aws-cli:latest\n    entrypoint: [\"\"]\n  before_script:\n    - yum install -y jq\n  script:\n    - |\n      # Update ECS service with new task definition\n      TASK_DEF=$(aws ecs describe-task-definition --task-definition $TASK_FAMILY --region $AWS_REGION)\n      \n      # Create new task definition revision with updated image\n      NEW_TASK_DEF=$(echo $TASK_DEF | jq --arg IMAGE \"$IMAGE_NAME:$IMAGE_TAG\" \\\n        '.taskDefinition | .containerDefinitions[0].image = $IMAGE | \n        del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)')\n      \n      NEW_REVISION=$(aws ecs register-task-definition --region $AWS_REGION --cli-input-json \"$NEW_TASK_DEF\" | jq -r '.taskDefinition.taskDefinitionArn')\n      \n      # Update service\n      aws ecs update-service \\\n        --cluster $ECS_CLUSTER \\\n        --service $SERVICE_NAME \\\n        --task-definition $NEW_REVISION \\\n        --region $AWS_REGION\n      \n      # Wait for deployment to stabilize\n      aws ecs wait services-stable \\\n        --cluster $ECS_CLUSTER \\\n        --services $SERVICE_NAME \\\n        --region $AWS_REGION\n\ndeploy-staging:\n  \u003C\u003C: *deploy_template\n  variables:\n    ECS_CLUSTER: staging-cluster\n    SERVICE_NAME: ${CI_PROJECT_NAME}-staging\n    TASK_FAMILY: ${CI_PROJECT_NAME}-staging\n  environment:\n    name: staging\n    url: https://staging.example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n\ndeploy-production:\n  \u003C\u003C: *deploy_template\n  variables:\n    ECS_CLUSTER: production-cluster\n    SERVICE_NAME: ${CI_PROJECT_NAME}-production\n    TASK_FAMILY: ${CI_PROJECT_NAME}-production\n  environment:\n    name: production\n    url: https://app.example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n  when: manual\n","yaml",[298],{"type":20,"tag":49,"props":299,"children":300},{"__ignoreMap":7},[301,316,330,342,354,361,373,402,427,452,477,484,493,500,512,528,545,557,570,582,594,611,623,636,648,669,689,710,718,731,747,763,775,787,800,828,841,854,867,885,903,915,931,943,955,963,976,992,1009,1022,1034,1047,1060,1073,1085,1098,1111,1124,1136,1156,1176,1184,1193,1201,1214,1230,1246,1258,1270,1283,1295,1315,1335,1343,1356,1372,1384,1402,1430,1442,1455,1474,1486,1506,1514,1523,1531,1556,1572,1589,1606,1630,1642,1655,1667,1680,1689,1698,1707,1716,1725,1734,1743,1751,1760,1768,1777,1786,1795,1804,1813,1822,1830,1839,1848,1856,1865,1873,1881,1894,1917,1930,1948,1966,1983,1996,2013,2031,2043,2063,2071,2084,2104,2116,2133,2150,2166,2178,2195,2212,2224,2244],{"type":20,"tag":53,"props":302,"children":303},{"class":55,"line":56},[304,310],{"type":20,"tag":53,"props":305,"children":307},{"style":306},"--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D",[308],{"type":26,"value":309},"stages",{"type":20,"tag":53,"props":311,"children":313},{"style":312},"--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8",[314],{"type":26,"value":315},":\n",{"type":20,"tag":53,"props":317,"children":318},{"class":55,"line":66},[319,324],{"type":20,"tag":53,"props":320,"children":321},{"style":312},[322],{"type":26,"value":323},"  -",{"type":20,"tag":53,"props":325,"children":327},{"style":326},"--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF",[328],{"type":26,"value":329}," build\n",{"type":20,"tag":53,"props":331,"children":332},{"class":55,"line":75},[333,337],{"type":20,"tag":53,"props":334,"children":335},{"style":312},[336],{"type":26,"value":323},{"type":20,"tag":53,"props":338,"children":339},{"style":326},[340],{"type":26,"value":341}," test\n",{"type":20,"tag":53,"props":343,"children":344},{"class":55,"line":84},[345,349],{"type":20,"tag":53,"props":346,"children":347},{"style":312},[348],{"type":26,"value":323},{"type":20,"tag":53,"props":350,"children":351},{"style":326},[352],{"type":26,"value":353}," deploy\n",{"type":20,"tag":53,"props":355,"children":356},{"class":55,"line":93},[357],{"type":20,"tag":53,"props":358,"children":359},{"emptyLinePlaceholder":115},[360],{"type":26,"value":118},{"type":20,"tag":53,"props":362,"children":363},{"class":55,"line":102},[364,369],{"type":20,"tag":53,"props":365,"children":366},{"style":306},[367],{"type":26,"value":368},"variables",{"type":20,"tag":53,"props":370,"children":371},{"style":312},[372],{"type":26,"value":315},{"type":20,"tag":53,"props":374,"children":375},{"class":55,"line":111},[376,381,386,392,397],{"type":20,"tag":53,"props":377,"children":378},{"style":306},[379],{"type":26,"value":380},"  DOCKER_BUILDKIT",{"type":20,"tag":53,"props":382,"children":383},{"style":312},[384],{"type":26,"value":385},":",{"type":20,"tag":53,"props":387,"children":389},{"style":388},"--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF",[390],{"type":26,"value":391}," \"",{"type":20,"tag":53,"props":393,"children":394},{"style":326},[395],{"type":26,"value":396},"1",{"type":20,"tag":53,"props":398,"children":399},{"style":388},[400],{"type":26,"value":401},"\"\n",{"type":20,"tag":53,"props":403,"children":404},{"class":55,"line":121},[405,410,414,418,423],{"type":20,"tag":53,"props":406,"children":407},{"style":306},[408],{"type":26,"value":409},"  ECR_REGISTRY",{"type":20,"tag":53,"props":411,"children":412},{"style":312},[413],{"type":26,"value":385},{"type":20,"tag":53,"props":415,"children":416},{"style":388},[417],{"type":26,"value":391},{"type":20,"tag":53,"props":419,"children":420},{"style":326},[421],{"type":26,"value":422},"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com",{"type":20,"tag":53,"props":424,"children":425},{"style":388},[426],{"type":26,"value":401},{"type":20,"tag":53,"props":428,"children":429},{"class":55,"line":130},[430,435,439,443,448],{"type":20,"tag":53,"props":431,"children":432},{"style":306},[433],{"type":26,"value":434},"  IMAGE_NAME",{"type":20,"tag":53,"props":436,"children":437},{"style":312},[438],{"type":26,"value":385},{"type":20,"tag":53,"props":440,"children":441},{"style":388},[442],{"type":26,"value":391},{"type":20,"tag":53,"props":444,"children":445},{"style":326},[446],{"type":26,"value":447},"${ECR_REGISTRY}/${CI_PROJECT_NAME}",{"type":20,"tag":53,"props":449,"children":450},{"style":388},[451],{"type":26,"value":401},{"type":20,"tag":53,"props":453,"children":454},{"class":55,"line":139},[455,460,464,468,473],{"type":20,"tag":53,"props":456,"children":457},{"style":306},[458],{"type":26,"value":459},"  IMAGE_TAG",{"type":20,"tag":53,"props":461,"children":462},{"style":312},[463],{"type":26,"value":385},{"type":20,"tag":53,"props":465,"children":466},{"style":388},[467],{"type":26,"value":391},{"type":20,"tag":53,"props":469,"children":470},{"style":326},[471],{"type":26,"value":472},"${CI_COMMIT_SHORT_SHA}",{"type":20,"tag":53,"props":474,"children":475},{"style":388},[476],{"type":26,"value":401},{"type":20,"tag":53,"props":478,"children":479},{"class":55,"line":148},[480],{"type":20,"tag":53,"props":481,"children":482},{"emptyLinePlaceholder":115},[483],{"type":26,"value":118},{"type":20,"tag":53,"props":485,"children":486},{"class":55,"line":156},[487],{"type":20,"tag":53,"props":488,"children":490},{"style":489},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[491],{"type":26,"value":492},"# ---------- BUILD STAGE ----------\n",{"type":20,"tag":53,"props":494,"children":495},{"class":55,"line":164},[496],{"type":20,"tag":53,"props":497,"children":498},{"emptyLinePlaceholder":115},[499],{"type":26,"value":118},{"type":20,"tag":53,"props":501,"children":502},{"class":55,"line":173},[503,508],{"type":20,"tag":53,"props":504,"children":505},{"style":306},[506],{"type":26,"value":507},"lint",{"type":20,"tag":53,"props":509,"children":510},{"style":312},[511],{"type":26,"value":315},{"type":20,"tag":53,"props":513,"children":514},{"class":55,"line":182},[515,520,524],{"type":20,"tag":53,"props":516,"children":517},{"style":306},[518],{"type":26,"value":519},"  stage",{"type":20,"tag":53,"props":521,"children":522},{"style":312},[523],{"type":26,"value":385},{"type":20,"tag":53,"props":525,"children":526},{"style":326},[527],{"type":26,"value":329},{"type":20,"tag":53,"props":529,"children":530},{"class":55,"line":191},[531,536,540],{"type":20,"tag":53,"props":532,"children":533},{"style":306},[534],{"type":26,"value":535},"  image",{"type":20,"tag":53,"props":537,"children":538},{"style":312},[539],{"type":26,"value":385},{"type":20,"tag":53,"props":541,"children":542},{"style":326},[543],{"type":26,"value":544}," node:20-alpine\n",{"type":20,"tag":53,"props":546,"children":547},{"class":55,"line":200},[548,553],{"type":20,"tag":53,"props":549,"children":550},{"style":306},[551],{"type":26,"value":552},"  script",{"type":20,"tag":53,"props":554,"children":555},{"style":312},[556],{"type":26,"value":315},{"type":20,"tag":53,"props":558,"children":559},{"class":55,"line":209},[560,565],{"type":20,"tag":53,"props":561,"children":562},{"style":312},[563],{"type":26,"value":564},"    -",{"type":20,"tag":53,"props":566,"children":567},{"style":326},[568],{"type":26,"value":569}," npm ci --prefer-offline\n",{"type":20,"tag":53,"props":571,"children":572},{"class":55,"line":218},[573,577],{"type":20,"tag":53,"props":574,"children":575},{"style":312},[576],{"type":26,"value":564},{"type":20,"tag":53,"props":578,"children":579},{"style":326},[580],{"type":26,"value":581}," npm run lint\n",{"type":20,"tag":53,"props":583,"children":584},{"class":55,"line":227},[585,590],{"type":20,"tag":53,"props":586,"children":587},{"style":306},[588],{"type":26,"value":589},"  cache",{"type":20,"tag":53,"props":591,"children":592},{"style":312},[593],{"type":26,"value":315},{"type":20,"tag":53,"props":595,"children":596},{"class":55,"line":236},[597,602,606],{"type":20,"tag":53,"props":598,"children":599},{"style":306},[600],{"type":26,"value":601},"    key",{"type":20,"tag":53,"props":603,"children":604},{"style":312},[605],{"type":26,"value":385},{"type":20,"tag":53,"props":607,"children":608},{"style":326},[609],{"type":26,"value":610}," ${CI_COMMIT_REF_SLUG}\n",{"type":20,"tag":53,"props":612,"children":613},{"class":55,"line":245},[614,619],{"type":20,"tag":53,"props":615,"children":616},{"style":306},[617],{"type":26,"value":618},"    paths",{"type":20,"tag":53,"props":620,"children":621},{"style":312},[622],{"type":26,"value":315},{"type":20,"tag":53,"props":624,"children":625},{"class":55,"line":253},[626,631],{"type":20,"tag":53,"props":627,"children":628},{"style":312},[629],{"type":26,"value":630},"      -",{"type":20,"tag":53,"props":632,"children":633},{"style":326},[634],{"type":26,"value":635}," node_modules/\n",{"type":20,"tag":53,"props":637,"children":638},{"class":55,"line":261},[639,644],{"type":20,"tag":53,"props":640,"children":641},{"style":306},[642],{"type":26,"value":643},"  rules",{"type":20,"tag":53,"props":645,"children":646},{"style":312},[647],{"type":26,"value":315},{"type":20,"tag":53,"props":649,"children":650},{"class":55,"line":270},[651,655,660,664],{"type":20,"tag":53,"props":652,"children":653},{"style":312},[654],{"type":26,"value":564},{"type":20,"tag":53,"props":656,"children":657},{"style":306},[658],{"type":26,"value":659}," if",{"type":20,"tag":53,"props":661,"children":662},{"style":312},[663],{"type":26,"value":385},{"type":20,"tag":53,"props":665,"children":666},{"style":326},[667],{"type":26,"value":668}," $CI_MERGE_REQUEST_IID\n",{"type":20,"tag":53,"props":670,"children":671},{"class":55,"line":279},[672,676,680,684],{"type":20,"tag":53,"props":673,"children":674},{"style":312},[675],{"type":26,"value":564},{"type":20,"tag":53,"props":677,"children":678},{"style":306},[679],{"type":26,"value":659},{"type":20,"tag":53,"props":681,"children":682},{"style":312},[683],{"type":26,"value":385},{"type":20,"tag":53,"props":685,"children":686},{"style":326},[687],{"type":26,"value":688}," $CI_COMMIT_BRANCH == \"develop\"\n",{"type":20,"tag":53,"props":690,"children":692},{"class":55,"line":691},27,[693,697,701,705],{"type":20,"tag":53,"props":694,"children":695},{"style":312},[696],{"type":26,"value":564},{"type":20,"tag":53,"props":698,"children":699},{"style":306},[700],{"type":26,"value":659},{"type":20,"tag":53,"props":702,"children":703},{"style":312},[704],{"type":26,"value":385},{"type":20,"tag":53,"props":706,"children":707},{"style":326},[708],{"type":26,"value":709}," $CI_COMMIT_BRANCH == \"main\"\n",{"type":20,"tag":53,"props":711,"children":713},{"class":55,"line":712},28,[714],{"type":20,"tag":53,"props":715,"children":716},{"emptyLinePlaceholder":115},[717],{"type":26,"value":118},{"type":20,"tag":53,"props":719,"children":721},{"class":55,"line":720},29,[722,727],{"type":20,"tag":53,"props":723,"children":724},{"style":306},[725],{"type":26,"value":726},"unit-test",{"type":20,"tag":53,"props":728,"children":729},{"style":312},[730],{"type":26,"value":315},{"type":20,"tag":53,"props":732,"children":734},{"class":55,"line":733},30,[735,739,743],{"type":20,"tag":53,"props":736,"children":737},{"style":306},[738],{"type":26,"value":519},{"type":20,"tag":53,"props":740,"children":741},{"style":312},[742],{"type":26,"value":385},{"type":20,"tag":53,"props":744,"children":745},{"style":326},[746],{"type":26,"value":329},{"type":20,"tag":53,"props":748,"children":750},{"class":55,"line":749},31,[751,755,759],{"type":20,"tag":53,"props":752,"children":753},{"style":306},[754],{"type":26,"value":535},{"type":20,"tag":53,"props":756,"children":757},{"style":312},[758],{"type":26,"value":385},{"type":20,"tag":53,"props":760,"children":761},{"style":326},[762],{"type":26,"value":544},{"type":20,"tag":53,"props":764,"children":766},{"class":55,"line":765},32,[767,771],{"type":20,"tag":53,"props":768,"children":769},{"style":306},[770],{"type":26,"value":552},{"type":20,"tag":53,"props":772,"children":773},{"style":312},[774],{"type":26,"value":315},{"type":20,"tag":53,"props":776,"children":778},{"class":55,"line":777},33,[779,783],{"type":20,"tag":53,"props":780,"children":781},{"style":312},[782],{"type":26,"value":564},{"type":20,"tag":53,"props":784,"children":785},{"style":326},[786],{"type":26,"value":569},{"type":20,"tag":53,"props":788,"children":790},{"class":55,"line":789},34,[791,795],{"type":20,"tag":53,"props":792,"children":793},{"style":312},[794],{"type":26,"value":564},{"type":20,"tag":53,"props":796,"children":797},{"style":326},[798],{"type":26,"value":799}," npm run test:unit -- --coverage\n",{"type":20,"tag":53,"props":801,"children":803},{"class":55,"line":802},35,[804,809,813,818,823],{"type":20,"tag":53,"props":805,"children":806},{"style":306},[807],{"type":26,"value":808},"  coverage",{"type":20,"tag":53,"props":810,"children":811},{"style":312},[812],{"type":26,"value":385},{"type":20,"tag":53,"props":814,"children":815},{"style":388},[816],{"type":26,"value":817}," '",{"type":20,"tag":53,"props":819,"children":820},{"style":326},[821],{"type":26,"value":822},"/All files[^|]*\\|[^|]*\\s+([\\d\\.]+)/",{"type":20,"tag":53,"props":824,"children":825},{"style":388},[826],{"type":26,"value":827},"'\n",{"type":20,"tag":53,"props":829,"children":831},{"class":55,"line":830},36,[832,837],{"type":20,"tag":53,"props":833,"children":834},{"style":306},[835],{"type":26,"value":836},"  artifacts",{"type":20,"tag":53,"props":838,"children":839},{"style":312},[840],{"type":26,"value":315},{"type":20,"tag":53,"props":842,"children":844},{"class":55,"line":843},37,[845,850],{"type":20,"tag":53,"props":846,"children":847},{"style":306},[848],{"type":26,"value":849},"    reports",{"type":20,"tag":53,"props":851,"children":852},{"style":312},[853],{"type":26,"value":315},{"type":20,"tag":53,"props":855,"children":857},{"class":55,"line":856},38,[858,863],{"type":20,"tag":53,"props":859,"children":860},{"style":306},[861],{"type":26,"value":862},"      coverage_report",{"type":20,"tag":53,"props":864,"children":865},{"style":312},[866],{"type":26,"value":315},{"type":20,"tag":53,"props":868,"children":870},{"class":55,"line":869},39,[871,876,880],{"type":20,"tag":53,"props":872,"children":873},{"style":306},[874],{"type":26,"value":875},"        coverage_format",{"type":20,"tag":53,"props":877,"children":878},{"style":312},[879],{"type":26,"value":385},{"type":20,"tag":53,"props":881,"children":882},{"style":326},[883],{"type":26,"value":884}," cobertura\n",{"type":20,"tag":53,"props":886,"children":888},{"class":55,"line":887},40,[889,894,898],{"type":20,"tag":53,"props":890,"children":891},{"style":306},[892],{"type":26,"value":893},"        path",{"type":20,"tag":53,"props":895,"children":896},{"style":312},[897],{"type":26,"value":385},{"type":20,"tag":53,"props":899,"children":900},{"style":326},[901],{"type":26,"value":902}," coverage/cobertura-coverage.xml\n",{"type":20,"tag":53,"props":904,"children":906},{"class":55,"line":905},41,[907,911],{"type":20,"tag":53,"props":908,"children":909},{"style":306},[910],{"type":26,"value":589},{"type":20,"tag":53,"props":912,"children":913},{"style":312},[914],{"type":26,"value":315},{"type":20,"tag":53,"props":916,"children":918},{"class":55,"line":917},42,[919,923,927],{"type":20,"tag":53,"props":920,"children":921},{"style":306},[922],{"type":26,"value":601},{"type":20,"tag":53,"props":924,"children":925},{"style":312},[926],{"type":26,"value":385},{"type":20,"tag":53,"props":928,"children":929},{"style":326},[930],{"type":26,"value":610},{"type":20,"tag":53,"props":932,"children":934},{"class":55,"line":933},43,[935,939],{"type":20,"tag":53,"props":936,"children":937},{"style":306},[938],{"type":26,"value":618},{"type":20,"tag":53,"props":940,"children":941},{"style":312},[942],{"type":26,"value":315},{"type":20,"tag":53,"props":944,"children":946},{"class":55,"line":945},44,[947,951],{"type":20,"tag":53,"props":948,"children":949},{"style":312},[950],{"type":26,"value":630},{"type":20,"tag":53,"props":952,"children":953},{"style":326},[954],{"type":26,"value":635},{"type":20,"tag":53,"props":956,"children":958},{"class":55,"line":957},45,[959],{"type":20,"tag":53,"props":960,"children":961},{"emptyLinePlaceholder":115},[962],{"type":26,"value":118},{"type":20,"tag":53,"props":964,"children":966},{"class":55,"line":965},46,[967,972],{"type":20,"tag":53,"props":968,"children":969},{"style":306},[970],{"type":26,"value":971},"docker-build",{"type":20,"tag":53,"props":973,"children":974},{"style":312},[975],{"type":26,"value":315},{"type":20,"tag":53,"props":977,"children":979},{"class":55,"line":978},47,[980,984,988],{"type":20,"tag":53,"props":981,"children":982},{"style":306},[983],{"type":26,"value":519},{"type":20,"tag":53,"props":985,"children":986},{"style":312},[987],{"type":26,"value":385},{"type":20,"tag":53,"props":989,"children":990},{"style":326},[991],{"type":26,"value":329},{"type":20,"tag":53,"props":993,"children":995},{"class":55,"line":994},48,[996,1000,1004],{"type":20,"tag":53,"props":997,"children":998},{"style":306},[999],{"type":26,"value":535},{"type":20,"tag":53,"props":1001,"children":1002},{"style":312},[1003],{"type":26,"value":385},{"type":20,"tag":53,"props":1005,"children":1006},{"style":326},[1007],{"type":26,"value":1008}," docker:24-dind\n",{"type":20,"tag":53,"props":1010,"children":1012},{"class":55,"line":1011},49,[1013,1018],{"type":20,"tag":53,"props":1014,"children":1015},{"style":306},[1016],{"type":26,"value":1017},"  services",{"type":20,"tag":53,"props":1019,"children":1020},{"style":312},[1021],{"type":26,"value":315},{"type":20,"tag":53,"props":1023,"children":1025},{"class":55,"line":1024},50,[1026,1030],{"type":20,"tag":53,"props":1027,"children":1028},{"style":312},[1029],{"type":26,"value":564},{"type":20,"tag":53,"props":1031,"children":1032},{"style":326},[1033],{"type":26,"value":1008},{"type":20,"tag":53,"props":1035,"children":1037},{"class":55,"line":1036},51,[1038,1043],{"type":20,"tag":53,"props":1039,"children":1040},{"style":306},[1041],{"type":26,"value":1042},"  before_script",{"type":20,"tag":53,"props":1044,"children":1045},{"style":312},[1046],{"type":26,"value":315},{"type":20,"tag":53,"props":1048,"children":1050},{"class":55,"line":1049},52,[1051,1055],{"type":20,"tag":53,"props":1052,"children":1053},{"style":312},[1054],{"type":26,"value":564},{"type":20,"tag":53,"props":1056,"children":1057},{"style":326},[1058],{"type":26,"value":1059}," apk add --no-cache aws-cli\n",{"type":20,"tag":53,"props":1061,"children":1063},{"class":55,"line":1062},53,[1064,1068],{"type":20,"tag":53,"props":1065,"children":1066},{"style":312},[1067],{"type":26,"value":564},{"type":20,"tag":53,"props":1069,"children":1070},{"style":326},[1071],{"type":26,"value":1072}," aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY\n",{"type":20,"tag":53,"props":1074,"children":1076},{"class":55,"line":1075},54,[1077,1081],{"type":20,"tag":53,"props":1078,"children":1079},{"style":306},[1080],{"type":26,"value":552},{"type":20,"tag":53,"props":1082,"children":1083},{"style":312},[1084],{"type":26,"value":315},{"type":20,"tag":53,"props":1086,"children":1088},{"class":55,"line":1087},55,[1089,1093],{"type":20,"tag":53,"props":1090,"children":1091},{"style":312},[1092],{"type":26,"value":564},{"type":20,"tag":53,"props":1094,"children":1095},{"style":326},[1096],{"type":26,"value":1097}," docker build --cache-from $IMAGE_NAME:latest -t $IMAGE_NAME:$IMAGE_TAG -t $IMAGE_NAME:latest .\n",{"type":20,"tag":53,"props":1099,"children":1101},{"class":55,"line":1100},56,[1102,1106],{"type":20,"tag":53,"props":1103,"children":1104},{"style":312},[1105],{"type":26,"value":564},{"type":20,"tag":53,"props":1107,"children":1108},{"style":326},[1109],{"type":26,"value":1110}," docker push $IMAGE_NAME:$IMAGE_TAG\n",{"type":20,"tag":53,"props":1112,"children":1114},{"class":55,"line":1113},57,[1115,1119],{"type":20,"tag":53,"props":1116,"children":1117},{"style":312},[1118],{"type":26,"value":564},{"type":20,"tag":53,"props":1120,"children":1121},{"style":326},[1122],{"type":26,"value":1123}," docker push $IMAGE_NAME:latest\n",{"type":20,"tag":53,"props":1125,"children":1127},{"class":55,"line":1126},58,[1128,1132],{"type":20,"tag":53,"props":1129,"children":1130},{"style":306},[1131],{"type":26,"value":643},{"type":20,"tag":53,"props":1133,"children":1134},{"style":312},[1135],{"type":26,"value":315},{"type":20,"tag":53,"props":1137,"children":1139},{"class":55,"line":1138},59,[1140,1144,1148,1152],{"type":20,"tag":53,"props":1141,"children":1142},{"style":312},[1143],{"type":26,"value":564},{"type":20,"tag":53,"props":1145,"children":1146},{"style":306},[1147],{"type":26,"value":659},{"type":20,"tag":53,"props":1149,"children":1150},{"style":312},[1151],{"type":26,"value":385},{"type":20,"tag":53,"props":1153,"children":1154},{"style":326},[1155],{"type":26,"value":688},{"type":20,"tag":53,"props":1157,"children":1159},{"class":55,"line":1158},60,[1160,1164,1168,1172],{"type":20,"tag":53,"props":1161,"children":1162},{"style":312},[1163],{"type":26,"value":564},{"type":20,"tag":53,"props":1165,"children":1166},{"style":306},[1167],{"type":26,"value":659},{"type":20,"tag":53,"props":1169,"children":1170},{"style":312},[1171],{"type":26,"value":385},{"type":20,"tag":53,"props":1173,"children":1174},{"style":326},[1175],{"type":26,"value":709},{"type":20,"tag":53,"props":1177,"children":1179},{"class":55,"line":1178},61,[1180],{"type":20,"tag":53,"props":1181,"children":1182},{"emptyLinePlaceholder":115},[1183],{"type":26,"value":118},{"type":20,"tag":53,"props":1185,"children":1187},{"class":55,"line":1186},62,[1188],{"type":20,"tag":53,"props":1189,"children":1190},{"style":489},[1191],{"type":26,"value":1192},"# ---------- TEST STAGE ----------\n",{"type":20,"tag":53,"props":1194,"children":1196},{"class":55,"line":1195},63,[1197],{"type":20,"tag":53,"props":1198,"children":1199},{"emptyLinePlaceholder":115},[1200],{"type":26,"value":118},{"type":20,"tag":53,"props":1202,"children":1204},{"class":55,"line":1203},64,[1205,1210],{"type":20,"tag":53,"props":1206,"children":1207},{"style":306},[1208],{"type":26,"value":1209},"integration-test",{"type":20,"tag":53,"props":1211,"children":1212},{"style":312},[1213],{"type":26,"value":315},{"type":20,"tag":53,"props":1215,"children":1217},{"class":55,"line":1216},65,[1218,1222,1226],{"type":20,"tag":53,"props":1219,"children":1220},{"style":306},[1221],{"type":26,"value":519},{"type":20,"tag":53,"props":1223,"children":1224},{"style":312},[1225],{"type":26,"value":385},{"type":20,"tag":53,"props":1227,"children":1228},{"style":326},[1229],{"type":26,"value":341},{"type":20,"tag":53,"props":1231,"children":1233},{"class":55,"line":1232},66,[1234,1238,1242],{"type":20,"tag":53,"props":1235,"children":1236},{"style":306},[1237],{"type":26,"value":535},{"type":20,"tag":53,"props":1239,"children":1240},{"style":312},[1241],{"type":26,"value":385},{"type":20,"tag":53,"props":1243,"children":1244},{"style":326},[1245],{"type":26,"value":544},{"type":20,"tag":53,"props":1247,"children":1249},{"class":55,"line":1248},67,[1250,1254],{"type":20,"tag":53,"props":1251,"children":1252},{"style":306},[1253],{"type":26,"value":552},{"type":20,"tag":53,"props":1255,"children":1256},{"style":312},[1257],{"type":26,"value":315},{"type":20,"tag":53,"props":1259,"children":1261},{"class":55,"line":1260},68,[1262,1266],{"type":20,"tag":53,"props":1263,"children":1264},{"style":312},[1265],{"type":26,"value":564},{"type":20,"tag":53,"props":1267,"children":1268},{"style":326},[1269],{"type":26,"value":569},{"type":20,"tag":53,"props":1271,"children":1273},{"class":55,"line":1272},69,[1274,1278],{"type":20,"tag":53,"props":1275,"children":1276},{"style":312},[1277],{"type":26,"value":564},{"type":20,"tag":53,"props":1279,"children":1280},{"style":326},[1281],{"type":26,"value":1282}," npm run test:integration\n",{"type":20,"tag":53,"props":1284,"children":1286},{"class":55,"line":1285},70,[1287,1291],{"type":20,"tag":53,"props":1288,"children":1289},{"style":306},[1290],{"type":26,"value":643},{"type":20,"tag":53,"props":1292,"children":1293},{"style":312},[1294],{"type":26,"value":315},{"type":20,"tag":53,"props":1296,"children":1298},{"class":55,"line":1297},71,[1299,1303,1307,1311],{"type":20,"tag":53,"props":1300,"children":1301},{"style":312},[1302],{"type":26,"value":564},{"type":20,"tag":53,"props":1304,"children":1305},{"style":306},[1306],{"type":26,"value":659},{"type":20,"tag":53,"props":1308,"children":1309},{"style":312},[1310],{"type":26,"value":385},{"type":20,"tag":53,"props":1312,"children":1313},{"style":326},[1314],{"type":26,"value":688},{"type":20,"tag":53,"props":1316,"children":1318},{"class":55,"line":1317},72,[1319,1323,1327,1331],{"type":20,"tag":53,"props":1320,"children":1321},{"style":312},[1322],{"type":26,"value":564},{"type":20,"tag":53,"props":1324,"children":1325},{"style":306},[1326],{"type":26,"value":659},{"type":20,"tag":53,"props":1328,"children":1329},{"style":312},[1330],{"type":26,"value":385},{"type":20,"tag":53,"props":1332,"children":1333},{"style":326},[1334],{"type":26,"value":709},{"type":20,"tag":53,"props":1336,"children":1338},{"class":55,"line":1337},73,[1339],{"type":20,"tag":53,"props":1340,"children":1341},{"emptyLinePlaceholder":115},[1342],{"type":26,"value":118},{"type":20,"tag":53,"props":1344,"children":1346},{"class":55,"line":1345},74,[1347,1352],{"type":20,"tag":53,"props":1348,"children":1349},{"style":306},[1350],{"type":26,"value":1351},"security-scan",{"type":20,"tag":53,"props":1353,"children":1354},{"style":312},[1355],{"type":26,"value":315},{"type":20,"tag":53,"props":1357,"children":1359},{"class":55,"line":1358},75,[1360,1364,1368],{"type":20,"tag":53,"props":1361,"children":1362},{"style":306},[1363],{"type":26,"value":519},{"type":20,"tag":53,"props":1365,"children":1366},{"style":312},[1367],{"type":26,"value":385},{"type":20,"tag":53,"props":1369,"children":1370},{"style":326},[1371],{"type":26,"value":341},{"type":20,"tag":53,"props":1373,"children":1375},{"class":55,"line":1374},76,[1376,1380],{"type":20,"tag":53,"props":1377,"children":1378},{"style":306},[1379],{"type":26,"value":535},{"type":20,"tag":53,"props":1381,"children":1382},{"style":312},[1383],{"type":26,"value":315},{"type":20,"tag":53,"props":1385,"children":1387},{"class":55,"line":1386},77,[1388,1393,1397],{"type":20,"tag":53,"props":1389,"children":1390},{"style":306},[1391],{"type":26,"value":1392},"    name",{"type":20,"tag":53,"props":1394,"children":1395},{"style":312},[1396],{"type":26,"value":385},{"type":20,"tag":53,"props":1398,"children":1399},{"style":326},[1400],{"type":26,"value":1401}," aquasec/trivy:latest\n",{"type":20,"tag":53,"props":1403,"children":1405},{"class":55,"line":1404},78,[1406,1411,1415,1420,1425],{"type":20,"tag":53,"props":1407,"children":1408},{"style":306},[1409],{"type":26,"value":1410},"    entrypoint",{"type":20,"tag":53,"props":1412,"children":1413},{"style":312},[1414],{"type":26,"value":385},{"type":20,"tag":53,"props":1416,"children":1417},{"style":312},[1418],{"type":26,"value":1419}," [",{"type":20,"tag":53,"props":1421,"children":1422},{"style":388},[1423],{"type":26,"value":1424},"\"\"",{"type":20,"tag":53,"props":1426,"children":1427},{"style":312},[1428],{"type":26,"value":1429},"]\n",{"type":20,"tag":53,"props":1431,"children":1433},{"class":55,"line":1432},79,[1434,1438],{"type":20,"tag":53,"props":1435,"children":1436},{"style":306},[1437],{"type":26,"value":552},{"type":20,"tag":53,"props":1439,"children":1440},{"style":312},[1441],{"type":26,"value":315},{"type":20,"tag":53,"props":1443,"children":1445},{"class":55,"line":1444},80,[1446,1450],{"type":20,"tag":53,"props":1447,"children":1448},{"style":312},[1449],{"type":26,"value":564},{"type":20,"tag":53,"props":1451,"children":1452},{"style":326},[1453],{"type":26,"value":1454}," trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE_NAME:$IMAGE_TAG\n",{"type":20,"tag":53,"props":1456,"children":1458},{"class":55,"line":1457},81,[1459,1464,1468],{"type":20,"tag":53,"props":1460,"children":1461},{"style":306},[1462],{"type":26,"value":1463},"  allow_failure",{"type":20,"tag":53,"props":1465,"children":1466},{"style":312},[1467],{"type":26,"value":385},{"type":20,"tag":53,"props":1469,"children":1471},{"style":1470},"--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF",[1472],{"type":26,"value":1473}," false\n",{"type":20,"tag":53,"props":1475,"children":1477},{"class":55,"line":1476},82,[1478,1482],{"type":20,"tag":53,"props":1479,"children":1480},{"style":306},[1481],{"type":26,"value":643},{"type":20,"tag":53,"props":1483,"children":1484},{"style":312},[1485],{"type":26,"value":315},{"type":20,"tag":53,"props":1487,"children":1489},{"class":55,"line":1488},83,[1490,1494,1498,1502],{"type":20,"tag":53,"props":1491,"children":1492},{"style":312},[1493],{"type":26,"value":564},{"type":20,"tag":53,"props":1495,"children":1496},{"style":306},[1497],{"type":26,"value":659},{"type":20,"tag":53,"props":1499,"children":1500},{"style":312},[1501],{"type":26,"value":385},{"type":20,"tag":53,"props":1503,"children":1504},{"style":326},[1505],{"type":26,"value":709},{"type":20,"tag":53,"props":1507,"children":1509},{"class":55,"line":1508},84,[1510],{"type":20,"tag":53,"props":1511,"children":1512},{"emptyLinePlaceholder":115},[1513],{"type":26,"value":118},{"type":20,"tag":53,"props":1515,"children":1517},{"class":55,"line":1516},85,[1518],{"type":20,"tag":53,"props":1519,"children":1520},{"style":489},[1521],{"type":26,"value":1522},"# ---------- DEPLOY STAGE ----------\n",{"type":20,"tag":53,"props":1524,"children":1526},{"class":55,"line":1525},86,[1527],{"type":20,"tag":53,"props":1528,"children":1529},{"emptyLinePlaceholder":115},[1530],{"type":26,"value":118},{"type":20,"tag":53,"props":1532,"children":1534},{"class":55,"line":1533},87,[1535,1540,1544,1550],{"type":20,"tag":53,"props":1536,"children":1537},{"style":306},[1538],{"type":26,"value":1539},".deploy_template",{"type":20,"tag":53,"props":1541,"children":1542},{"style":312},[1543],{"type":26,"value":385},{"type":20,"tag":53,"props":1545,"children":1547},{"style":1546},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit",[1548],{"type":26,"value":1549}," &",{"type":20,"tag":53,"props":1551,"children":1553},{"style":1552},"--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0",[1554],{"type":26,"value":1555},"deploy_template\n",{"type":20,"tag":53,"props":1557,"children":1559},{"class":55,"line":1558},88,[1560,1564,1568],{"type":20,"tag":53,"props":1561,"children":1562},{"style":306},[1563],{"type":26,"value":519},{"type":20,"tag":53,"props":1565,"children":1566},{"style":312},[1567],{"type":26,"value":385},{"type":20,"tag":53,"props":1569,"children":1570},{"style":326},[1571],{"type":26,"value":353},{"type":20,"tag":53,"props":1573,"children":1575},{"class":55,"line":1574},89,[1576,1580,1584],{"type":20,"tag":53,"props":1577,"children":1578},{"style":306},[1579],{"type":26,"value":535},{"type":20,"tag":53,"props":1581,"children":1582},{"style":312},[1583],{"type":26,"value":385},{"type":20,"tag":53,"props":1585,"children":1586},{"style":60},[1587],{"type":26,"value":1588}," \n",{"type":20,"tag":53,"props":1590,"children":1592},{"class":55,"line":1591},90,[1593,1597,1601],{"type":20,"tag":53,"props":1594,"children":1595},{"style":306},[1596],{"type":26,"value":1392},{"type":20,"tag":53,"props":1598,"children":1599},{"style":312},[1600],{"type":26,"value":385},{"type":20,"tag":53,"props":1602,"children":1603},{"style":326},[1604],{"type":26,"value":1605}," amazon/aws-cli:latest\n",{"type":20,"tag":53,"props":1607,"children":1609},{"class":55,"line":1608},91,[1610,1614,1618,1622,1626],{"type":20,"tag":53,"props":1611,"children":1612},{"style":306},[1613],{"type":26,"value":1410},{"type":20,"tag":53,"props":1615,"children":1616},{"style":312},[1617],{"type":26,"value":385},{"type":20,"tag":53,"props":1619,"children":1620},{"style":312},[1621],{"type":26,"value":1419},{"type":20,"tag":53,"props":1623,"children":1624},{"style":388},[1625],{"type":26,"value":1424},{"type":20,"tag":53,"props":1627,"children":1628},{"style":312},[1629],{"type":26,"value":1429},{"type":20,"tag":53,"props":1631,"children":1633},{"class":55,"line":1632},92,[1634,1638],{"type":20,"tag":53,"props":1635,"children":1636},{"style":306},[1637],{"type":26,"value":1042},{"type":20,"tag":53,"props":1639,"children":1640},{"style":312},[1641],{"type":26,"value":315},{"type":20,"tag":53,"props":1643,"children":1645},{"class":55,"line":1644},93,[1646,1650],{"type":20,"tag":53,"props":1647,"children":1648},{"style":312},[1649],{"type":26,"value":564},{"type":20,"tag":53,"props":1651,"children":1652},{"style":326},[1653],{"type":26,"value":1654}," yum install -y jq\n",{"type":20,"tag":53,"props":1656,"children":1658},{"class":55,"line":1657},94,[1659,1663],{"type":20,"tag":53,"props":1660,"children":1661},{"style":306},[1662],{"type":26,"value":552},{"type":20,"tag":53,"props":1664,"children":1665},{"style":312},[1666],{"type":26,"value":315},{"type":20,"tag":53,"props":1668,"children":1670},{"class":55,"line":1669},95,[1671,1675],{"type":20,"tag":53,"props":1672,"children":1673},{"style":312},[1674],{"type":26,"value":564},{"type":20,"tag":53,"props":1676,"children":1677},{"style":1546},[1678],{"type":26,"value":1679}," |\n",{"type":20,"tag":53,"props":1681,"children":1683},{"class":55,"line":1682},96,[1684],{"type":20,"tag":53,"props":1685,"children":1686},{"style":326},[1687],{"type":26,"value":1688},"      # Update ECS service with new task definition\n",{"type":20,"tag":53,"props":1690,"children":1692},{"class":55,"line":1691},97,[1693],{"type":20,"tag":53,"props":1694,"children":1695},{"style":326},[1696],{"type":26,"value":1697},"      TASK_DEF=$(aws ecs describe-task-definition --task-definition $TASK_FAMILY --region $AWS_REGION)\n",{"type":20,"tag":53,"props":1699,"children":1701},{"class":55,"line":1700},98,[1702],{"type":20,"tag":53,"props":1703,"children":1704},{"style":326},[1705],{"type":26,"value":1706},"      \n",{"type":20,"tag":53,"props":1708,"children":1710},{"class":55,"line":1709},99,[1711],{"type":20,"tag":53,"props":1712,"children":1713},{"style":326},[1714],{"type":26,"value":1715},"      # Create new task definition revision with updated image\n",{"type":20,"tag":53,"props":1717,"children":1719},{"class":55,"line":1718},100,[1720],{"type":20,"tag":53,"props":1721,"children":1722},{"style":326},[1723],{"type":26,"value":1724},"      NEW_TASK_DEF=$(echo $TASK_DEF | jq --arg IMAGE \"$IMAGE_NAME:$IMAGE_TAG\" \\\n",{"type":20,"tag":53,"props":1726,"children":1728},{"class":55,"line":1727},101,[1729],{"type":20,"tag":53,"props":1730,"children":1731},{"style":326},[1732],{"type":26,"value":1733},"        '.taskDefinition | .containerDefinitions[0].image = $IMAGE | \n",{"type":20,"tag":53,"props":1735,"children":1737},{"class":55,"line":1736},102,[1738],{"type":20,"tag":53,"props":1739,"children":1740},{"style":326},[1741],{"type":26,"value":1742},"        del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)')\n",{"type":20,"tag":53,"props":1744,"children":1746},{"class":55,"line":1745},103,[1747],{"type":20,"tag":53,"props":1748,"children":1749},{"style":326},[1750],{"type":26,"value":1706},{"type":20,"tag":53,"props":1752,"children":1754},{"class":55,"line":1753},104,[1755],{"type":20,"tag":53,"props":1756,"children":1757},{"style":326},[1758],{"type":26,"value":1759},"      NEW_REVISION=$(aws ecs register-task-definition --region $AWS_REGION --cli-input-json \"$NEW_TASK_DEF\" | jq -r '.taskDefinition.taskDefinitionArn')\n",{"type":20,"tag":53,"props":1761,"children":1763},{"class":55,"line":1762},105,[1764],{"type":20,"tag":53,"props":1765,"children":1766},{"style":326},[1767],{"type":26,"value":1706},{"type":20,"tag":53,"props":1769,"children":1771},{"class":55,"line":1770},106,[1772],{"type":20,"tag":53,"props":1773,"children":1774},{"style":326},[1775],{"type":26,"value":1776},"      # Update service\n",{"type":20,"tag":53,"props":1778,"children":1780},{"class":55,"line":1779},107,[1781],{"type":20,"tag":53,"props":1782,"children":1783},{"style":326},[1784],{"type":26,"value":1785},"      aws ecs update-service \\\n",{"type":20,"tag":53,"props":1787,"children":1789},{"class":55,"line":1788},108,[1790],{"type":20,"tag":53,"props":1791,"children":1792},{"style":326},[1793],{"type":26,"value":1794},"        --cluster $ECS_CLUSTER \\\n",{"type":20,"tag":53,"props":1796,"children":1798},{"class":55,"line":1797},109,[1799],{"type":20,"tag":53,"props":1800,"children":1801},{"style":326},[1802],{"type":26,"value":1803},"        --service $SERVICE_NAME \\\n",{"type":20,"tag":53,"props":1805,"children":1807},{"class":55,"line":1806},110,[1808],{"type":20,"tag":53,"props":1809,"children":1810},{"style":326},[1811],{"type":26,"value":1812},"        --task-definition $NEW_REVISION \\\n",{"type":20,"tag":53,"props":1814,"children":1816},{"class":55,"line":1815},111,[1817],{"type":20,"tag":53,"props":1818,"children":1819},{"style":326},[1820],{"type":26,"value":1821},"        --region $AWS_REGION\n",{"type":20,"tag":53,"props":1823,"children":1825},{"class":55,"line":1824},112,[1826],{"type":20,"tag":53,"props":1827,"children":1828},{"style":326},[1829],{"type":26,"value":1706},{"type":20,"tag":53,"props":1831,"children":1833},{"class":55,"line":1832},113,[1834],{"type":20,"tag":53,"props":1835,"children":1836},{"style":326},[1837],{"type":26,"value":1838},"      # Wait for deployment to stabilize\n",{"type":20,"tag":53,"props":1840,"children":1842},{"class":55,"line":1841},114,[1843],{"type":20,"tag":53,"props":1844,"children":1845},{"style":326},[1846],{"type":26,"value":1847},"      aws ecs wait services-stable \\\n",{"type":20,"tag":53,"props":1849,"children":1851},{"class":55,"line":1850},115,[1852],{"type":20,"tag":53,"props":1853,"children":1854},{"style":326},[1855],{"type":26,"value":1794},{"type":20,"tag":53,"props":1857,"children":1859},{"class":55,"line":1858},116,[1860],{"type":20,"tag":53,"props":1861,"children":1862},{"style":326},[1863],{"type":26,"value":1864},"        --services $SERVICE_NAME \\\n",{"type":20,"tag":53,"props":1866,"children":1868},{"class":55,"line":1867},117,[1869],{"type":20,"tag":53,"props":1870,"children":1871},{"style":326},[1872],{"type":26,"value":1821},{"type":20,"tag":53,"props":1874,"children":1876},{"class":55,"line":1875},118,[1877],{"type":20,"tag":53,"props":1878,"children":1879},{"emptyLinePlaceholder":115},[1880],{"type":26,"value":118},{"type":20,"tag":53,"props":1882,"children":1884},{"class":55,"line":1883},119,[1885,1890],{"type":20,"tag":53,"props":1886,"children":1887},{"style":306},[1888],{"type":26,"value":1889},"deploy-staging",{"type":20,"tag":53,"props":1891,"children":1892},{"style":312},[1893],{"type":26,"value":315},{"type":20,"tag":53,"props":1895,"children":1897},{"class":55,"line":1896},120,[1898,1904,1908,1913],{"type":20,"tag":53,"props":1899,"children":1901},{"style":1900},"--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF",[1902],{"type":26,"value":1903},"  \u003C\u003C",{"type":20,"tag":53,"props":1905,"children":1906},{"style":312},[1907],{"type":26,"value":385},{"type":20,"tag":53,"props":1909,"children":1910},{"style":1546},[1911],{"type":26,"value":1912}," *",{"type":20,"tag":53,"props":1914,"children":1915},{"style":60},[1916],{"type":26,"value":1555},{"type":20,"tag":53,"props":1918,"children":1920},{"class":55,"line":1919},121,[1921,1926],{"type":20,"tag":53,"props":1922,"children":1923},{"style":306},[1924],{"type":26,"value":1925},"  variables",{"type":20,"tag":53,"props":1927,"children":1928},{"style":312},[1929],{"type":26,"value":315},{"type":20,"tag":53,"props":1931,"children":1933},{"class":55,"line":1932},122,[1934,1939,1943],{"type":20,"tag":53,"props":1935,"children":1936},{"style":306},[1937],{"type":26,"value":1938},"    ECS_CLUSTER",{"type":20,"tag":53,"props":1940,"children":1941},{"style":312},[1942],{"type":26,"value":385},{"type":20,"tag":53,"props":1944,"children":1945},{"style":326},[1946],{"type":26,"value":1947}," staging-cluster\n",{"type":20,"tag":53,"props":1949,"children":1951},{"class":55,"line":1950},123,[1952,1957,1961],{"type":20,"tag":53,"props":1953,"children":1954},{"style":306},[1955],{"type":26,"value":1956},"    SERVICE_NAME",{"type":20,"tag":53,"props":1958,"children":1959},{"style":312},[1960],{"type":26,"value":385},{"type":20,"tag":53,"props":1962,"children":1963},{"style":326},[1964],{"type":26,"value":1965}," ${CI_PROJECT_NAME}-staging\n",{"type":20,"tag":53,"props":1967,"children":1969},{"class":55,"line":1968},124,[1970,1975,1979],{"type":20,"tag":53,"props":1971,"children":1972},{"style":306},[1973],{"type":26,"value":1974},"    TASK_FAMILY",{"type":20,"tag":53,"props":1976,"children":1977},{"style":312},[1978],{"type":26,"value":385},{"type":20,"tag":53,"props":1980,"children":1981},{"style":326},[1982],{"type":26,"value":1965},{"type":20,"tag":53,"props":1984,"children":1986},{"class":55,"line":1985},125,[1987,1992],{"type":20,"tag":53,"props":1988,"children":1989},{"style":306},[1990],{"type":26,"value":1991},"  environment",{"type":20,"tag":53,"props":1993,"children":1994},{"style":312},[1995],{"type":26,"value":315},{"type":20,"tag":53,"props":1997,"children":1999},{"class":55,"line":1998},126,[2000,2004,2008],{"type":20,"tag":53,"props":2001,"children":2002},{"style":306},[2003],{"type":26,"value":1392},{"type":20,"tag":53,"props":2005,"children":2006},{"style":312},[2007],{"type":26,"value":385},{"type":20,"tag":53,"props":2009,"children":2010},{"style":326},[2011],{"type":26,"value":2012}," staging\n",{"type":20,"tag":53,"props":2014,"children":2016},{"class":55,"line":2015},127,[2017,2022,2026],{"type":20,"tag":53,"props":2018,"children":2019},{"style":306},[2020],{"type":26,"value":2021},"    url",{"type":20,"tag":53,"props":2023,"children":2024},{"style":312},[2025],{"type":26,"value":385},{"type":20,"tag":53,"props":2027,"children":2028},{"style":326},[2029],{"type":26,"value":2030}," https://staging.example.com\n",{"type":20,"tag":53,"props":2032,"children":2034},{"class":55,"line":2033},128,[2035,2039],{"type":20,"tag":53,"props":2036,"children":2037},{"style":306},[2038],{"type":26,"value":643},{"type":20,"tag":53,"props":2040,"children":2041},{"style":312},[2042],{"type":26,"value":315},{"type":20,"tag":53,"props":2044,"children":2046},{"class":55,"line":2045},129,[2047,2051,2055,2059],{"type":20,"tag":53,"props":2048,"children":2049},{"style":312},[2050],{"type":26,"value":564},{"type":20,"tag":53,"props":2052,"children":2053},{"style":306},[2054],{"type":26,"value":659},{"type":20,"tag":53,"props":2056,"children":2057},{"style":312},[2058],{"type":26,"value":385},{"type":20,"tag":53,"props":2060,"children":2061},{"style":326},[2062],{"type":26,"value":688},{"type":20,"tag":53,"props":2064,"children":2066},{"class":55,"line":2065},130,[2067],{"type":20,"tag":53,"props":2068,"children":2069},{"emptyLinePlaceholder":115},[2070],{"type":26,"value":118},{"type":20,"tag":53,"props":2072,"children":2074},{"class":55,"line":2073},131,[2075,2080],{"type":20,"tag":53,"props":2076,"children":2077},{"style":306},[2078],{"type":26,"value":2079},"deploy-production",{"type":20,"tag":53,"props":2081,"children":2082},{"style":312},[2083],{"type":26,"value":315},{"type":20,"tag":53,"props":2085,"children":2087},{"class":55,"line":2086},132,[2088,2092,2096,2100],{"type":20,"tag":53,"props":2089,"children":2090},{"style":1900},[2091],{"type":26,"value":1903},{"type":20,"tag":53,"props":2093,"children":2094},{"style":312},[2095],{"type":26,"value":385},{"type":20,"tag":53,"props":2097,"children":2098},{"style":1546},[2099],{"type":26,"value":1912},{"type":20,"tag":53,"props":2101,"children":2102},{"style":60},[2103],{"type":26,"value":1555},{"type":20,"tag":53,"props":2105,"children":2107},{"class":55,"line":2106},133,[2108,2112],{"type":20,"tag":53,"props":2109,"children":2110},{"style":306},[2111],{"type":26,"value":1925},{"type":20,"tag":53,"props":2113,"children":2114},{"style":312},[2115],{"type":26,"value":315},{"type":20,"tag":53,"props":2117,"children":2119},{"class":55,"line":2118},134,[2120,2124,2128],{"type":20,"tag":53,"props":2121,"children":2122},{"style":306},[2123],{"type":26,"value":1938},{"type":20,"tag":53,"props":2125,"children":2126},{"style":312},[2127],{"type":26,"value":385},{"type":20,"tag":53,"props":2129,"children":2130},{"style":326},[2131],{"type":26,"value":2132}," production-cluster\n",{"type":20,"tag":53,"props":2134,"children":2136},{"class":55,"line":2135},135,[2137,2141,2145],{"type":20,"tag":53,"props":2138,"children":2139},{"style":306},[2140],{"type":26,"value":1956},{"type":20,"tag":53,"props":2142,"children":2143},{"style":312},[2144],{"type":26,"value":385},{"type":20,"tag":53,"props":2146,"children":2147},{"style":326},[2148],{"type":26,"value":2149}," ${CI_PROJECT_NAME}-production\n",{"type":20,"tag":53,"props":2151,"children":2153},{"class":55,"line":2152},136,[2154,2158,2162],{"type":20,"tag":53,"props":2155,"children":2156},{"style":306},[2157],{"type":26,"value":1974},{"type":20,"tag":53,"props":2159,"children":2160},{"style":312},[2161],{"type":26,"value":385},{"type":20,"tag":53,"props":2163,"children":2164},{"style":326},[2165],{"type":26,"value":2149},{"type":20,"tag":53,"props":2167,"children":2169},{"class":55,"line":2168},137,[2170,2174],{"type":20,"tag":53,"props":2171,"children":2172},{"style":306},[2173],{"type":26,"value":1991},{"type":20,"tag":53,"props":2175,"children":2176},{"style":312},[2177],{"type":26,"value":315},{"type":20,"tag":53,"props":2179,"children":2181},{"class":55,"line":2180},138,[2182,2186,2190],{"type":20,"tag":53,"props":2183,"children":2184},{"style":306},[2185],{"type":26,"value":1392},{"type":20,"tag":53,"props":2187,"children":2188},{"style":312},[2189],{"type":26,"value":385},{"type":20,"tag":53,"props":2191,"children":2192},{"style":326},[2193],{"type":26,"value":2194}," production\n",{"type":20,"tag":53,"props":2196,"children":2198},{"class":55,"line":2197},139,[2199,2203,2207],{"type":20,"tag":53,"props":2200,"children":2201},{"style":306},[2202],{"type":26,"value":2021},{"type":20,"tag":53,"props":2204,"children":2205},{"style":312},[2206],{"type":26,"value":385},{"type":20,"tag":53,"props":2208,"children":2209},{"style":326},[2210],{"type":26,"value":2211}," https://app.example.com\n",{"type":20,"tag":53,"props":2213,"children":2215},{"class":55,"line":2214},140,[2216,2220],{"type":20,"tag":53,"props":2217,"children":2218},{"style":306},[2219],{"type":26,"value":643},{"type":20,"tag":53,"props":2221,"children":2222},{"style":312},[2223],{"type":26,"value":315},{"type":20,"tag":53,"props":2225,"children":2227},{"class":55,"line":2226},141,[2228,2232,2236,2240],{"type":20,"tag":53,"props":2229,"children":2230},{"style":312},[2231],{"type":26,"value":564},{"type":20,"tag":53,"props":2233,"children":2234},{"style":306},[2235],{"type":26,"value":659},{"type":20,"tag":53,"props":2237,"children":2238},{"style":312},[2239],{"type":26,"value":385},{"type":20,"tag":53,"props":2241,"children":2242},{"style":326},[2243],{"type":26,"value":709},{"type":20,"tag":53,"props":2245,"children":2247},{"class":55,"line":2246},142,[2248,2253,2257],{"type":20,"tag":53,"props":2249,"children":2250},{"style":306},[2251],{"type":26,"value":2252},"  when",{"type":20,"tag":53,"props":2254,"children":2255},{"style":312},[2256],{"type":26,"value":385},{"type":20,"tag":53,"props":2258,"children":2259},{"style":326},[2260],{"type":26,"value":2261}," manual\n",{"type":20,"tag":35,"props":2263,"children":2265},{"id":2264},"key-design-choices",[2266],{"type":26,"value":2267},"Key Design Choices",{"type":20,"tag":2269,"props":2270,"children":2272},"h3",{"id":2271},"why-this-structure-works",[2273],{"type":26,"value":2274},"Why this structure works",{"type":20,"tag":2276,"props":2277,"children":2278},"ol",{},[2279,2291,2309,2319,2329],{"type":20,"tag":2280,"props":2281,"children":2282},"li",{},[2283,2289],{"type":20,"tag":2284,"props":2285,"children":2286},"strong",{},[2287],{"type":26,"value":2288},"Parallel build jobs",{"type":26,"value":2290}," — Lint, tests, and Docker build run concurrently where possible",{"type":20,"tag":2280,"props":2292,"children":2293},{},[2294,2299,2301,2307],{"type":20,"tag":2284,"props":2295,"children":2296},{},[2297],{"type":26,"value":2298},"Cache strategy",{"type":26,"value":2300}," — ",{"type":20,"tag":49,"props":2302,"children":2304},{"className":2303},[],[2305],{"type":26,"value":2306},"node_modules",{"type":26,"value":2308}," cached by branch slug to speed up npm installs",{"type":20,"tag":2280,"props":2310,"children":2311},{},[2312,2317],{"type":20,"tag":2284,"props":2313,"children":2314},{},[2315],{"type":26,"value":2316},"Security gate",{"type":26,"value":2318}," — Trivy scans block deployment if HIGH/CRITICAL vulnerabilities are found",{"type":20,"tag":2280,"props":2320,"children":2321},{},[2322,2327],{"type":20,"tag":2284,"props":2323,"children":2324},{},[2325],{"type":26,"value":2326},"Manual production deploy",{"type":26,"value":2328}," — Staging auto-deploys, production requires a human click",{"type":20,"tag":2280,"props":2330,"children":2331},{},[2332,2337],{"type":20,"tag":2284,"props":2333,"children":2334},{},[2335],{"type":26,"value":2336},"ECS wait",{"type":26,"value":2338}," — Pipeline only succeeds if the deployment actually stabilizes",{"type":20,"tag":2269,"props":2340,"children":2342},{"id":2341},"rollback-strategy",[2343],{"type":26,"value":2344},"Rollback Strategy",{"type":20,"tag":29,"props":2346,"children":2347},{},[2348],{"type":26,"value":2349},"The ECS deployment circuit breaker handles most rollbacks automatically. For manual rollbacks:",{"type":20,"tag":42,"props":2351,"children":2355},{"className":2352,"code":2353,"language":2354,"meta":7,"style":7},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# Quick rollback to previous task definition\naws ecs update-service \\\n  --cluster production-cluster \\\n  --service my-service \\\n  --task-definition my-service:PREVIOUS_REVISION\n","bash",[2356],{"type":20,"tag":49,"props":2357,"children":2358},{"__ignoreMap":7},[2359,2367,2390,2408,2425],{"type":20,"tag":53,"props":2360,"children":2361},{"class":55,"line":56},[2362],{"type":20,"tag":53,"props":2363,"children":2364},{"style":489},[2365],{"type":26,"value":2366},"# Quick rollback to previous task definition\n",{"type":20,"tag":53,"props":2368,"children":2369},{"class":55,"line":66},[2370,2374,2379,2384],{"type":20,"tag":53,"props":2371,"children":2372},{"style":1552},[2373],{"type":26,"value":12},{"type":20,"tag":53,"props":2375,"children":2376},{"style":326},[2377],{"type":26,"value":2378}," ecs",{"type":20,"tag":53,"props":2380,"children":2381},{"style":326},[2382],{"type":26,"value":2383}," update-service",{"type":20,"tag":53,"props":2385,"children":2387},{"style":2386},"--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF",[2388],{"type":26,"value":2389}," \\\n",{"type":20,"tag":53,"props":2391,"children":2392},{"class":55,"line":75},[2393,2399,2404],{"type":20,"tag":53,"props":2394,"children":2396},{"style":2395},"--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF",[2397],{"type":26,"value":2398},"  --cluster",{"type":20,"tag":53,"props":2400,"children":2401},{"style":326},[2402],{"type":26,"value":2403}," production-cluster",{"type":20,"tag":53,"props":2405,"children":2406},{"style":2386},[2407],{"type":26,"value":2389},{"type":20,"tag":53,"props":2409,"children":2410},{"class":55,"line":84},[2411,2416,2421],{"type":20,"tag":53,"props":2412,"children":2413},{"style":2395},[2414],{"type":26,"value":2415},"  --service",{"type":20,"tag":53,"props":2417,"children":2418},{"style":326},[2419],{"type":26,"value":2420}," my-service",{"type":20,"tag":53,"props":2422,"children":2423},{"style":2386},[2424],{"type":26,"value":2389},{"type":20,"tag":53,"props":2426,"children":2427},{"class":55,"line":93},[2428,2433],{"type":20,"tag":53,"props":2429,"children":2430},{"style":2395},[2431],{"type":26,"value":2432},"  --task-definition",{"type":20,"tag":53,"props":2434,"children":2435},{"style":326},[2436],{"type":26,"value":2437}," my-service:PREVIOUS_REVISION\n",{"type":20,"tag":35,"props":2439,"children":2441},{"id":2440},"results",[2442],{"type":26,"value":2443},"Results",{"type":20,"tag":2445,"props":2446,"children":2447},"ul",{},[2448,2458,2468,2478],{"type":20,"tag":2280,"props":2449,"children":2450},{},[2451,2456],{"type":20,"tag":2284,"props":2452,"children":2453},{},[2454],{"type":26,"value":2455},"2 hours → 15 minutes",{"type":26,"value":2457}," deployment time",{"type":20,"tag":2280,"props":2459,"children":2460},{},[2461,2466],{"type":20,"tag":2284,"props":2462,"children":2463},{},[2464],{"type":26,"value":2465},"250+ deployments per month",{"type":26,"value":2467}," across all services",{"type":20,"tag":2280,"props":2469,"children":2470},{},[2471,2476],{"type":20,"tag":2284,"props":2472,"children":2473},{},[2474],{"type":26,"value":2475},"\u003C 5% change failure rate",{"type":26,"value":2477}," thanks to automated testing and security scanning",{"type":20,"tag":2280,"props":2479,"children":2480},{},[2481,2486],{"type":20,"tag":2284,"props":2482,"children":2483},{},[2484],{"type":26,"value":2485},"Zero manual interventions",{"type":26,"value":2487}," for rollbacks — circuit breaker handles it",{"type":20,"tag":2489,"props":2490,"children":2491},"style",{},[2492],{"type":26,"value":2493},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":66,"depth":66,"links":2495},[2496,2497,2498,2502],{"id":37,"depth":66,"text":40},{"id":288,"depth":66,"text":291},{"id":2264,"depth":66,"text":2267,"children":2499},[2500,2501],{"id":2271,"depth":75,"text":2274},{"id":2341,"depth":75,"text":2344},{"id":2440,"depth":66,"text":2443},"markdown","content:codes:gitlab-ci-pipeline.md","content","codes/gitlab-ci-pipeline.md","codes/gitlab-ci-pipeline","md",1782460598424]