Skip to content
This repository has been archived by the owner on Nov 6, 2024. It is now read-only.

Latest commit

 

History

History
317 lines (262 loc) · 9.54 KB

examples.md

File metadata and controls

317 lines (262 loc) · 9.54 KB

Exemplos prontos. Pra já sair usando.

Continuos Deployment Kubernetes Container

O Exemplo abaixo mostra como fazer um deploy em um cluster Kubernetes de um container

path: repositorio/.github/workflows/deployment_k8s.yml (pode dar o nome do arquivo como preferir).

O Exemplo abaixo utiliza a branch develop como gatilho para iniciar o workflow. Caso deseja usar Tags como estratégia, o bloco abaixo precisa ser descomentado e a key branches precisa ser comentada.

name: Deployment Container Kubernetes 
on:
  push:
    branches:
      - develop
    #  tags:
      # - staging-v*.*.*          # Push events to v1.0, v1.1.1, and v1.9.1 tags

env:
  RELEASE_REVISION: ${{ github.event.pull_request.head.sha }}
  AWS_REGION: "us-east-1"
  KUBE_CONFIG_DATA: ${{ secrets.HML_KUBE_CONFIG }}
  KUBE_NAMESPACE: default
  ECR_REPOSITORY: project_repository_ecr
  ENVIRONMENT: staging

jobs:
  deployment:
    # if: ${{ contains(github.ref, 'staging') }}
    name: Build Push and Deployment
    runs-on: [self-hosted, linux, x64]
    steps:
      - name: ❌ Cancel Previous Runs
        uses: styfle/[email protected]
        with:
          access_token: ${{ github.token }}

      - name: 🏗 Checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 🔐 Setup AWS Profile
        uses: arvoreeducacao/.github/actions/setup-aws-py@master
        with:
          aws_profile: hml
          root_path: ~/
        env:
          #DEV ENV
          ORG_TF_AWS_KEY_ID: ${{ secrets.ORG_TF_AWS_KEY_ID }}
          ORG_TF_AWS_SECRET_KEY: ${{ secrets.ORG_TF_AWS_SECRET_KEY }}
          #DEV ENV
          DEV_TF_AWS_KEY_ID: ${{ secrets.DEV_TF_AWS_KEY_ID }}
          DEV_TF_AWS_SECRET_KEY: ${{ secrets.DEV_TF_AWS_SECRET_KEY }}
          #HML ENV
          HML_TF_AWS_KEY_ID: ${{ secrets.HML_TF_AWS_KEY_ID }}
          HML_TF_AWS_SECRET_KEY: ${{ secrets.HML_TF_AWS_SECRET_KEY }}
          #PRD ENV
          PRD_TF_AWS_KEY_ID: ${{ secrets.PRD_TF_AWS_KEY_ID }}
          PRD_TF_AWS_SECRET_KEY: ${{ secrets.PRD_TF_AWS_SECRET_KEY }}


      - name: 🔐 Set and export AWS credentials in Shell
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.HML_TF_AWS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.HML_TF_AWS_SECRET_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: 📋 Set outputs
        id: vars
        run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
      - name: Check outputs
        run: echo ${{ steps.vars.outputs.sha_short }}

      - name: 👤 Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: 🚀 Build, tag, and push image to Amazon ECR
        id: build-push-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: api
          IMAGE_TAG: ${{ steps.vars.outputs.sha_short }}
        run: |
          docker build --build-arg ENVIRONMENT=${{ env.ENVIRONMENT }} -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

      - uses: bluwy/substitute-string-action@v1
        name: 🔎 Find and Replace
        id: sub
        with:
          _input-file: 'k8s_manifest_environment.yml'
          _format-key: '%%key%%'
          image_container: ${{ steps.login-ecr.outputs.registry }}/api:${{ steps.vars.outputs.sha_short }}

      - uses: DamianReeves/[email protected]
        name: 📓 Write k8s_manifest_environment.yml
        with:
          path: k8s_manifest_environment.yml
          contents: ${{ steps.sub.outputs.result }}
          write-mode: overwrite

      - name: 🔄 Apply Manifest
        uses: jonathan-sh/[email protected]
        env:
          kube_confg_data: ${{ secrets.HML_KUBE_CONFIG }}
          kube_namespace: default
          aws_access_key_id: ${{ secrets.HML_TF_AWS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.HML_TF_AWS_SECRET_KEY }}
          aws_region: "us-east-1"
        with:
          args: '"kubectl apply -f k8s_manifest_environment.yml"'

      - name: ✅ Verify deployment
        uses: jonathan-sh/[email protected]
        env:
          kube_confg_data: ${{ secrets.HML_KUBE_CONFIG }}
          kube_namespace: default
          aws_access_key_id: ${{ secrets.HML_TF_AWS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.HML_TF_AWS_SECRET_KEY }}
          aws_region: "us-east-1"
        with:
          args: '"kubectl rollout status deployment/deployment-name-your-manifest"'

      - name: 🔄 Describe Deployments
        uses: jonathan-sh/[email protected]
        env:
          kube_confg_data: ${{ secrets.HML_KUBE_CONFIG }}
          kube_namespace: default
          aws_access_key_id: ${{ secrets.HML_TF_AWS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.HML_TF_AWS_SECRET_KEY }}
          aws_region: "us-east-1"
        with:
          args: '"kubectl describe deployments"'

Agora é necessário gerar o arquivo de manifesto geral de sua aplicação. Vamos criar o arquivo k8s_manifest_environment.yml.

O Exemplo abaixo contém apenas os componentes de: Service, Deployment e HPA (Horizontal Pod AutoScaler). Por boas práticas é recomendável criar os recursos de Ingress e Secrets separado.

apiVersion: v1
kind: Service
metadata:
  name: project_name
spec:
  selector:
    app: project_name
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: project_name
spec:
  replicas: 1
  selector:
    matchLabels:
      app: project_name
  template:
    metadata:
      labels:
        app: project_name
    spec:
      containers:
        - name: name-base-youy-container
          image: %%image_container%%
          # Caso precise, descomente as linhas abaixo e configure os recursos de memoria e CPU para as entradas de requests e Limits ( https://kubernetes.io/pt-br/docs/concepts/configuration/manage-resources-containers/ )
          # resources:
          #   requests:
          #     memory: "256Mi"
          #     cpu: "200m"
          #   limits:
          #     memory: "512Mi"
          #     cpu: "400m"
          ports:
            - containerPort: 3000
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: project_name
  namespace: default
  labels:
    app: project_name
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: project_name
  minReplicas: 1
  maxReplicas: 4
  targetCPUUtilizationPercentage: 50

Frontend Build React + S3 + CloudFront

Pipeline modelo para bild

name: BUILD AND PUBLISH FRONT 
on:
  push:
    branches:
      - feature/delivery-front-pipelines
    #  tags:
      # - staging-v*.*.*          # Push events to v1.0, v1.1.1, and v1.9.1 tags

env:
  RELEASE_REVISION: ${{ github.event.pull_request.head.sha }}
  AWS_REGION: "us-east-1"
  ENVIRONMENT: staging
  API_GRAPHQL_URL: 

jobs:
  build:
    # if: ${{ contains(github.ref, 'staging') }}
    name: Build Front and Sync S3 and CloudFront
    runs-on: self-hosted
    strategy:
      matrix:
        node-version: [16.x]
    steps:
      - name: ❌ Cancel Previous Runs
        uses: styfle/[email protected]
        with:
          access_token: ${{ github.token }}

      - name: 🏗 Checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 🔐 Setup AWS Profile
        uses: arvoreeducacao/.github/setup-aws-py@main
        with:
          aws_profile: hml
          root_path: ~/
        env:
          STG_AWS_ACCESS_KEY_ID: ${{ secrets.STG_AWS_ACCESS_KEY_ID }}
          STG_AWS_SECRET_ACCESS_KEY: ${{ secrets.STG_AWS_SECRET_ACCESS_KEY }}
          PRD_AWS_ACCESS_KEY_ID: ${{ secrets.PRD_AWS_ACCESS_KEY_ID }}
          PRD_AWS_SECRET_ACCESS_KEY: ${{ secrets.PRD_AWS_SECRET_ACCESS_KEY }}


      - name: 🔐 Set and export AWS credentials in Shell
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.STG_AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.STG_AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.STG_AWS_DEFAULT_REGION }}

      - name: 📋 Set outputs
        id: vars
        run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
      - name: Check outputs
        run: echo ${{ steps.vars.outputs.sha_short }}

      
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
        env:
          CI: true

      - run: npm install
        env:
          CI: true

      - run: npm run build --if-present && npm run export
        env:
          CI: true

      - uses: jakejarvis/s3-sync-action@master
        with:
          args: --acl public-read --follow-symlinks --delete
        env:
          AWS_S3_BUCKET: ${{ secrets.STG_AWS_S3_BUCKET }}
          AWS_ACCESS_KEY_ID: ${{ secrets.STG_AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.STG_AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: 'us-east-1'   # optional: defaults to us-east-1
          SOURCE_DIR: './out'      # optional: defaults to entire repository

      - name: Invalidate CloudFront
        uses: chetan/invalidate-cloudfront-action@v2
        env:
          DISTRIBUTION: ${{ secrets.CLOUDFRONT_ID }}
          PATHS: "/*"
          AWS_REGION: ${{ secrets.STG_AWS_DEFAULT_REGION }}
          AWS_ACCESS_KEY_ID: ${{ secrets.STG_AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.STG_AWS_SECRET_ACCESS_KEY }}