mirror of
https://github.com/pytorch/pytorch.git
synced 2025-11-11 22:34:53 +08:00
Refactor the docs build workflow (#16265)
Summary: In preparation for setting up a doc build job for stable docs, I wanted to refactor the workflow so that future changes will be easier. This PR the following changes: - Refactor the doc push script into a reusable command - Add command line options for the doc push script. These don't matter too much for now but will be useful for setting up future jobs for building different versions of the docs. - Instead of checking out pytorch/pytorch:master, we re-use the pytorch installation inside the docker image. - Change the sed in the script to a perl command. sed is annoyingly different across platforms; the perl command is more stable - Run the script in dry run mode (without pushing the doc build) whenever a PR is opened. This lets us test changes to the doc build workflow. Test Plan - I tested the doc build script locally with my own credentials and it worked fine. - Wait for the pytorch_doc_push CI. - After merging this PR, keep an eye on the pytorch_doc_push CI status. Pull Request resolved: https://github.com/pytorch/pytorch/pull/16265 Differential Revision: D13803511 Pulled By: zou3519 fbshipit-source-id: 4564bca3e74d490f89a1d1da9fb8b98eb44bdbb1
This commit is contained in:
committed by
Facebook Github Bot
parent
a4be15377f
commit
af513cd433
@ -20,6 +20,110 @@ install_official_git_client: &install_official_git_client
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install openssh-client git
|
||||
|
||||
install_doc_push_script: &install_doc_push_script
|
||||
name: Install the doc push script
|
||||
no_output_timeout: "2m"
|
||||
command: |
|
||||
cat >/home/circleci/project/doc_push_script.sh <<EOL
|
||||
# =================== The following code **should** be executed inside Docker container ===================
|
||||
|
||||
# This is where the local pytorch install in the docker image is located
|
||||
pt_checkout="/var/lib/jenkins/workspace"
|
||||
|
||||
# Since we're cat-ing this file, we need to escape all $'s
|
||||
echo "doc_push_script.sh: Invoked with \$*"
|
||||
|
||||
git clone https://yf225:${GITHUB_PYTORCHBOT_TOKEN}@github.com/pytorch/pytorch.github.io -b site
|
||||
pushd pytorch.github.io
|
||||
|
||||
set -ex
|
||||
|
||||
# Argument 1: Where to copy the built documentation to
|
||||
# (pytorch.github.io/$install_path)
|
||||
install_path="\$1"
|
||||
if [ -z "\$install_path" ]; then
|
||||
echo "error: doc_push_script.sh: install_path (arg1) not specified"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Argument 2: What version of the docs we are building.
|
||||
version="\$2"
|
||||
if [ -z "\$version" ]; then
|
||||
echo "error: doc_push_script.sh: version (arg2) not specified"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
is_master_doc=false
|
||||
if [ "\$version" == "master" ]; then
|
||||
is_master_doc=true
|
||||
fi
|
||||
|
||||
# Argument 3: (optional) If present, we will NOT do any pushing. Used for testing.
|
||||
dry_run=false
|
||||
if [ "\$3" != "" ]; then
|
||||
dry_run=true
|
||||
fi
|
||||
|
||||
echo "install_path: \$install_path version: \$version dry_run: \$dry_run"
|
||||
|
||||
export LC_ALL=C
|
||||
export PATH=/opt/conda/bin:$PATH
|
||||
|
||||
rm -rf pytorch || true
|
||||
|
||||
# Get all the documentation sources, put them in one place
|
||||
pushd "\$pt_checkout"
|
||||
git clone https://github.com/pytorch/vision
|
||||
pushd vision
|
||||
conda install -q pillow
|
||||
time python setup.py install
|
||||
popd
|
||||
pushd docs
|
||||
rm -rf source/torchvision
|
||||
cp -r ../vision/docs/source source/torchvision
|
||||
|
||||
# Build the docs
|
||||
pip -q install -r requirements.txt || true
|
||||
if [ "\$is_master_doc" = true ]; then
|
||||
make html
|
||||
else
|
||||
make html-stable
|
||||
fi
|
||||
|
||||
# Move them into the docs repo
|
||||
popd
|
||||
popd
|
||||
git rm -rf "\$install_path" || true
|
||||
mv "\$pt_checkout/docs/build/html" "\$install_path"
|
||||
|
||||
# Add the version handler by search and replace.
|
||||
# XXX: Consider moving this to the docs Makefile or site build
|
||||
if [ "\$is_master_doc" = true ]; then
|
||||
find "\$install_path" -name "*.html" -print0 | xargs -0 perl -pi -w -e "s@master\s+\((\d\.\d\.[A-Fa-f0-9]+\+[A-Fa-f0-9]+)\s+\)@<a href='http://pytorch.org/docs/versions.html'>\1 \▼</a>@g"
|
||||
else
|
||||
find "\$install_path" -name "*.html" -print0 | xargs -0 perl -pi -w -e "s@master\s+\((\d\.\d\.[A-Fa-f0-9]+\+[A-Fa-f0-9]+)\s+\)@<a href='http://pytorch.org/docs/versions.html'>\$version \▼</a>@g"
|
||||
fi
|
||||
|
||||
git add "\$install_path" || true
|
||||
git status
|
||||
git config user.email "soumith+bot@pytorch.org"
|
||||
git config user.name "pytorchbot"
|
||||
# If there aren't changes, don't make a commit; push is no-op
|
||||
git commit -m "auto-generating sphinx docs" || true
|
||||
git status
|
||||
|
||||
if [ "\$dry_run" = false ]; then
|
||||
echo "Pushing to pytorch.github.io:site"
|
||||
git push origin site
|
||||
else
|
||||
echo "Skipping push due to dry_run"
|
||||
fi
|
||||
|
||||
popd
|
||||
# =================== The above code **should** be executed inside Docker container ===================
|
||||
EOL
|
||||
chmod +x /home/circleci/project/doc_push_script.sh
|
||||
|
||||
setup_ci_environment: &setup_ci_environment
|
||||
name: Set Up CI Environment
|
||||
no_output_timeout: "1h"
|
||||
@ -1078,70 +1182,25 @@ jobs:
|
||||
- run:
|
||||
<<: *setup_ci_environment
|
||||
- run:
|
||||
name: Doc Push
|
||||
<<: *install_doc_push_script
|
||||
- run:
|
||||
name: Doc Build and Push
|
||||
no_output_timeout: "1h"
|
||||
command: |
|
||||
set -e
|
||||
if [[ "${CIRCLE_BRANCH}" != "master" ]]; then
|
||||
echo "Skipping doc push..."
|
||||
exit 0
|
||||
fi
|
||||
export COMMIT_DOCKER_IMAGE=${DOCKER_IMAGE}-${CIRCLE_SHA1}
|
||||
echo "DOCKER_IMAGE: "${COMMIT_DOCKER_IMAGE}
|
||||
docker pull ${COMMIT_DOCKER_IMAGE} >/dev/null
|
||||
export id=$(docker run -t -d -w /var/lib/jenkins ${COMMIT_DOCKER_IMAGE})
|
||||
|
||||
cat >/home/circleci/project/doc_push_script.sh <<EOL
|
||||
# =================== The following code will be executed inside Docker container ===================
|
||||
git clone https://yf225:${GITHUB_PYTORCHBOT_TOKEN}@github.com/pytorch/pytorch.github.io -b site
|
||||
pushd pytorch.github.io
|
||||
|
||||
set -ex
|
||||
|
||||
export LC_ALL=C
|
||||
export PATH=/opt/conda/bin:$PATH
|
||||
|
||||
rm -rf pytorch || true
|
||||
|
||||
# Get all the documentation sources, put them in one place
|
||||
# TODO: These clones can race
|
||||
git clone https://github.com/pytorch/pytorch
|
||||
pushd pytorch
|
||||
git clone https://github.com/pytorch/vision
|
||||
pushd vision
|
||||
conda install -q pillow
|
||||
time python setup.py install
|
||||
popd
|
||||
pushd docs
|
||||
rm -rf source/torchvision
|
||||
cp -r ../vision/docs/source source/torchvision
|
||||
|
||||
# Build the docs
|
||||
pip -q install -r requirements.txt || true
|
||||
make html
|
||||
|
||||
# Move them into the docs repo
|
||||
popd
|
||||
popd
|
||||
git rm -rf docs/master || true
|
||||
mv pytorch/docs/build/html docs/master
|
||||
find docs/master -name "*.html" -print0 | xargs -0 sed -i -E 's/master[[:blank:]]\\([[:digit:]]\\.[[:digit:]]\\.[[:xdigit:]]+\\+[[:xdigit:]]+[[:blank:]]\\)/<a href="http:\\/\\/pytorch.org\\/docs\\/versions.html">& \\▼<\\/a>/g'
|
||||
git add docs/master || true
|
||||
git status
|
||||
git config user.email "soumith+bot@pytorch.org"
|
||||
git config user.name "pytorchbot"
|
||||
# If there aren't changes, don't make a commit; push is no-op
|
||||
git commit -m "auto-generating sphinx docs" || true
|
||||
git status
|
||||
git push origin site
|
||||
|
||||
popd
|
||||
# =================== The above code will be executed inside Docker container ===================
|
||||
EOL
|
||||
chmod +x /home/circleci/project/doc_push_script.sh
|
||||
docker cp /home/circleci/project/doc_push_script.sh $id:/var/lib/jenkins/workspace/doc_push_script.sh
|
||||
|
||||
export COMMAND='((echo "export JOB_BASE_NAME=${JOB_BASE_NAME}" && echo "source ./workspace/env" && echo "sudo chown -R jenkins workspace && cd workspace && ./doc_push_script.sh") | docker exec -u jenkins -i "$id" bash) 2>&1'
|
||||
if [[ "${CIRCLE_BRANCH}" != "master" ]]; then
|
||||
# Do a dry_run of the docs build. This will build the docs but not push them.
|
||||
export COMMAND='((echo "export JOB_BASE_NAME=${JOB_BASE_NAME}" && echo "source ./workspace/env" && echo "sudo chown -R jenkins workspace && cd workspace && ./doc_push_script.sh docs/master master dry_run") | docker exec -u jenkins -i "$id" bash) 2>&1'
|
||||
else
|
||||
export COMMAND='((echo "export JOB_BASE_NAME=${JOB_BASE_NAME}" && echo "source ./workspace/env" && echo "sudo chown -R jenkins workspace && cd workspace && ./doc_push_script.sh docs/master master") | docker exec -u jenkins -i "$id" bash) 2>&1'
|
||||
fi
|
||||
echo ${COMMAND} > ./command.sh && unbuffer bash ./command.sh | ts
|
||||
|
||||
pytorch_macos_10_13_py3_build:
|
||||
|
||||
Reference in New Issue
Block a user