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

Latest commit

 

History

History
452 lines (317 loc) · 13.8 KB

Phase06-CICD.md

File metadata and controls

452 lines (317 loc) · 13.8 KB

لیست تسک‌های مرتبط با این فاز به صورت issue template

فاز شش: CI/CD

در این فاز با مفهوم CI/CD و اهمیت استفاده از آن آشنا خواهید شد. همچنین پروژهٔ خود را به CI/CD مجهز می‌کنید.

  1. CI/CD چیست و چرا اهمیت دارد:

    در این مرحله، در مورد مفهوم CI/CD و اهمیت آن مطالعه کنید. در این بخش، مطالعه‌ی لینک‌های زیر پیشنهاد می‌شود.

  2. آشنایی با GitHub Actions و اضافه کردن CI/CD Pipeline به ریپازیتوری:

    یکی از ابزار CI/CD معروف، GitHub Actions است که به کمک آن، می‌توانیم یک Pipeline شامل عملیات build، اجرای unit test ها و همچنین انتشار package و دیگر عملیاتی که در دستهٔ CI/CD می‌گنجد را به ریپازیتوری گیت‌هاب خود اضافه کنیم. این بخش شامل مراحل زیر است:

    1. فایل زیر را در مسیر زیر در ریپازیتوری خود می‌سازیم:

      .github/workflows/buildPipeline.yml
      
    2. برای pipeline خود یک نام تعریف می‌کنیم: (به فایل buildPipeline.yml اضافه کنید.)

      name: build
    3. مشخص می‌کنیم که pipeline در هنگام push و pull request روی master اجرا شود.

      on:
        push:
          branches: [ master ]
        pull_request:
          branches: [ master ]
    4. مراحل Pipeline را به ترتیب تعریف می‌کنیم. در ابتدا مشخص می‌کنیم که pipeline روی آخرین ورژن ubuntu اجرا شود: (می‌توان آن را تغییر داد)

      jobs:
        build:
          runs-on: ubuntu-latest
    5. در این مرحله مشخص می‌کنیم که CI از agent ای به نام actions/checkout@v2 استفاده کند: (برای مطالعه بیشتر این لینک را بخوانید.)

          steps:
          - uses: actions/checkout@v2
    6. در این مرحله مشخص می‌کنیم که .Net core 3.1 نصب شود.

          - name: Setup .NET Core
            uses: actions/setup-dotnet@v1
            with:
              dotnet-version: 3.1.301
    7. سپس dependency های پروژه restore شوند:‌ (دقت کنید که به جای <path to solution> آدرس فولدر solution خود را مشخص کنید.)

          - name: Install dependencies
            run: dotnet restore
            working-directory: <path to solution>
    8. solution را build می‌کنیم.

          - name: Build
            run: dotnet build --configuration Release --no-restore
            working-directory: <path to solution>
    9. تست‌ها را run می‌کنیم.

          - name: Test
            run: dotnet test --no-restore --verbosity normal --collect:"XPlat Code Coverage"
            working-directory: <path to solution>

      تبریک! CI شما آماده‌است. فایل را commit کرده و روی master پوش کنید.

      در ریپازیتوری خود وارد منوی Actions شوید؛ همانطور که مشاهده می‌کنید، Pipeline شما در حال اجرا است:

      آن را باز کرده و وارد بخش build شوید:

    10. افزودن badge وضعیت CI به README:

      از این قسمت دکمهٔ Copy status badge Markdown را انتخاب کرده و متن کپی‌شده را به README ریپازیتوری خود اضافه کنید.

      می‌توانید وضعیت Pipeline را در هر لحظه مشاهده کنید:

    11. افزودن مشاهده وضعیت code coverage:

      با اکانت GitHub خود در سایت codecov.io وارد شوید. سپس به این آدرس بروید:

      https://codecov.io/gh/Star-Academy/<your-repository-name>
      
    12. بخش زیر را به فایل buildPipeline.yml اضافه کنید:

          - name: Publish code coverage reports to codecove.io
            uses: codecov/codecov-action@v1
            with:
              token: ${{ secrets.CODECOV_TOKEN }}
              files: ./**/coverage.cobertura.xml
              fail_ci_if_error: true
    13. یک‌بار دیگر صفحهٔ زیر را باز کنید:

      https://codecov.io/gh/Star-Academy/<your-repository-name>
      

      وارد بخش Setting شده و از سمت چپ، گزینه‌ی Badge را انتخاب کنید. در صفحه‌ای که باز می‌شود، Markdown را کپی کرده و در README ریپازیتوری خود قرار دهید. اکنون مشاهده خواهید کرد که در هر لحظه، وضعیت code coverage شما نیز نمایش داده می‌شود:

      تا به اینجای کار، کل فایل buildPipeline.yml باید بصورت زیر باشد:

      name: build
      
      on:
        push:
          branches: [ master ]
        pull_request:
          branches: [ master ]
      
      jobs:
        build:
          runs-on: ubuntu-latest
      
          steps:
          - uses: actions/checkout@v2
      
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v1
            with:
              dotnet-version: 3.1.301
          
          - name: Install dependencies
            run: dotnet restore
            working-directory: <path to solution>
      
          - name: Build
            run: dotnet build --configuration Release --no-restore
            working-directory: <path to solution>
      
          - name: Test
            run: dotnet test --no-restore --verbosity normal --collect:"XPlat Code Coverage"
            working-directory: <path to solution>
      
          - name: Publish code coverage reports to codecove.io
            uses: codecov/codecov-action@v1
            with:
              token: ${{ secrets.CODECOV_TOKEN }}
              files: ./**/coverage.cobertura.xml
              fail_ci_if_error: true
    14. انتشار package در NuGet.org:

      NuGet، پکیج منیجر معروف مایکروسافت برای انتشار پکیج‌های Net. است. برای کسب اطلاعات بیشتر، این لینک را مطالعه کنید. در این مرحله، می‌خواهیم یک Pipeline جدید بسازیم که هنگام release یک ورژن در ریپازیتوری، پکیج را در NuGet.org منتشر کند.

      ابتدا باید مشخصات package را در فایل csproj. مربوط به پروژهٔ خود مشخص کنید. بدین منظور، این فایل باید به صورت زیر باشد: (توجه کنید که در این فایل، به جای [TeamNumber] شمارهٔ تیم خود و به جای [LibraryName] نام پروژهٔ خود را قرار دهید. شماره تیم به این خاطر باید قرار داده شود که اگر نام پروژه دو تیم یکسان بود، publish دچار مشکل نشود و در نهایت PackageId یکتا باشد.)

      <Project Sdk="Microsoft.NET.Sdk">
      
          <PropertyGroup>
              <TargetFramework>netstandard2.0</TargetFramework>
              <PackageId>StarAcademy.Team[TeamNumber].[LibraryName]</PackageId>
              <Authors>[TeamMembers]</Authors>
              <Company>Star Academy</Company>
          </PropertyGroup>
      
      </Project>

      در ادامه، برای ساخت Pipline مربوط به publish، فایل زیر را می‌سازیم:

      .github/workflows/publishPipeline.yml
      

      سپس مراحل زیر را به آن اضافه می‌کنیم:

      • نام، trigger و OS مربوط به pipeline را مشخص می‌کنیم.
      name: publish
      
      on:
        release:
          types:
            published
      
      jobs:
        publish:
          runs-on: ubuntu-latest
      
      • نصب .Net Core:
          steps:
          - uses: actions/checkout@v2
      
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v1
            with:
              dotnet-version: 3.1.301
      • گرفتن ورژن release کنونی. توجه کنید که تگ release بعنوان ورژن به NuGet داده می‌شود. در نتیجه، الگوهای قابل قبول ورژن را از اینجا بخوانید و تگ را مطابق این الگو بزنید. (به جای <repository name> نام ریپازیتوری خود را قرار دهید.)
          - name: Get current release version
            id: version
            uses: pozetroninc/github-action-get-latest-release@master
            with:
              repository: Star-Academy/<repository name>
      • build و ساخت پکیج NuGet (به جای <path to classlib project> آدرس فولدری را که فایل csproj. مربوط به پروژه class library در آن قرار دارد بنویسید.)
          - name: Build library and generate NuGet Package
            run: dotnet pack -c Release -o artifacts -p:PackageVersion=${{ steps.version.outputs.release }}
            working-directory: <path to classlib project>
      • انتشار پکیج NuGet
          - name: Publish NuGet Package
            run: dotnet nuget push ./**/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json

      از این پس، هر گاه در ریپازیتوری خود تگ بزنید، Pipeline فوق trigger می‌شود و در نتیجه پکیج شما push می‌شود. همچنین در منوی Actions می‌توانید وضعیت publish را مشاهده کنید. پکیج منتشر شدهٔ خود را نیز می‌توانید در آدرس زیر مشاهده کنید:

      nuget.org/packages/[PackageId]
      

    همچنین نمونه فایل‌های pipeline ها و یک پروژه class library و xunit نمونه، در این ریپازیتوری موجود می‌باشد.

  3. ساخت یک Console App برای پروژه سرچ

    در این بخش، یک solution دیگر بسازید، و در آن با dotnet cli یک console app بسازید. در پوشه پروژه کنسول، command زیر را اجرا کنید تا پکیج سرچ شما به پروژه کنسول اضافه شود:

    dotnet add package [packageId]
    

    با این command، پکیج به پروژه شما اضافه می‌شود و می‌توانید از کلاس‌های آن استفاده کنید. همچنین اگر پکیج خود را update کرده باشید، با اجرای این command، نسخه جدید پکیج به پروژه شما اضافه می‌شود.

    حال با استفاده از پکیج کتابخانه سرچ‌تان، یک نرم‌افزار سرچ تحت کنسول پیاده‌سازی کنید.