I have a simple web.api that I want to deply to azure. I use github actions for this.
in case if I use azure/webapps-deploy@v2
step, all works smoothly.
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Download artifact from build job
# published previously via `dotnet publish` and
# uses: actions/upload-artifact@v3
# with:
# name: webapp
uses: actions/download-artifact@v3
with:
name: webapp
path: webapp
- name: Login via Azure CLI
uses: azure/login@v1
with:
# secret in json form are added into repository settings
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy web app
id: deploywebapp
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.AZURE_WEBAPP_NAME }}
package: webapp
I can deploy application and then it’s accessible via https://%AZURE_WEBAPP_NAME%.azurewebsites.net/swagger/index.html. Now, I want to use plain azure CLI commands and replace the above steps on (the only change I do):
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v3
with:
name: webapp
path: webapp
- name: Azure Login
uses: azure/CLI@v1
with:
azcliversion: 2.30.0
inlineScript: |
az login --service-principal
-u ${{ secrets.DEPLOYMENT_AZURE_CLIENT_ID }}
-p ${{ secrets.DEPLOYMENT_AZURE_CLIENT_SECRET }}
-t ${{ secrets.DEPLOYMENT_AZURE_TENANT_ID }}
- name: Deploy to Azure WebApp
uses: azure/CLI@v1
with:
azcliversion: 2.30.0
inlineScript: |
zip -r webapp.zip .
az webapp deployment source config-zip --resource-group ${{ env.AZURE_WEBAPP_RG }} --name ${{ env.AZURE_WEBAPP_NAME }} --src "webapp.zip"
this step doesn’t fail too, but the deployed application is inaccessible (with previous url) and returns 404 error. The deploy step output is:
WARNING: Getting scm site credentials for zip deployment
WARNING: Starting zip deployment. This operation can take a while to complete ...
WARNING: Deployment endpoint responded with status code 202
{
"active": true,
"author": "N/A",
"author_email": "N/A",
"build_summary": {
"errors": [],
"warnings": []
},
"complete": true,
"deployer": "Push-Deployer",
"end_time": "..",
"id": "..",
"is_readonly": true,
"is_temp": false,
"last_success_end_time": "..",
"log_url": "https://%AZURE_WEBAPP_NAME%.scm.azurewebsites.net/api/deployments/latest/log",
"message": "Created via a push deployment",
"progress": "",
"received_time": "..",
"site_name": "%AZURE_WEBAPP_NAME%",
"start_time": "...",
"status": 4,
"status_text": "",
"url": "https://%AZURE_WEBAPP_NAME%.scm.azurewebsites.net/api/deployments/latest"
}
az script ran successfully.
What is the difference between both of these steps?
UPDATE1: I’ve added --debug
argument to az webapp deployment ..
command and see no errors or failures in the verbose output
UPDATE2: I see required files when I ssh
to the azure server:
root@..:~/site/wwwroot/webapp# ls
DeploymentTemplates Swashbuckle.AspNetCore.SwaggerGen.dll WebApiDemo.deps.json WebApiDemo.runtimeconfig.json web.config
Microsoft.OpenApi.dll Swashbuckle.AspNetCore.SwaggerUI.dll WebApiDemo.dll appsettings.Development.json
Swashbuckle.AspNetCore.Swagger.dll WebApiDemo
UPDATE3: It looks like it might be related to the fact that when I use a plain CLI commandsm the actually generated files are placed one level deeper (see ssh output before and pay attention on webapp
folder). Where in the correctly deployed application the deployed files are placed in the root of wwwroot
:
root@..:~/site/wwwroot# ls
DeploymentTemplates Swashbuckle.AspNetCore.SwaggerGen.dll WebApiDemo.deps.json WebApiDemo.runtimeconfig.json web.config
Microsoft.OpenApi.dll Swashbuckle.AspNetCore.SwaggerUI.dll WebApiDemo.dll appsettings.Development.json
Swashbuckle.AspNetCore.Swagger.dll WebApiDemo
2
Answers
The issue was in a zip file. The content inside was:
which led to the folders structure inside wwwroot:
where the zip content should be just:
Fixing it has solved the issue
The main difference between the two tasks is
azure/web-apps-deploy@v2
is copying the files to the underlying storage tohome/site/wwwroot
where as theaz webapp deployment config-zip
copies the zip file tohome/data/SitePackages
. If you haveWEBSITE_RUN_FROM_PACKAGE="1"
, then the platform will mount the zip file inSitePackages
as thehome/site/wwwroot
directory, otherwise, the contents of the zip file get extracted, which is similar to whatazure/web-apps-deploy@v2
does.The diagnostic logs will help determine what’s causing your app to 404. Based off the information you’ve provided; I would make sure the zip command is actually zipping the right artifact from
actions/download-artifact@v3
. Since you’re zipping the root, you might be zipping the folder instead of the built binaries.