CI / CD für ein Projekt auf GitHub, das auf AWS EC2 bereitgestellt wird

Wir haben: ein Web-API-Projekt auf .net Core mit Quellen in GitHub.





Was wir wollen: Autodeploy auf einer virtuellen AWS EC2-Maschine nach Abschluss der Arbeit mit dem Code (z. B. Push an einen Entwicklungszweig).





Toolkit: GitHub-Aktionen, AWS CodeDeploy, S3, EC2.





Unterhalb des Ablaufs des Prozesses, den wir implementieren werden, sind wir gefahren.





Grundlegender CI / CD-Fluss
Grundlegender CI / CD-Fluss

1. Benutzer und Rollen

1.1. Benutzer, der über GitHub Action auf AWS zugreift

Dieser Benutzer wird verwendet, um über AWS CLI 2 eine Verbindung zu AWS S3- und CodeDeploy-Diensten herzustellen, wenn GitHub-Aktionen ausgeführt werden.





1. Gehen Sie zur AWS IAM-Konsole links im Benutzermenü und fügen Sie Benutzer hinzu





2. Legen Sie einen beliebigen Namen fest und aktivieren Sie das Kontrollkästchen Programmatischer Zugriff





Erstellen Sie einen neuen Benutzer
Erstellen Sie einen neuen Benutzer

3. Wählen Sie als Nächstes im Abschnitt Berechtigungen die Option Vorhandene Richtlinien direkt anhängen aus und fügen Sie die Richtlinien AmazonS3FullAccess und AWSCodeDeployDeployerAccess hinzu.





4. Tags können übersprungen werden. In der Überprüfungsphase sollten Sie Folgendes erhalten:





Endergebnis
Endergebnis

5. Klicken Sie auf Benutzer erstellen und speichern Sie die Benutzerdaten. Wir benötigen später die Zugangsschlüssel-ID und den geheimen Zugangsschlüssel.





1.2. Servicerolle für AWS EC2-Instanzen

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:





Rollenerstellung

3. , (AWSCodeDeployRole)





4. , , ProjectXCodeDeploy Review :





Das Endergebnis der Erstellung einer Rolle

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





Neue App

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.





Erstellen eines neuen S3-Buckets
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.





Danach benachrichtigt AWS CodeDeploy die darin konfigurierten EC2-Instanzen über das Vorhandensein eines neuen Builds. Der CodeDeploy-Agent wird für eine neue Version zu AWS S3 absteigen und diese bereitstellen. Sie können dies über die AWS CodeDeploy-Konsole anzeigen.





Fassen wir zusammen

Zu diesem Zeitpunkt haben wir die Konfiguration vollständig abgeschlossen und Sie können versuchen, auf GitHub zu pushen und zu überprüfen, wie es funktioniert hat oder nicht :) Unterwegs habe ich versucht, den Rechen hervorzuheben, auf den ich während des Test-Setups getreten bin, also hoffe ich, dass Sie es getan haben sofort.





Die resultierende Beschreibung der Pipeline kann weiter optimiert werden, indem verschiedene Überprüfungen des Quellcodes auf Fehler, Schwachstellen, Tests durchgeführt, verschiedene Trigger hinzugefügt und in verschiedene Schaltkreise eingeführt werden.
















All Articles