[AZ-400] Design and implement a dependency management strategy 

Explore package dependencies

  • dependencies - นอกจากพวก Lib ชาวบ้านที่เรา Ref มาใน Project เราแล้วยังรวมถึง Code ที่เอามา Include ใน Project เราด้วยนะ อันหลังหายากด้วย
  • Why is dependency management needed?
    • bug fixed
    • enabling governance
    • security scanning to use known vulnerabilities or exploits packages
  • dependency management strategy
    • Standardization - allows a repeatable, predictable process and usage that can be automated as well.
    • Package formats and sources - stored in a centralized source + packaged มี format ของมันเอง (metadata)
    • Versioning - เก็บ version ตาม code ที่ แก้ไขไป (Evolve)
    • Note อันนี้ที่ผมเข้าใจ พวก Maven / Nuget หรือ NPM มันอาจจะเอาทุก strategy หรือยางอันมาทั้งหมด ?
  • Understand source and package componentization
    • Source componentization
      • focused on source code
      • Requires distributing the source code or the produced binary artifacts
    • Package componentization
      • wrapping + handling components (metadata)
      • tracking and versioning packages
  • Scan your codebase for dependencies เพื่อมา Decompose ทำให้เพื่อลดขนาด codebase ลง และทำให้ Build ได้รวดเร็ว โดยมี Key ดังนี้
    • Duplicate code
    • High cohesion and low coupling
    • Individual lifecycle - ต่อจาก high cohesion ถ้ารอบ Release ใกล่เคียงกันควรแยกออกจาก Codebase
    • Stable parts - ไม่ค่อยแก้
    • Independent code and components - code ที่ไม่เกี่ยวกับ Project หลัก อันนี้ควรแยกออกไป
  • พอแยกได้แล้ว Refactoring + Design Pattern มาช่วยจบตรงนี้นึกถึง You Code as a Crime Scene
  • Knowledge check: Explore package dependencies

Understand package management

  • Explore packages
    • Package ตัวที่รวม Component ต่างๆ ให้มี metadata เพื่อทำให้ง่ายกับการ Tracking + Versioning
      • Publish - เอา Component ไปวางที่ Server กลาง
      • Consume - คนใช้งาน
    • ตัวอย่าง NuGet (.NET) / Maven (Java) / Docker Hub (Docker) / PyPi (Python) / NPM (JavaScript) เป็นต้น
  • Understand Package Feeds
    • Package management - centralized place for distribution and consumption
    • Package Feeds - ปกติจะเป็น URL + Key เพื่อที่จะ Publish (Upload) Package ขึ้นไป
    • ปกติมี 2 แบบ
      - Public
      - Private (ใช้ภายใน) Self-Host - อย่าง Nexus หรือ SaaS - อย่าง Azure Artifacts / Azure Container Registry / Amazon Elastic Container Registry / GitHub Package เป็นต้น
      ฝั่ง Consumer ที่ต้องการใช้งาน กำหนด package feeds เพื่อให้ Tools มันดึงลงมาใช้งาน
  • Introduction to Azure Artifacts
    • Package management - ของ Azure รองรับ NuGet packages / NPM packages / Maven / Universal packages / Python
    • รองรับการทำ Public / Private Feed และ Control การเข้าถึงได้
  • Lab 17: Package Management with Azure Artifacts
  • Knowledge check: Understand package management

Migrate consolidating and secure artifacts

  • artifact is a deployable component of your application
  • ถ้ามีใช้ Package Management เจ้า อื่นๆ สามารถ Migrate มาใช้ Azure Artifacts ได้ โดยจะเก็
    • แบบเดิม NuGet (.NET) / Maven (Java) / Docker Hub (Docker) / PyPi (Python) / NPM (JavaScript)
    • หรือ จะทำ Universal packages - เอาพวก NuGet / Maven มาเก็บใน Format Universal packages แทน
  • Secure access to package feeds
    • Goal Trusted sources (ถ้ามี Package ปลอมขึ้นมา มันจะทำให้ความน่าเชื่อถือหมดไป) / Securing access / Securing availability
    • Implement โดย Restricted access consumption / publishing
      กำหนด Visibility + Role
  • Azure Artifacts Role
    • Reader: Can list and restore (or install) packages from the feed.
    • Collaborator: Can save packages from upstream sources.
    • Contributor: Can push and unlist packages in the feed. //Default Role ตอนสร้าง Azure Artifacts
    • Owner: has all available permissions for a package feed.
  • Examine authentication
    • ถ้ามาจาก Azure DevOps จะผ่าน Azure AD อยู่แล้ว
    • แต่ถ้าต่อออกข้างนอก Azure DevOps / Azure Artifacts แล้ว ใน Azure Pipeline ต้องใส่ตัว Service connection
  • Knowledge check: Migrate consolidating and secure artifacts

Implement a versioning strategy

  • Immutable packages - ถ้า publish ขึ้นไปแล้ว อย่าไปเปลี่ยนมันอีก บาง Tool มันห้ามเลยนะ
  • Understand versioning of artifacts
    • Major - อาจจะขยับมาจาก redesign of the component / Not guaranteed to be compatible กับของเก่าๆ
    • Minor - changes can be backward compatible with the previous version
    • Patch - flaw, bug, malfunctioning(ทำงานผิดปกติ) ของ component ที่ถูกแก้ไข
  • semantic versioning นอกจาก Major.Minor.Patch ยังมี Text บางอันที่ช่วยให้สื่อความหมายชัดเจนต่อท้าย Patch ได้ เช่น 1.0.0-rc1 โดยคำที่นิยม
    • pre-alpha
  • release views ใน Azure Artifacts @{Viewname}
    • @Local - package ทั้งหมด รวม prerelease ที่ download จาก upstream
    • @Prerelease - version number
    • @Release - packages that are considered official releases
    • Default จะเป็น @Local
https://pkgs.dev.azure.com/{yourteamproject}/_packaging/{feedname}/nuget/v3/index.json

--ถ้าต้องการดูเฉพาะ View ใส่ @{Viewname}
https://pkgs.dev.azure.com/{yourteamproject}/_packaging/{feedname}@{Viewname}/nuget/v3/index.json
  • Promote packages ย้ายข้าม View เช่น จาก @Local > @Prerelease > @Release โดยอาจจะดูจาก quality indicator
    Note ตัว Package จะลบจาก Retention Policy
  • Best practices - กำหนดเอกสารภายในองค์กรชัดเจน / แต่ละ Repository/ฺBranch ต้องจับ Feed + @{Viewname} แค่อันเดียว
  • Exercise - Promote a package
  • Exercise - Push from the pipeline
  • Knowledge check: Implement a versioning strategy

Introduction to GitHub Packages

  • GitHub Package - ย้ายจากการ Publish จาก NuGet / NPM เป็นต้น ย้ายมาที่ GitHub แทนน โดยจะต้อง
  • Publish Package
    • เตรียม personal access token (PAT)
    • แก้ไข Config เช่น NuGet ย้ายมาใช้ URL GitHub Package + PAT แทน
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <clear />
        <add key="github" value="https://nuget.pkg.github.com/OWNER/index.json" />
    </packageSources>
    <packageSourceCredentials>
        <github>
            <add key="Username" value="USERNAME" />
            <add key="ClearTextPassword" value="TOKEN" />
        </github>
    </packageSourceCredentials>
</configuration>
dotnet nuget push "bin/Release/OctocatApp.1.0.0.nupkg" --api-key YOUR_GITHUB_PAT --source "github"
  • Consume Package - แก้ไข Config ของแต่ละ Package ให้เรียบร้อย เช่น NuGet / NPM ตอน Build ถ้าถาม user/pass ใส่ลงไป หรือบางเจ้าอาจจะให้ใ่ Token แทน
  • visibility and access permissions

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.