# Release Automation
A user starts the build process by supplying a release version (e.g. 3.13.0) and a commit hash to the release pipeline.
## Stage 1:
1. check if tag exists
2. if tag exists, check that the commit matches the commit submitted by the user
3. if tag exists for the right commit, checkout the tag
4. if tag does not exist, create a tag for the commit submitted by the user
5. if tag does not exist at step 1, build a python package
6. if tag does exist at step 1, try to download package from PyPI.
a) If the package is present on PyPI, download it
b) if the package is not present on PyPI, build the package
7. upload the python package using artifact-upload action
8. create an archive from the repository and upload it using artifact-upload action
## Stage 2:
1. Build a container from the package uploaded in stage 1
2. Check if client packages exist and download them if so
3. If client packages don't exist, build them.
4. Run the full test matrix
5. Upload client packages using artifact-upload action
6. Create an archive of the docs and upload using artifact-upload action
## Stage 3.
1. If tag does not exist on github, push the tag
2. If the package does not exist on PyPI, publish it to PyPI
3. If client package does not exist on PyPI, publish it to PyPI
4. If client package does not exist on RubyGems.org, publish it
5. Publish docs to pulpproject.org