I’m excited to announce that AWS CodeBuild now helps parallel check execution, so you may run your check suites concurrently and scale back construct occasions considerably.
With the demo mission I wrote for this publish, the full check time went down from 35 minutes to six minutes, together with the time to provision the environments. These two screenshots from the AWS Administration Console present the distinction.
Sequential execution of the check suite
Parallel execution of the check suite
Very lengthy check occasions pose a big problem when operating steady integration (CI) at scale. As tasks develop in complexity and group measurement, the time required to execute complete check suites can improve dramatically, resulting in prolonged pipeline execution occasions. This not solely delays the supply of latest options and bug fixes, but additionally hampers developer productiveness by forcing them to attend for construct outcomes earlier than continuing with their duties. I’ve skilled pipelines that took as much as 60 minutes to run, solely to fail on the final step, requiring an entire rerun and additional delays. These prolonged cycles can erode developer belief within the CI course of, contribute to frustration, and in the end decelerate your complete software program supply cycle. Furthermore, long-running checks can result in useful resource rivalry, elevated prices due to wasted computing energy, and lowered general effectivity of the event course of.
With parallel check execution in CodeBuild, now you can run your checks concurrently throughout a number of construct compute environments. This function implements a sharding method the place every construct node independently executes a subset of your check suite. CodeBuild supplies atmosphere variables that establish the present node quantity and the full variety of nodes, that are used to find out which checks every node ought to run. There is no such thing as a management construct node or coordination between nodes at construct time—every node operates independently to execute its assigned portion of your checks.
To allow check splitting, configure the batch fanout part in your buildspec.xml
, specifying the specified parallelism degree and different related parameters. Moreover, use the codebuild-tests-run utility in your construct step, together with the suitable check instructions and the chosen splitting technique.
The checks are cut up based mostly on the sharding technique you specify. codebuild-tests-run
presents two sharding methods:
- Equal-distribution. This technique types check recordsdata alphabetically and distributes them in chunks equally throughout parallel check environments. Adjustments within the names or amount of check recordsdata may reassign recordsdata throughout shards.
- Stability. This technique fixes the distribution of checks throughout shards by utilizing a constant hashing algorithm. It maintains current file-to-shard assignments when new recordsdata are added or eliminated.
CodeBuild helps computerized merging of check stories when operating checks in parallel. With computerized check report merging, CodeBuild consolidates checks stories right into a single check abstract, simplifying end result evaluation. The merged report contains aggregated move/fail statuses, check durations, and failure particulars, lowering the necessity for handbook report processing. You possibly can view the merged ends in the CodeBuild console, retrieve them utilizing the AWS Command Line Interface (AWS CLI), or combine them with different reporting instruments to streamline check evaluation.
Let’s take a look at the way it works
Let me reveal implement parallel testing in a mission. For this demo, I created a really primary Python mission with tons of of checks. To hurry issues up, I requested Amazon Q Developer on the command line to create a mission and 1,800 check circumstances. Every check case is in a separate file and takes one second to finish. Working all checks in a sequence requires half-hour, excluding the time to provision the atmosphere.
On this demo, I run the check suite on ten compute environments in parallel and measure how lengthy it takes to run the suite.
To take action, I added a buildspec.yml
file to my mission.
model: 0.2
batch:
fast-fail: false
build-fanout:
parallelism: 10 # ten runtime environments
ignore-failure: false
phases:
set up:
instructions:
- echo 'Putting in Python dependencies'
- dnf set up -y python3 python3-pip
- pip3 set up --upgrade pip
- pip3 set up pytest
construct:
instructions:
- echo 'Working Python Exams'
- |
codebuild-tests-run
--test-command 'python -m pytest --junitxml=report/test_report.xml'
--files-search "codebuild-glob-search 'checks/test_*.py'"
--sharding-strategy 'equal-distribution'
post_build:
instructions:
- echo "Check execution accomplished"
stories:
pytest_reports:
recordsdata:
- "*.xml"
base-directory: "report"
file-format: JUNITXML
There are three elements to focus on within the YAML file.
First, there’s a build-fanout
part below batch
. The parallelism
command tells CodeBuild what number of check environments to run in parallel. The ignore-failure
command signifies if failure in any of the fanout construct duties will be ignored.
Second, I exploit the pre-installed codebuild-tests-run
command to run my checks.
This command receives the entire checklist of check recordsdata and decides which of the checks have to be run on the present node.
- Use the
sharding-strategy
argument to decide on between equally distributed or secure distribution, as I defined earlier. - Use the
files-search
argument to move all of the recordsdata which might be candidates for a run. We suggest to make use of the offeredcodebuild-glob-search
command for efficiency causes, however any file search device, equivalent to discover(1), will work. - I move the precise check command to run on the shard with the
test-command
argument.
Lastly, the stories
part instructs CodeBuild to gather and merge the check stories on every node.
Then, I open the CodeBuild console to create a mission and a batch construct configuration for this mission. There’s nothing new right here, so I’ll spare you the main points. The documentation has all the main points to get you began. Parallel testing works on batch builds. Make certain to configure your mission to run in batch.
Now, I’m able to set off an execution of the check suite. I can commit new code on my GitHub repository or set off the construct within the console.
After a couple of minutes, I see a standing report of the completely different steps of the construct; with a standing for every check atmosphere or shard.
When the check is full, I choose the Experiences tab to entry the merged check stories.
The Experiences part aggregates all check information from all shards and retains the historical past for all builds. I choose my most up-to-date construct within the Report historical past part to entry the detailed report.
As anticipated, I can see the aggregated and the person standing for every of my 1,800 check circumstances. On this demo, they’re all passing, and the report is inexperienced.
The 1,800 checks of the demo mission take one second every to finish. Once I run this check suite sequentially, it took 35 minutes to finish. Once I run the check suite in parallel on ten compute environments, it took 6 minutes to finish, together with the time to provision the environments. The parallel run took 17.9 p.c of the time of the sequential run. Precise numbers will differ together with your tasks.
Further issues to know
This new functionality is appropriate with all testing frameworks. The documentation contains examples for Django, Elixir, Go, Java (Maven), Javascript (Jest), Kotlin, PHPUnit, Pytest, Ruby (Cucumber), and Ruby (RSpec).
For check frameworks that don’t settle for space-separated lists, the codebuild-tests-run
CLI supplies a versatile different via the CODEBUILD_CURRENT_SHARD_FILES
atmosphere variable. This variable incorporates a newline-separated checklist of check file paths for the present construct shard. You should use it to adapt to completely different check framework necessities and format check file names.
You possibly can additional customise how checks are cut up throughout environments by writing your personal sharding script and utilizing the CODEBUILD_BATCH_BUILD_IDENTIFIER
atmosphere variable, which is robotically set in every construct. You should use this method to implement framework-specific parallelization or optimization.
Pricing and availability
With parallel check execution, now you can full your check suites in a fraction of the time beforehand required, accelerating your growth cycle and enhancing your group’s productiveness.
Parallel check execution is out there on all three compute modes supplied by CodeBuild: on-demand, reserved capability, and AWS Lambda compute.
This functionality is out there at the moment in all AWS Areas the place CodeBuild is obtainable, with no extra value past the usual CodeBuild pricing for the compute sources used.
I invite you to attempt parallel check execution in CodeBuild at the moment. Go to the AWS CodeBuild documentation to be taught extra and get began with parallelizing your checks.
PS: Right here’s the immediate I used to create the demo utility and its check suite: “I’m writing a weblog publish to announce codebuild parallel testing. Write a quite simple python app that has tons of of checks, every check in a separate check file. Every check takes one second to finish.”
How is the Information Weblog doing? Take this 1 minute survey!
(This survey is hosted by an exterior firm. AWS handles your info as described within the AWS Privateness Discover. AWS will personal the information gathered through this survey and won’t share the data collected with survey respondents.)