Ayush P Gupta
Ayush P Gupta

Reputation: 1549

Use of artifacts in azure github action for nodejs

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

Answers (2)

Veerle
Veerle

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

Doris Lv
Doris Lv

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

Related Questions