Search code examples
githubyamlgithub-actionspipeline

How can I trigger some steps and skip when spesific files or folder changed on github actions?


I try to create a pipeline with if conditions.

When I try to change a file or folder in foo2 or foo folder, some tests should be skipped. But all steps are running instead of skipping some tests. Because I only changed files in a folder. Not both of them.

I'm using this action for paths changes filter: dorny/paths-filter@v2

For example '# minify files for each project' part in the YAML file is not working properly. When I change just one folder, all steps of that part are working. But it should not.

My File directory is like this:

  • github

    • workflows
      • main.yml
  • foo

    • js

      .bc-global.js

      • live

        .global-bundle.js

        .script-bundle.js

      • scripts

        .script1.js

        .script2.js

        .script3.js

Foo2 folder's directory same as the foo folder.

This is my YAML file:

name: Upload to S3

on:
  push:
    branches:
      - test-s3
    paths:
      - "foo/js/bc-global.js"
      - "foo/js/scripts/**.js"
      - "foo2/js/lc-global.js"
      - "foo2/js/scripts/**.js"

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: actions/checkout@v2
      - uses: dorny/paths-filter@v2
        id: changes
        with:
          filters: |
            foo:
              - 'foo/js/bc-global.js'
              - 'foo/js/scripts/**.js'
            foo2:
              - 'foo2/js/lc-global.js'
              - 'foo2/js/scripts/**.js'

      - name: Install node
        uses: actions/setup-node@v3
        with:
          node-version: 16.13.0
          registry-url: "https://registry.npmjs.org"

      - name: Install uglify-js
        run: npm install uglify-js -g

      # minify files for each project
      - name: minify script files for foo
        if: steps.changes.outputs.foo == 'true'
        run: uglifyjs foo/js/scripts/**.js -o foo/js/live/scripts-bundle.js
      - name: minify global file for foo
        if: steps.changes.outputs.foo == 'true'
        run: uglifyjs foo/js/bc-global.js -o foo/js/live/global-bundle.js

      - name: minify script files for foo2
        if: steps.changes.outputs.foo2 == 'true'
        run: uglifyjs foo2/js/scripts/**.js -o foo2/js/live/scripts-bundle.js
      - name: minify global file for foo2
        if: steps.changes.outputs.foo2 == 'true'
        run: uglifyjs foo2/js/lc-global.js -o foo2/js/live/global-bundle.js

      # Auto committing
      - name: Auto committing minified files
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          file_pattern: "*.js"
          commit_message: "Github Action: Auto Minified JS files"
          branch: ${{ github.ref }}

      # Deploy for foo
      - name: Deploy to S3 for foo
        if: steps.changes.outputs.foo == 'true'
        uses: jakejarvis/s3-sync-action@master
        with:
          args: --follow-symlinks --cache-control max-age=600
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}
          SOURCE_DIR: "foo/js/live"
          DEST_DIR: "foo/pages/assets/js/test/"

        # Deploy for foo2
      - name: Deploy to S3 for foo2
        if: steps.changes.outputs.foo2 == 'true'
        uses: jakejarvis/s3-sync-action@master
        with:
          args: --follow-symlinks --cache-control max-age=600
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}
          SOURCE_DIR: "foo2/js/live"
          DEST_DIR: "foo2/pages/assets/js/test/"

Solution

  • It solved. I added this line(base) above the filters section:

        with:
          base: ${{ github.ref }}
          filters: |
            foo:
              - 'foo/js/bc-global.js'
              - 'foo/js/scripts/**.js'
            foo2:
              - 'foo2/js/lc-global.js'
              - 'foo2/js/scripts/**.js'