Reputation: 1549
When we connect Github with Azure for automatic nodejs release to azure web app service, we see workflow created for the build and release in .github/workflows.
There we see artifact uploading and downloading again in two separate jobs namely build
, deploy
.
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Node.js app to Azure Web App - nestjs
on:
push:
branches:
- master
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js version
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v2
with:
name: node-app
path: .
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: '**'
slot-name: '**'
publish-profile: ${{ ** }}
package: .
Here I don't understand why we need to upload and download artifact? Why can't we directly publish the build without involving artifacts here?
I have modified the workflow as follows:
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Node.js app to Azure Web App - nestjs
on:
push:
branches:
- master
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
environment:
name: 'production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- uses: actions/checkout@v2
- name: Set up Node.js version
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: '**'
slot-name: '**'
publish-profile: ${{ *** }}
package: .
The above modification worked fine and saved my actions minutes due to artifacts.
Upvotes: 3
Views: 2520
Reputation: 91
You can combine the build and deploy jobs in your YAML file as you did in your second example. That will deploy your app to Azure App Service perfectly fine and will save you a considerable amount of time.
But if you do separate the build and deploy jobs, you need to upload and download the artifacts. Thats because jobs are in completely isolated environments from each other, and you need artifacts to move files between these environments.
So why would you want to separate the build and the deployment job?
Deployment is often a more sensitive job than other jobs in the pipeline. You want to treat it with extra care. Usually you will perform some tests (e.g. with npm run test
) before the deployment job to make sure that whatever you build is working accordingly. If one or more tests fail, the build job will fail too. If you make your deployment job dependent on the build job (with needs: build
in your YAML file) you will prevent your broken build from being deployed.
If you combine build and deploy in the job, you're letting go of this failsafe.
Upvotes: 3
Reputation: 3398
Here is the definition of Artifacts from official document:
Artifacts allow you to share data between jobs in a workflow and store data once that workflow has completed.
You could have a look at this article: https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts#about-workflow-artifacts
Upvotes: 0