Jenkins build artifacts refer to the files generated during a Jenkins build process that capture the state of the code at that point in time. These artifacts can include compiled binaries, packages, logs, reports, documentation and more.
Archiving artifacts is an important part of any mature CI/CD pipeline. It allows you to save these files produced during builds for later use in testing, auditing, deployment and debugging.
In this comprehensive expert guide, we will cover everything you need to know about archiving artifacts in Jenkins Pipeline including:
- What are Jenkins build artifacts
- Why archive artifacts in Jenkins
- How the archiveArtifacts step works
- Configuration options for archiveArtifacts
- Storing artifacts on Jenkins
- Accessing archived artifacts
- Troubleshooting tips
- Best practices
- Real-world examples
- Integrating storage plugins
- Expert troubleshooting techniques
- Scalability best practices
- Artifact storage metrics
- Trends in artifact management
- Business benefits
What are Jenkins Build Artifacts?
As mentioned above, Jenkins build artifacts capture the state of your code at a point in time.
Some examples of common Jenkins artifacts include:
- Compiled binary files and packages
- Test reports (JUnit XML)
- Code coverage reports
- Logs from build and test runs
- Documentation produced from the code
- Docker images
- Deployment packages
Anything generated during the running of Jenkins pipeline can be considered a build artifact that could be useful to archive.
Why Archive Artifacts in Jenkins?
There are several key reasons you should be archiving artifacts in your Jenkins pipelines:
1. Persistence and Traceability
Archived artifacts allow you to go back to previous builds and see the exact state of the code at that point. This is useful for audit purposes, debugging issues and more.
2. Share Files with Team Members
Storing artifacts centrally allows your whole team access to critical files like releases, logs and reports.
3. Deployments
You can use Jenkins to automatically deploy artifacts to different environments right from your pipelines.
4. Integrations
Many tools integrate with Jenkins artifact storage to leverage files in further testing, monitoring and development.
Overall, archiving artifacts is a Jenkins best practice that unlocks many benefits. It is considered a mandatory process for achieving Continuous Integration and Delivery.
How the archiveArtifacts Step Works
The archiveArtifacts
step is used within Jenkins Pipeline code to archive files. Here is its basic syntax:
archiveArtifacts artifacts: ‘**/target/*.jar‘, fingerprint: true
The key options are:
artifacts
– File pattern specifying which files/dirs to archivefingerprint
– Whether to fingerprint archived artifacts
When this step runs, it will gather all artifacts matching the file pattern and store them on the Jenkins controller server filesystem.
The archived artifacts will then be available through the Jenkins UI and API for downstream usage.
Configuration Options
The archiveArtifacts
step has many options to control its behavior:
archiveArtifacts artifacts: ‘build/*.jar‘,
allowEmptyArchive: true,
caseSensitive: true,
defaultExcludes: true,
excludes: ‘**/src/**‘,
fingerprint: true,
followSymlinks: false,
onlyIfSuccessful: true
Here is what each option means:
allowEmptyArchive
: Archive even if no files match the pattern.caseSensitive
: Treat file paths as case sensitive.defaultExcludes
: Exclude common CI/CD files like.git
,.svn
.excludes
: Specify custom exclude file patterns.fingerprint
: Fingerprint archived artifacts.followSymlinks
: Follow symbolic links when archiving.onlyIfSuccessful
: Only archive if the build succeeded.
These options allow you to carefully control what gets archived from your builds.
Storing Artifacts on Jenkins
By default, the archiveArtifacts
step will store files on the Jenkins controller filesystem.
The central storage directory is configured under Manage Jenkins > Configure System > Artifact Storage.
The default root directory is /var/lib/jenkins/jobs/{job_name}/builds/{build_number}/archive/
.
You can archive artifacts to an external storage service by configuring plugins like AWS S3 Plugin and Artifactory Plugin:
archiveArtifacts artifacts: ‘dist/*.tar‘, fingerprint: true
awsS3Upload(file:‘dist/*.tar‘, bucket:‘artifacts‘)
These allow archiving to S3 buckets or Artifactory repositories in a scalable way.
Accessing Archived Artifacts
Archived artifacts can be directly accessed through the Jenkins UI or API endpoints.
In the UI, on the build page you will see a Build Artifacts link. Click this and you can browse all archived artifacts for that particular build.
The Jenkins API allows you to programmatically download artifacts via the REST interface using standard HTTP requests.
Many plugins such as the Artifact Deployer Plugin leverage the centralized artifacts archive to deploy files to environments.
Real-World Examples
Here are some real-world examples showcasing archiveArtifact usage:
Archiving NodeJS Dependency
node {
def nodeModules = ‘node_modules/**‘
stage(‘Install dependencies‘) {
sh ‘npm install‘
}
stage(‘Archive node modules‘) {
archiveArtifacts artifacts: nodeModules
}
}
This archives all Node modules after NPM install for debugging.
Archiving Wildcard Logs
pipeline {
agent any
stages {
stage(‘Test‘) {
steps {
sh ‘./test.sh‘
}
}
stage(‘Archive‘) {
steps {
archiveArtifacts artifacts: ‘**/logs/*‘
}
}
}
}
Archives logs from the test run for troubleshooting failures.
Publishing Conda Package
pipeline {
agent any
stages {
stage(‘Build Package‘) {
steps {
sh ‘conda build recipe/ ‘
}
}
stage(‘Archive & Publish‘) {
steps {
archiveArtifacts artifacts: ‘*.tar.bz2‘
anacondaUpload(artifacts: ‘*.tar.bz2‘)
}
}
}
}
Archives and publishes Conda package to Anaconda cloud.
Troubleshooting Tips
Here are some troubleshooting tips from a DevOps engineering perspective when facing issues archiving or accessing artifacts:
Verify Artifacts Generated
First, validate artifacts are actually produced in your builds. Use wildcard patterns if locations vary between runs.
Check Filesystem Permissions
Triple check the Linux filesystem permissions on the Jenkins Artifact Storage root folder and job folders.
Access Artifacts Directly
SSH into the Jenkins server and attempt accessing artifacts directly through filesystem paths instead of through the UI or API.
Curl Artifact Endpoints
Utilize curl or an HTTP client directly on endpoints like http://jenkins/job/myjob/lastBuild/artifact/*
to isolate issues.
Disable Conditional Archiving
Temporary disable settings like onlyIfSuccessful
while troubleshooting to verify that artifacts are actually being archived each run.
Inspect Jenkins Logs
Dig through the raw Jenkins logs to pinpoint errors related to archiving. Look for messages on the hudson.tasks.ArtifactArchiver
logger.
Validate Plugin Configurations
If using S3 or Artifactory plugins, test authentication and connectivity through standalone client tools first.
Scalability Best Practices
When archiving artifacts in large-scale Jenkins deployments with 100s of jobs, be mindful of storage scaling:
Implement External Storage
Use S3 or shared storage for artifacts rather than the Jenkins server disk for durability and scale.
Cleanup Old Artifacts
Set TTL policies based on age or number of versions to cleanup old artifacts andlimit disk usage.
Index Metadata Only
For extra large artifacts, archive only a manifest JSON/XML with metadata rather than all files.
Distribute Builds
Spread pipeline across a Jenkins cluster for better resiliency and disk usage.
Jenkins Artifact Storage Metrics
Here are some interesting metric benchmarks around Jenkins artifact storage from CloudBees 2021 State of CI/CD Report:
- 83% of respondants actively use artifact archiving in production Jenkins instances
- 58% utilize external cloud storage providers to store artifacts
- Artifact storage accounts for 35% of total Jenkins disk capacity on average
- 78% of organizations enforce data retention policies around artifacts
And here is a forecast of artifact storage growth across industries:
Trends in Artifact Management
Modern trends around managing artifacts in mature DevOps pipelines include:
- Centralized Repositories: Stores artifacts from any source in vendor neutral solutions like JFrog Artifactory or Cloudbees.
- Immutable Storage: Read-only artifact repositories that cannot be changed for integrity.
- Permanent IDs: Globally unique identifiers for artifacts like SHA-256 hash digests.
- Metadata Search: Search based on artifact metadata versus full content indexing.
- Universal Viewers: Common viewers for reviewing any artifact file format.
These help standardize artifact management across multi-tool pipelines.
Business Benefits
Here are some key business benefits organizations can realize by implementing mature artifact management processes:
67% faster recovery times from outages and issues due to improved debugging from archived artifact history
58% reduction in compliance/auditing costs with centralized build records and automated retention policies
72% faster time-to-market through automated downstream deliverables from release candidates to deployment packages
55% improved productivity by leveraging archived artifacts directly during development
Conclusion
Archiving build artifacts is an essential practice that unlocks many capabilities for Jenkins pipelines within mature CI/CD infrastructure. Leveraging the flexible archiveArtifacts
DSL combined with external storage and metadata retention provides a scalable artifact management system.
We covered a complete expert guide including real-word examples, troubleshooting techniques, scalability best practices, industry metrics and business benefits.
Now you have everything you need to know to be successful archiving artifacts within your Jenkins pipelines!