{"id":87615,"date":"2024-12-10T13:20:44","date_gmt":"2024-12-10T09:50:44","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/"},"modified":"2024-12-10T13:20:44","modified_gmt":"2024-12-10T09:50:44","slug":"a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/","title":{"rendered":"\u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u062e\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 Angular \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/p>\n<p>\u0645\u0631\u062d\u0644\u0647 1: Dockerfile<\/p>\n<p>\u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure<\/p>\n<p>\u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI<\/p>\n<p>\u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627<\/p>\n<p>\u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<\/p>\n<p>\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0645\u0646\u0627\u0628\u0639<\/p>\n<p>Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc<\/p>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/p>\n<p>\u062d\u0633\u0627\u0628 Azure DevOps<br \/>\n\u0627\u0634\u062a\u0631\u0627\u06a9 \u0644\u0627\u062c\u0648\u0631\u062f\u06cc<br \/>\n\u067e\u0631\u0648\u0698\u0647 \u0632\u0627\u0648\u06cc\u0647 \u0627\u06cc<br \/>\nAzure CLI \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<br \/>\n\u062f\u0627\u06a9\u0631 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<br \/>\n\u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0644\u0627\u062c\u0648\u0631\u062f<br \/>\n\u0645\u062d\u06cc\u0637 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: Dockerfile<\/p>\n<p># Stage 1: Build Angular application<br \/>\nFROM node:16-alpine AS build<br \/>\nWORKDIR \/usr\/src\/app<br \/>\nCOPY package.json package-lock.json .\/<br \/>\nRUN npm install<br \/>\nCOPY . .<br \/>\nRUN npm run build &#8211;configuration=production<\/p>\n<p># Stage 2: Serve with Nginx<br \/>\nFROM nginx:alpine<br \/>\nCOPY &#8211;from=build \/usr\/src\/app\/dist\/your-angular-app \/usr\/share\/nginx\/html<br \/>\nCOPY nginx.conf \/etc\/nginx\/conf.d\/default.conf<br \/>\nEXPOSE 80<br \/>\nCMD [&#8220;nginx&#8221;, &#8220;-g&#8221;, &#8220;daemon off;&#8221;]\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure<\/p>\n<p>trigger:<br \/>\n  &#8211; main<\/p>\n<p>variables:<br \/>\n  # Azure Container Registry details<br \/>\n  acrName: &#8216;yourcontainerregistry&#8217;<br \/>\n  imageRepository: &#8216;angular-app&#8217;<br \/>\n  dockerfilePath: &#8216;Dockerfile&#8217;<br \/>\n  tag: &#8216;$(Build.BuildId)&#8217;<\/p>\n<p>  # Azure Container Apps details<br \/>\n  containerAppName: &#8216;your-container-app-name&#8217;<br \/>\n  resourceGroup: &#8216;your-resource-group&#8217;<\/p>\n<p>stages:<br \/>\n&#8211; stage: Build<br \/>\n  displayName: Build and Test<br \/>\n  jobs:<br \/>\n  &#8211; job: BuildAndTest<br \/>\n    pool:<br \/>\n      vmImage: &#8216;ubuntu-latest&#8217;<br \/>\n    steps:<br \/>\n    &#8211; task: NodeTool@0<br \/>\n      inputs:<br \/>\n        versionSpec: &#8217;16.x&#8217;<br \/>\n      displayName: &#8216;Install Node.js&#8217;<\/p>\n<p>    &#8211; script: |<br \/>\n        npm ci<br \/>\n        npm run lint<br \/>\n        npm run test &#8212; &#8211;watch=false &#8211;browsers=ChromeHeadless<br \/>\n      displayName: &#8216;npm install, lint, and test&#8217;<\/p>\n<p>    &#8211; task: Docker@2<br \/>\n      displayName: &#8216;Build Docker Image&#8217;<br \/>\n      inputs:<br \/>\n        command: build<br \/>\n        repository: $(imageRepository)<br \/>\n        dockerfile: $(dockerfilePath)<br \/>\n        tags:<br \/>\n          &#8211; $(tag)<br \/>\n          &#8211; latest<\/p>\n<p>    &#8211; task: Docker@2<br \/>\n      displayName: &#8216;Push to Azure Container Registry&#8217;<br \/>\n      inputs:<br \/>\n        command: push<br \/>\n        repository: $(imageRepository)<br \/>\n        containerRegistry: $(acrServiceConnection)<br \/>\n        tags:<br \/>\n          &#8211; $(tag)<br \/>\n          &#8211; latest<\/p>\n<p>&#8211; stage: Approval<br \/>\n  displayName: Deployment Approval<br \/>\n  jobs:<br \/>\n  &#8211; job: ApprovalJob<br \/>\n    pool: server<br \/>\n    steps:<br \/>\n    &#8211; task: ManualValidation@0<br \/>\n      inputs:<br \/>\n        instructions: &#8216;Please review and approve the deployment&#8217;<br \/>\n        onTimeout: &#8216;reject&#8217;<br \/>\n        timeoutInMinutes: 120<\/p>\n<p>&#8211; stage: Deploy<br \/>\n  displayName: Deploy to Azure Container Apps<br \/>\n  dependsOn:<br \/>\n    &#8211; Build<br \/>\n    &#8211; Approval<br \/>\n  condition: succeeded()<br \/>\n  jobs:<br \/>\n  &#8211; deployment: DeployToContainerApp<br \/>\n    pool:<br \/>\n      vmImage: &#8216;ubuntu-latest&#8217;<br \/>\n    environment: &#8216;production&#8217;<br \/>\n    strategy:<br \/>\n      runOnce:<br \/>\n        deploy:<br \/>\n          steps:<br \/>\n          &#8211; task: AzureCLI@2<br \/>\n            displayName: &#8216;Deploy to Azure Container Apps&#8217;<br \/>\n            inputs:<br \/>\n              azureSubscription: &#8216;Your-Azure-Subscription&#8217;<br \/>\n              scriptType: &#8216;bash&#8217;<br \/>\n              scriptLocation: &#8216;inlineScript&#8217;<br \/>\n              inlineScript: |<br \/>\n                # Login to Azure Container Registry<br \/>\n                az acr login &#8211;name $(acrName)<\/p>\n<p>                # Update Container App with new image<br \/>\n                az containerapp update \\<br \/>\n                  &#8211;name $(containerAppName) \\<br \/>\n                  &#8211;resource-group $(resourceGroup) \\<br \/>\n                  &#8211;image $(acrName).azurecr.io\/$(imageRepository):$(tag)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062e\u0637 \u0644\u0648\u0644\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure \u062e\u0648\u062f \u0631\u0627 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p># Create Container Registry<br \/>\naz acr create &#8211;resource-group your-resource-group \\<br \/>\n              &#8211;name yourcontainerregistry \\<br \/>\n              &#8211;sku Basic<\/p>\n<p># Create Container Apps Environment<br \/>\naz containerapp env create \\<br \/>\n  &#8211;name your-container-app-environment \\<br \/>\n  &#8211;resource-group your-resource-group \\<br \/>\n  &#8211;location eastus<\/p>\n<p># Create Container App<br \/>\naz containerapp create \\<br \/>\n  &#8211;name your-container-app-name \\<br \/>\n  &#8211;resource-group your-resource-group \\<br \/>\n  &#8211;environment your-container-app-environment \\<br \/>\n  &#8211;image yourcontainerregistry.azurecr.io\/angular-app:latest \\<br \/>\n  &#8211;target-port 80 \\<br \/>\n  &#8211;ingress external<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627<\/p>\n<p>\u0627\u0632 Azure Key Vault \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062d\u0633\u0627\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n\u0627\u062c\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u062c\u0627\u0645\u0639 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631<br \/>\n\u0627\u0632 \u0647\u0648\u06cc\u062a \u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u06cc\u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<br \/>\nRBAC \u0645\u0646\u0627\u0633\u0628 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<br \/>\n\u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc \u0633\u0644\u0627\u0645\u062a \u0631\u0627 \u062f\u0631 Container Apps \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631\u0647\u0627\u06cc \u0628\u062f\u0648\u0646 \u062a\u0648\u0642\u0641 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<\/p>\n<p>\u0628\u0631\u0631\u0633\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0634\u0628\u06a9\u0647<br \/>\n\u0644\u0627\u06af \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0631\u0627 \u062f\u0631 \u067e\u0631\u062a\u0627\u0644 Azure \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0642\u0634 \u0647\u0627\u06cc IAM \u0645\u0646\u0627\u0633\u0628 \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a<br \/>\n\u0645\u062c\u0648\u0632\u0647\u0627\u06cc ACR \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f<br \/>\n\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0634\u0628\u06a9\u0647 Container Apps \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0627\u06cc\u0646 \u062e\u0637 \u0644\u0648\u0644\u0647 \u06cc\u06a9 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0642\u0648\u06cc CI\/CD \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Angular \u062f\u0631 Azure Container Apps \u0628\u0627 \u0645\u0631\u062d\u0644\u0647 \u062a\u0623\u06cc\u06cc\u062f \u062f\u0633\u062a\u06cc \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>  \u0645\u0646\u0627\u0628\u0639<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0644\u0627\u0635\u0647\u060c \u062e\u0637 \u0644\u0648\u0644\u0647 \u0634\u0627\u0645\u0644:<\/p>\n<p>\u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a<br \/>\n\u0645\u0631\u062d\u0644\u0647 \u062a\u0627\u06cc\u06cc\u062f \u062f\u0633\u062a\u06cc<br \/>\n\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<br \/>\n\u0627\u062f\u063a\u0627\u0645 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<\/p>\n<p>  Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc<\/p>\n<p>\u0631\u0648\u06cc\u06a9\u0631\u062f Dockerfile \u0646\u0634\u0627\u0646\u200c\u062f\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 Angular \u0631\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0628\u0627 \u062f\u06cc\u06af\u0631 \u067e\u0634\u062a\u0647\u200c\u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc \u0645\u062d\u0628\u0648\u0628 \u0646\u06cc\u0632 \u062a\u0637\u0628\u06cc\u0642 \u062f\u0627\u062f<\/p>\n<div data-article-id=\"2149399\" id=\"article-body\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\" >\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_Dockerfile\" >\u0645\u0631\u062d\u0644\u0647 1: Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%AE%D8%B7%D9%88%D8%B7_%D9%84%D9%88%D9%84%D9%87_Azure\" >\u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D8%B6%D8%A7%D9%81%DB%8C_Azure_CLI\" >\u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B4%DB%8C%D9%88%D9%87_%D9%87%D8%A7\" >\u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\" >\u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#%D9%85%D9%86%D8%A7%D8%A8%D8%B9\" >\u0645\u0646\u0627\u0628\u0639<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/a-step-by-step-guide-to-cicd-pipeline-for-angular-app-with-azure-container-apps-3b79\/#Dockerizing_%D8%B3%D8%A7%DB%8C%D8%B1_%D9%BE%D8%B4%D8%AA%D9%87_%D9%87%D8%A7%DB%8C_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\" >Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\"><\/span>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<p>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\n<\/li>\n<li>\n<p>\u0645\u0631\u062d\u0644\u0647 1: Dockerfile\n<\/li>\n<li>\n<p>\u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure\n<\/li>\n<li>\n<p>\u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI\n<\/li>\n<li>\n<p>\u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627\n<\/li>\n<li>\n<p>\u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc\n<\/li>\n<li>\n<p>\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc\n<\/li>\n<li>\n<p>\u0645\u0646\u0627\u0628\u0639\n<\/li>\n<li>\n<p>Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc\n<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u062d\u0633\u0627\u0628 Azure DevOps<\/li>\n<li>\u0627\u0634\u062a\u0631\u0627\u06a9 \u0644\u0627\u062c\u0648\u0631\u062f\u06cc<\/li>\n<li>\u067e\u0631\u0648\u0698\u0647 \u0632\u0627\u0648\u06cc\u0647 \u0627\u06cc<\/li>\n<li>Azure CLI \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\u062f\u0627\u06a9\u0631 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0644\u0627\u062c\u0648\u0631\u062f<\/li>\n<li>\u0645\u062d\u06cc\u0637 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_Dockerfile\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: Dockerfile<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight docker\"><code><span class=\"c\"># Stage 1: Build Angular application<\/span>\n<span class=\"k\">FROM<\/span><span class=\"w\"> <\/span><span class=\"s\">node:16-alpine<\/span><span class=\"w\"> <\/span><span class=\"k\">AS<\/span><span class=\"w\"> <\/span><span class=\"s\">build<\/span>\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/usr\/src\/app<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> package.json package-lock.json .\/<\/span>\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> . .<\/span>\n<span class=\"k\">RUN <\/span>npm run build <span class=\"nt\">--configuration<\/span><span class=\"o\">=<\/span>production\n\n<span class=\"c\"># Stage 2: Serve with Nginx<\/span>\n<span class=\"k\">FROM<\/span><span class=\"s\"> nginx:alpine<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=build \/usr\/src\/app\/dist\/your-angular-app \/usr\/share\/nginx\/html<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> nginx.conf \/etc\/nginx\/conf.d\/default.conf<\/span>\n<span class=\"k\">EXPOSE<\/span><span class=\"s\"> 80<\/span>\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"nginx\", \"-g\", \"daemon off;\"]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%AE%D8%B7%D9%88%D8%B7_%D9%84%D9%88%D9%84%D9%87_Azure\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">trigger<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"s\">main<\/span>\n\n<span class=\"na\">variables<\/span><span class=\"pi\">:<\/span>\n  <span class=\"c1\"># Azure Container Registry details<\/span>\n  <span class=\"na\">acrName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">yourcontainerregistry'<\/span>\n  <span class=\"na\">imageRepository<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">angular-app'<\/span>\n  <span class=\"na\">dockerfilePath<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Dockerfile'<\/span>\n  <span class=\"na\">tag<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">$(Build.BuildId)'<\/span>\n\n  <span class=\"c1\"># Azure Container Apps details<\/span>\n  <span class=\"na\">containerAppName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">your-container-app-name'<\/span>\n  <span class=\"na\">resourceGroup<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">your-resource-group'<\/span>\n\n<span class=\"na\">stages<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">stage<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build<\/span>\n  <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and Test<\/span>\n  <span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">job<\/span><span class=\"pi\">:<\/span> <span class=\"s\">BuildAndTest<\/span>\n    <span class=\"na\">pool<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">vmImage<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">ubuntu-latest'<\/span>\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">task<\/span><span class=\"pi\">:<\/span> <span class=\"s\">NodeTool@0<\/span>\n      <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">versionSpec<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">16.x'<\/span>\n      <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Install<\/span><span class=\"nv\"> <\/span><span class=\"s\">Node.js'<\/span>\n\n    <span class=\"pi\">-<\/span> <span class=\"na\">script<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n        <span class=\"s\">npm ci<\/span>\n        <span class=\"s\">npm run lint<\/span>\n        <span class=\"s\">npm run test -- --watch=false --browsers=ChromeHeadless<\/span>\n      <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">npm<\/span><span class=\"nv\"> <\/span><span class=\"s\">install,<\/span><span class=\"nv\"> <\/span><span class=\"s\">lint,<\/span><span class=\"nv\"> <\/span><span class=\"s\">and<\/span><span class=\"nv\"> <\/span><span class=\"s\">test'<\/span>\n\n    <span class=\"pi\">-<\/span> <span class=\"na\">task<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Docker@2<\/span>\n      <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Build<\/span><span class=\"nv\"> <\/span><span class=\"s\">Docker<\/span><span class=\"nv\"> <\/span><span class=\"s\">Image'<\/span>\n      <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build<\/span>\n        <span class=\"na\">repository<\/span><span class=\"pi\">:<\/span> <span class=\"s\">$(imageRepository)<\/span>\n        <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">$(dockerfilePath)<\/span>\n        <span class=\"na\">tags<\/span><span class=\"pi\">:<\/span> \n          <span class=\"pi\">-<\/span> <span class=\"s\">$(tag)<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"s\">latest<\/span>\n\n    <span class=\"pi\">-<\/span> <span class=\"na\">task<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Docker@2<\/span>\n      <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Push<\/span><span class=\"nv\"> <\/span><span class=\"s\">to<\/span><span class=\"nv\"> <\/span><span class=\"s\">Azure<\/span><span class=\"nv\"> <\/span><span class=\"s\">Container<\/span><span class=\"nv\"> <\/span><span class=\"s\">Registry'<\/span>\n      <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">push<\/span>\n        <span class=\"na\">repository<\/span><span class=\"pi\">:<\/span> <span class=\"s\">$(imageRepository)<\/span>\n        <span class=\"na\">containerRegistry<\/span><span class=\"pi\">:<\/span> <span class=\"s\">$(acrServiceConnection)<\/span>\n        <span class=\"na\">tags<\/span><span class=\"pi\">:<\/span> \n          <span class=\"pi\">-<\/span> <span class=\"s\">$(tag)<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"s\">latest<\/span>\n\n<span class=\"pi\">-<\/span> <span class=\"na\">stage<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Approval<\/span>\n  <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment Approval<\/span>\n  <span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">job<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ApprovalJob<\/span>\n    <span class=\"na\">pool<\/span><span class=\"pi\">:<\/span> <span class=\"s\">server<\/span>\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">task<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ManualValidation@0<\/span>\n      <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">instructions<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Please<\/span><span class=\"nv\"> <\/span><span class=\"s\">review<\/span><span class=\"nv\"> <\/span><span class=\"s\">and<\/span><span class=\"nv\"> <\/span><span class=\"s\">approve<\/span><span class=\"nv\"> <\/span><span class=\"s\">the<\/span><span class=\"nv\"> <\/span><span class=\"s\">deployment'<\/span>\n        <span class=\"na\">onTimeout<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">reject'<\/span>\n        <span class=\"na\">timeoutInMinutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">120<\/span>\n\n<span class=\"pi\">-<\/span> <span class=\"na\">stage<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy<\/span>\n  <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy to Azure Container Apps<\/span>\n  <span class=\"na\">dependsOn<\/span><span class=\"pi\">:<\/span> \n    <span class=\"pi\">-<\/span> <span class=\"s\">Build<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"s\">Approval<\/span>\n  <span class=\"na\">condition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">succeeded()<\/span>\n  <span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">deployment<\/span><span class=\"pi\">:<\/span> <span class=\"s\">DeployToContainerApp<\/span>\n    <span class=\"na\">pool<\/span><span class=\"pi\">:<\/span> \n      <span class=\"na\">vmImage<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">ubuntu-latest'<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">production'<\/span>\n    <span class=\"na\">strategy<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">runOnce<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"na\">task<\/span><span class=\"pi\">:<\/span> <span class=\"s\">AzureCLI@2<\/span>\n            <span class=\"na\">displayName<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Deploy<\/span><span class=\"nv\"> <\/span><span class=\"s\">to<\/span><span class=\"nv\"> <\/span><span class=\"s\">Azure<\/span><span class=\"nv\"> <\/span><span class=\"s\">Container<\/span><span class=\"nv\"> <\/span><span class=\"s\">Apps'<\/span>\n            <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">azureSubscription<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">Your-Azure-Subscription'<\/span>\n              <span class=\"na\">scriptType<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">bash'<\/span>\n              <span class=\"na\">scriptLocation<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">inlineScript'<\/span>\n              <span class=\"na\">inlineScript<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\n                <span class=\"s\"># Login to Azure Container Registry<\/span>\n                <span class=\"s\">az acr login --name $(acrName)<\/span>\n\n                <span class=\"s\"># Update Container App with new image<\/span>\n                <span class=\"s\">az containerapp update \\<\/span>\n                  <span class=\"s\">--name $(containerAppName) \\<\/span>\n                  <span class=\"s\">--resource-group $(resourceGroup) \\<\/span>\n                  <span class=\"s\">--image $(acrName).azurecr.io\/$(imageRepository):$(tag)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D8%B6%D8%A7%D9%81%DB%8C_Azure_CLI\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062e\u0637 \u0644\u0648\u0644\u0647\u060c \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure \u062e\u0648\u062f \u0631\u0627 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Create Container Registry<\/span>\naz acr create <span class=\"nt\">--resource-group<\/span> your-resource-group <span class=\"se\">\\<\/span>\n              <span class=\"nt\">--name<\/span> yourcontainerregistry <span class=\"se\">\\<\/span>\n              <span class=\"nt\">--sku<\/span> Basic\n\n<span class=\"c\"># Create Container Apps Environment<\/span>\naz containerapp <span class=\"nb\">env <\/span>create <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--name<\/span> your-container-app-environment <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--resource-group<\/span> your-resource-group <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--location<\/span> eastus\n\n<span class=\"c\"># Create Container App<\/span>\naz containerapp create <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--name<\/span> your-container-app-name <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--resource-group<\/span> your-resource-group <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--environment<\/span> your-container-app-environment <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--image<\/span> yourcontainerregistry.azurecr.io\/angular-app:latest <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--target-port<\/span> 80 <span class=\"se\">\\<\/span>\n  <span class=\"nt\">--ingress<\/span> external\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B4%DB%8C%D9%88%D9%87_%D9%87%D8%A7\"><\/span>\n<p>  \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u0627\u0632 Azure Key Vault \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062d\u0633\u0627\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0627\u062c\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u062c\u0627\u0645\u0639 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631<\/li>\n<li>\u0627\u0632 \u0647\u0648\u06cc\u062a \u0647\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u06cc\u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>RBAC \u0645\u0646\u0627\u0633\u0628 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc \u0633\u0644\u0627\u0645\u062a \u0631\u0627 \u062f\u0631 Container Apps \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631\u0647\u0627\u06cc \u0628\u062f\u0648\u0646 \u062a\u0648\u0642\u0641 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\"><\/span>\n<p>  \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u0628\u0631\u0631\u0633\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0634\u0628\u06a9\u0647<\/li>\n<li>\u0644\u0627\u06af \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0631\u0627 \u062f\u0631 \u067e\u0631\u062a\u0627\u0644 Azure \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0642\u0634 \u0647\u0627\u06cc IAM \u0645\u0646\u0627\u0633\u0628 \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\u0645\u062c\u0648\u0632\u0647\u0627\u06cc ACR \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0634\u0628\u06a9\u0647 Container Apps \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u062e\u0637 \u0644\u0648\u0644\u0647 \u06cc\u06a9 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0642\u0648\u06cc CI\/CD \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Angular \u062f\u0631 Azure Container Apps \u0628\u0627 \u0645\u0631\u062d\u0644\u0647 \u062a\u0623\u06cc\u06cc\u062f \u062f\u0633\u062a\u06cc \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%86%D8%A7%D8%A8%D8%B9\"><\/span>\n<p>  \u0645\u0646\u0627\u0628\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0644\u0627\u0635\u0647\u060c \u062e\u0637 \u0644\u0648\u0644\u0647 \u0634\u0627\u0645\u0644:<\/p>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a \u0648 \u062a\u0633\u062a<\/li>\n<li>\u0645\u0631\u062d\u0644\u0647 \u062a\u0627\u06cc\u06cc\u062f \u062f\u0633\u062a\u06cc<\/li>\n<li>\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<\/li>\n<li>\u0627\u062f\u063a\u0627\u0645 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Azure<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Dockerizing_%D8%B3%D8%A7%DB%8C%D8%B1_%D9%BE%D8%B4%D8%AA%D9%87_%D9%87%D8%A7%DB%8C_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\"><\/span>\n<p>  Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0631\u0648\u06cc\u06a9\u0631\u062f Dockerfile \u0646\u0634\u0627\u0646\u200c\u062f\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 Angular \u0631\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0628\u0627 \u062f\u06cc\u06af\u0631 \u067e\u0634\u062a\u0647\u200c\u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc \u0645\u062d\u0628\u0648\u0628 \u0646\u06cc\u0632 \u062a\u0637\u0628\u06cc\u0642 \u062f\u0627\u062f<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627 \u0645\u0631\u062d\u0644\u0647 1: Dockerfile \u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 Azure \u0645\u0631\u062d\u0644\u0647 3: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0636\u0627\u0641\u06cc Azure CLI \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc \u0645\u0646\u0627\u0628\u0639 Dockerizing \u0633\u0627\u06cc\u0631 \u067e\u0634\u062a\u0647 \u0647\u0627\u06cc \u0641\u0646\u0627\u0648\u0631\u06cc \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627 \u062d\u0633\u0627\u0628 Azure DevOps \u0627\u0634\u062a\u0631\u0627\u06a9 \u0644\u0627\u062c\u0648\u0631\u062f\u06cc \u067e\u0631\u0648\u0698\u0647 \u0632\u0627\u0648\u06cc\u0647 \u0627\u06cc Azure CLI \u0646\u0635\u0628 \u0634\u062f\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":87616,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-87615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/87615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=87615"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/87615\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/87616"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=87615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=87615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=87615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}