- Create multiple jobs
- Use the Upload and download artifact action
- Use Superlinter to lint your sourcecode
Super-linter is a tool that can be used to lint your sourcecode. It is a combination of multiple linters, and can be used to lint multiple languages.
It's invoked as a github action, and can be found on Github Marketplace.
In this exercise we will use it to lint our sourcecode in a separate job.
When running multiple jobs, the runner you get for each job is completely new.
This means that the state of the repository is not persisted between jobs.
💡 This should not be mistaken for proper artifact management, or release management but it is useful for making the artifacts built by the pipeline available.
To deal with artifacts, a Github Actions Action
can be used, which can be found on Github Marketplace.
To upload artifacts use the following syntax with actions/upload-artifact@v4
Link to documentation:
- name: Upload a Build Artifact # Name of the step
uses: actions/upload-artifact@v4 # Action to use
with: # Parameters for the action
name: my-artifact # Name of the artifact to upload. Optional. Default is 'artifact
path: path/to/artifact/ # A file, directory or wildcard pattern that describes what to upload. Required.
As artifacts can be uploaded it can also be downloaded from Github Actions with help of actions/download-artifact@v4
as:
- name: Download a single artifact # Name of the step
uses: actions/download-artifact@v4 # Action to use
with: # Parameters for the action
name: my-artifact # Name of the artifact to download. Optional. If unspecified, all artifacts for the run are downloaded.
path: path/to/download/artifact/ # Destination path. Supports basic tilde expansion. # Optional. Default is $GITHUB_WORKSPACE
You can find more information around the different parameters via the link to documentation for download action.
💡
More information about storing artifacts
Github has an excelent guide on how you can use persistant storage over periods of builds here: https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts- Create a linter job
- Use the
actions/upload-artifact
andactions/download-artifact
- Use
super-linter/super-linter/slim
to lint your sourcecode
- Add step named
Upload repo
to the existing job, which will upload an artifact with the namecode
, with the path.
to use the current directory.
- uses: actions/upload-artifact@v4
with:
name: code
path: .
include-hidden-files: true
complete solution
name: Main workflow
on: push
jobs:
Build:
runs-on: ubuntu-latest
container: gradle:6-jdk11
steps:
- name: Clone down repository
uses: actions/checkout@v4
- name: Build application
run: ci/build-app.sh
- name: Test
run: ci/unit-test-app.sh
- name: Upload repo
uses: actions/upload-artifact@v4
with:
name: code
path: .
include-hidden-files: true
Push that up to your repository and check the actions tab.
If all works out fine, your newest build should show something like, where you can find your uploaded artifact:
We will now create a new job, which will use super-linter to lint our sourcecode.
- add a new job named
Linting
to your workflow - Like the other job it will run on
ubuntu-latest
- It
needs
theBuild
step. Add a line underruns-on
withneeds: [Build]
- It will have two steps,
Download code
andrun linting
Download code
uses theactions/download-artifact@v4
action to download the artifactcode
to the current directory.
run linting
uses thesuper-linter/super-linter/slim
action to lint the code. It needs two environment variables to work:DEFAULT_BRANCH
which should be set tomain
GITHUB_TOKEN
which should be set to${{ secrets.GITHUB_TOKEN }}
complete solution
Linting:
runs-on: ubuntu-latest
needs: [Build]
steps:
- name: Download code
uses: actions/download-artifact@v4
with:
name: code
path: .
- name: run linting
uses: super-linter/super-linter/slim@v7
env:
DEFAULT_BRANCH: main
# To report GitHub Actions status checks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Push that up to your repository and check the actions tab.
Ohh no! the linting failed! What happened?
The log should show something like this:
2024-01-31 10:50:44 [INFO] ----------------------------------------------
2024-01-31 10:50:44 [INFO] ----------------------------------------------
2024-01-31 10:50:44 [INFO] The script has completed
2024-01-31 10:50:44 [INFO] ----------------------------------------------
2024-01-31 10:50:44 [INFO] ----------------------------------------------
2024-01-31 10:50:44 [ERROR] ERRORS FOUND in BASH:[3]
2024-01-31 10:50:45 [ERROR] ERRORS FOUND in DOCKERFILE_HADOLINT:[1]
2024-01-31 10:50:45 [ERROR] ERRORS FOUND in GITHUB_ACTIONS:[2]
2024-01-31 10:50:45 [ERROR] ERRORS FOUND in GOOGLE_JAVA_FORMAT:[5]
2024-01-31 10:50:46 [ERROR] ERRORS FOUND in JAVA:[5]
2024-01-31 10:50:46 [ERROR] ERRORS FOUND in JAVASCRIPT_STANDARD:[1]
2024-01-31 10:50:46 [ERROR] ERRORS FOUND in JSCPD:[1]
2024-01-31 10:50:47 [ERROR] ERRORS FOUND in MARKDOWN:[12]
2024-01-31 10:50:47 [ERROR] ERRORS FOUND in NATURAL_LANGUAGE:[9]
2024-01-31 10:50:47 [ERROR] ERRORS FOUND in PYTHON_BLACK:[1]
2024-01-31 10:50:47 [ERROR] ERRORS FOUND in PYTHON_FLAKE8:[1]
2024-01-31 10:50:48 [ERROR] ERRORS FOUND in PYTHON_ISORT:[1]
2024-01-31 10:50:48 [FATAL] Exiting with errors found!
It seems like we have some linting errors in our code. As this is not a python/bash/javascript course, we will not fix them, but silence the linter with another environment variable.
- Add the environment variable
DISABLE_ERRORS
to therun linting
step, and set it totrue
- name: run linting
uses: super-linter/super-linter/slim@v7
env:
DEFAULT_BRANCH: main
# To report GitHub Actions status checks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISABLE_ERRORS: true
Push that up to your repository and see that the linting now passes, even though we have errors in our code.
Congratulations! You have now created a workflow with multiple jobs, and used artifacts to share data between them.
https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts