CI / CD para un proyecto en GitHub que se implementa en AWS EC2

Tenemos: un proyecto de API web en .net core con fuentes en GitHub.





Lo que queremos: implementación automática en la máquina virtual AWS EC2 después de terminar de trabajar con el código (por ejemplo, enviar a la rama de desarrollo).





Kit de herramientas: Acciones de GitHub, AWS CodeDeploy, S3, EC2.





Debajo del flujo del proceso que implementaremos, manejamos.





Flujo básico de CI / CD
Flujo básico de CI / CD

1. Usuarios y roles

1.1. Usuario para acceder a AWS desde GitHub Action

Este usuario se utilizará para conectarse a los servicios de AWS S3 y CodeDeploy a través de AWS CLI 2 al ejecutar acciones de GitHub.





1. Vaya a la consola de AWS IAM, a la izquierda en el menú Usuario, y Agregar usuario





2. Establezca un nombre arbitrario y marque la casilla Acceso programático





Crea un nuevo usuario
Crea un nuevo usuario

3. A continuación, en la sección Permisos, seleccione Adjuntar políticas existentes directamente y agregue las políticas AmazonS3FullAccess y AWSCodeDeployDeployerAccess.





4. Las etiquetas se pueden omitir; en la etapa de revisión, debe obtener lo siguiente:





Resultado final
Resultado final

5. Haga clic en Crear usuario y guarde los datos del usuario. Necesitaremos la identificación de la clave de acceso y la clave de acceso secreta más adelante.





1.2. Rol de servicio para instancias de AWS EC2

EC2, , AWS CodeDeploy.





  1. AWS IAM, Role, Add Role





  2. AWS Service, Choose a use case EC2





  3. AmazonEC2RoleforAWSCodeDeploy.





  4. Review





  5. , , ProjectXCodeDeployInstanceRole Review :





1.3. AWS CodeDeploy

AWS CodeDeploy AWS EC2.





1. AWS IAM, Role, Add Role





2. AWS Service, Use case CodeDeploy:





Creación de roles

3. , (AWSCodeDeployRole)





4. , , ProjectXCodeDeploy Review :





El resultado final de crear un rol

2. AWS EC2

  1. AWS EC2





  2. ProjectXCodeDeployInstanceRole, 1.2





  3. CodeDeploy Agent . .





: , , sudo service codedeploy-agent restart







3. AWS CodeDeploy

1. AWS CodeDeploy





2. Deploy, Applications





3. Create application





4. , , projectx Compute platform EC2/On-Premises





Nueva aplicación

5. , Create deployment group





6. , develop . , 1.3 (ProjectXCodeDeploy).





7. Deployment type In place ( ).





8. Environment configuration Amazon EC2 Instances .





4. AWS S3

AWS S3.





  1. AWS S3, Create bucket.





  2. , , projectx-codedeploy-deployments. Block all public access. Create bucket.





Creando un nuevo bucket de S3
S3

5. appspec.yml

, CodeDeploy Agent . AWS CodeDeploy appspec.yml. :





version: 0.0
os: linux
files:
  - source: /
    destination: /opt/projectx
permissions:
  - object: /opt/projectx
    owner: ubuntu
    group: ubuntu
    type:
      - directory
      - file
hooks:
  ApplicationStart:
    - location: scripts/start_server.sh
      timeout: 300
      runas: ubuntu
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: ubuntu
      
      















  1.  





  2. appspec.yml version: 0.0 os: linux files:





, ( 4), ( 5) ( 6-12). . .





: 0.0, .. CodeDeploy - 0.0 ¯\_(ツ)/¯. : ApplicationStop, . , , . ApplicationStop .





6. GitHub Actions

, CI/CD pipeline GitHub Actions.





6.1.

GitHub Settings, Secrets :





  • AWS_ACCESS_KEY_ID: 5 1.1 AWS





  • AWS_SECRET_ACCESS_KEY: 5 1.1 AWS





6.2.

.github/workflows



. pipeline'. , , develop.yaml. :





name: build-app-action
on: 
  push:
    branches:
      - develop
jobs:
  build:
    name: CI part
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: 5.0.101
      - name: Install dependencies
        run: dotnet restore
      - name: Build
        run: dotnet build --configuration Release --no-restore
  
  deploy:
    name: CD part
    runs-on: ubuntu-latest
    strategy:
      matrix:
        app-name: ['projectx']
        s3-bucket: ['projectx-codedeploy-deployments']
        s3-filename: ['develop-aws-codedeploy-${{ github.sha }}']
        deploy-group: ['develop']
    needs: build
    steps:
      - uses: actions/checkout@v2
      # set up .net core
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: 5.0.101
      # restore packages and build
      - name: Install dependencies
        run: dotnet restore
      - name: Build
        run: dotnet build ProjectX --configuration Release --no-restore -o ./bin/app
      # copying appspec file
      - name: Copying appspec.yml
        run: cp appspec.yml ./bin/app
      # copying scripts
      - name: Copying scripts
        run: cp -R ./scripts ./bin/app/scripts
      
      # Install AWS CLI 2
      - name: Install AWS CLI 2
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install
      # Configure AWS credentials
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-south-1
      # Deploy push to S3
      - name: AWS Deploy push
        run: |
          aws deploy push \
          --application-name ${{ matrix.app-name }} \
          --description "Revision of the ${{ matrix.appname }}-${{ github.sha }}" \
          --ignore-hidden-files \
          --s3-location s3://${{ matrix.s3-bucket }}/${{ matrix.s3-filename }}.zip \
          --source ./bin/app
      # Creating deployment via CodeDeploy
      - name: Creating AWS Deployment
        run: |
          aws deploy create-deployment \
          --application-name ${{ matrix.app-name }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ matrix.deploy-group }} \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=${{ matrix.s3-bucket }},key=${{ matrix.s3-filename }}.zip,bundleType=zip \
      
      



: , ( needs deploy, 31). push develop ( 2-5).





build





 .net, . 11-19. Ubuntu ( 9 23) unit-. , deploy.





deploy





.





  • app-name: 4 3 CodeDeploy





  • s3-bucket: , 2 4





  • s3-filename: ,





  • deploy-group: 6 3.





build:  .net, , ( , .., , , ) (./bin/app , 48). appspec.yml ( 43-48). 51 AWS CLI v2, action GitHub. AWS CLI2, GitHub , 6.1, AWS. AWS S3 . AWS CodeDeploy. GitHub Actions.





Después de eso, AWS CodeDeploy notificará a las instancias EC2 que se han configurado en él sobre la presencia de una nueva compilación, el agente de CodeDeploy descenderá a AWS S3 para obtener una nueva versión y la implementará. Puede ver esto desde la consola de AWS CodeDeploy.





Resumamos

En este punto, hemos completado completamente la configuración y puedes intentar presionar a GitHub y verificar cómo funcionó ... o no :) En el camino, traté de resaltar el rastrillo que pisé durante la configuración de prueba, así que espero que tengas éxito inmediatamente.





La descripción resultante de la tubería se puede ajustar aún más, atornillar varias verificaciones del código fuente en busca de errores, vulnerabilidades, ejecutar pruebas, agregar diferentes activadores y desplegar en diferentes circuitos.
















All Articles