24.8.2023

Gitlab review apps mit dem aws cdk

Mit gitlab review apps kann für jeden merge request ein environment gestartet werden um die gemachten änderungen direkt zu testen, ohne den MR extra auschecken zu müssen. Das erlaubt für schnellere reviews und außerdem leuten ohne programmierkenntnisse, z.B. aus dem Marketing feedback am MR zu geben.

Ich habe mal versucht, review apps für unserer Homepage zu aktivieren.

Da wir unsere Homepage mit dem aws cdk deployen, war das gar nicht so schwierig:

  • ich musste die cdk.ts anpassen, um den stack dynamisch anhand von environment variablen zu erstellen:

    const ENV_NAME = process.env.HOMEPAGE_ENV_NAME;
    const ENV_TYPE = process.env.HOMEPAGE_ENV_TYPE;
    
    if (ENV_NAME && ENV_TYPE) {
      new CdkStack(app, ENV_NAME, {
        tags: {
          Project: "Homepage",
          responsible: "lucas.meurer@newcubator.com",
          environment: ENV_TYPE,
        },
      });
    } else {
      throw new Error(
        "Missing environment variables: HOMEPAGE_ENV_NAME, HOMEPAGE_ENV_TYPE",
      );
    }
  • Scripts in der package.json anpassen:

        "cdk": "cdk",
        "cdk:deploy": "cdk deploy ${HOMEPAGE_ENV_NAME} --require-approval never --outputs-file ./cdk.out.json",
        "cdk:destroy": "cdk destroy ${HOMEPAGE_ENV_NAME} --require-approval never",
  • Ein script schreiben welches den output vom cdk parsed um an die deployte url zu kommen:

    cat cdk.out.json
    DYNAMIC_ENVIRONMENT_URL=https://$(cat cdk.out.json | jq -r --arg env_name "$HOMEPAGE_ENV_NAME" '.[$env_name].AppRunnerServiceURL')
    
    echo "Deployed successfully to $DYNAMIC_ENVIRONMENT_URL 🚀"
    
    echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env
  • Die gitlab-ci.yml anpassen um entsprechende pipelines zu erstellen:

    
    .deploy:
      extends: .default
      stage: deploy
      services:
        - docker:24.0.5-dind
      variables:
        DOCKER_HOST: tcp://docker:2375
      script:
        - npm run cdk:deploy
        - ./scripts/parse_cdk_output.sh.  # sucht in der cdk.out.json nach der deployten url
      artifacts:
        reports:
          dotenv: deploy.env              # lässt gitlab wissen, das es hier nach evironment variablen schauen soll
      environment:
        url: $DYNAMIC_ENVIRONMENT_URL.    # nach dem job wird dies aus der deploy.env geholt
    
    deployReview:
      extends: .deploy
      needs: ["build-and-push"]
      except:
        - main
      variables:
        HOMEPAGE_ENV_NAME: NextLevelHomepageReview-$CI_COMMIT_REF_SLUG
        HOMEPAGE_ENV_TYPE: preview
      environment:
        name: Review/$CI_COMMIT_REF_NAME
        deployment_tier: testing
        on_stop: stopReview
        auto_stop_in: 1 week
      resource_group: preview
    
    stopReview:
      stage: deploy
      when: manual
      needs: []
      except:
        - main
      services:
        - docker:24.0.5-dind
      variables:
        DOCKER_HOST: tcp://docker:2375
        HOMEPAGE_ENV_NAME: NextLevelHomepageReview-$CI_COMMIT_REF_SLUG
      script:
        - npm run cdk:destroy
      environment:
        name: Review/$CI_COMMIT_REF_NAME
        action: stop
        on_stop: stopReview
      resource_group: preview

Sobald newcubator/marketing/homepage!913 (merged) gemerged ist, sind die review apps aktiv.

Aktuell sind die domains der review apps standart aws app runner domains, also z.B. https://mt2arkm2a4.eu-west-1.awsapprunner.com/. Da könnte man in zukunft nochmal schauen ob das besser geht, idealerweise so was wie review-env-name.review.newcubator.com oder so.

Zu bedenken ist natürlich, dass durch die zusätzlichen environments zusätzliche kosten entstehen, das müssen wir nochmal beobachten und eventuell die lebensdauer der environments reduzieren oder die evironments nur manuell deployen.

Lucas

Softwareentwickler

Zur Übersicht

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund