CI / CD pour un projet sur GitHub se déployant sur AWS EC2

Nous avons: un projet d'API web sur .net core avec des sources dans GitHub.





Ce que nous voulons: un déploiement automatique sur la machine virtuelle AWS EC2 après avoir fini de travailler avec le code (par exemple, pousser vers la branche de développement).





Boîte à outils: Actions GitHub, AWS CodeDeploy, S3, EC2.





En dessous du déroulement du processus que nous allons mettre en œuvre, nous avons conduit.





Flux CI / CD de base
Flux CI / CD de base

1. Utilisateurs et rôles

1.1. Utilisateur pour accéder à AWS à partir de l'action GitHub

Cet utilisateur sera utilisé pour se connecter aux services AWS S3 et CodeDeploy via AWS CLI 2 lors de l'exécution d'actions GitHub.





1. Accédez à la console AWS IAM, à gauche dans le menu Utilisateur, et Ajouter un utilisateur





2. Définissez un nom arbitraire et cochez la case Accès par programmation





Créer un nouvel utilisateur
Créer un nouvel utilisateur

3. Ensuite, dans la section Autorisations, sélectionnez Attacher directement les stratégies existantes et ajoutez les stratégies AmazonS3FullAccess et AWSCodeDeployDeployerAccess.





4. Les balises peuvent être ignorées. Au stade de la révision, vous devriez obtenir les éléments suivants:





Résultat final
Résultat final

5. Cliquez sur Créer un utilisateur et enregistrez les données utilisateur. Nous aurons besoin de l'ID de la clé d'accès et de la clé d'accès secrète plus tard.





1.2. Rôle de service pour les instances 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:





Création de rôle

3. , (AWSCodeDeployRole)





4. , , ProjectXCodeDeploy Review :





Le résultat final de la création d'un rôle

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





Nouvelle appli

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.





Créer un nouveau compartiment 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.





Après cela, AWS CodeDeploy informera les instances EC2 qui y ont été configurées de la présence d'une nouvelle version, l'agent CodeDeploy descendra vers AWS S3 pour une nouvelle version et la déploiera. Vous pouvez regarder cela depuis la console AWS CodeDeploy.





Résumons

À ce stade, nous avons complètement terminé la configuration et vous pouvez essayer de pousser sur GitHub et vérifier comment tout a fonctionné ... ou pas :) En cours de route, j'ai essayé de mettre en évidence le râteau sur lequel j'ai marché pendant la configuration de l'essai, alors j'espère que vous l'avez fait immédiatement.





La description résultante du pipeline peut être affinée davantage, vissée sur diverses vérifications du code source pour les bogues, les vulnérabilités, exécuter des tests, ajouter différents déclencheurs et déployer dans différents circuits.
















All Articles