123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #!/bin/bash
- set -e
- set -o pipefail
- usage() {
- cat >&2 <<'EOF'
- To publish the Docker documentation you need to set your access_key and secret_key in the docs/awsconfig file
- (with the keys in a [profile $AWS_S3_BUCKET] section - so you can have more than one set of keys in your file)
- and set the AWS_S3_BUCKET env var to the name of your bucket.
- If you're publishing the current release's documentation, also set `BUILD_ROOT=yes`
- make AWS_S3_BUCKET=docs-stage.docker.com docs-release
- will then push the documentation site to your s3 bucket.
- Note: you can add `OPTIONS=--dryrun` to see what will be done without sending to the server
- You can also add NOCACHE=1 to publish without a cache, which is what we do for the master docs.
- EOF
- exit 1
- }
- create_robots_txt() {
- cat > ./sources/robots.txt <<'EOF'
- User-agent: *
- Disallow: /
- EOF
- }
- setup_s3() {
- # Try creating the bucket. Ignore errors (it might already exist).
- echo "create $BUCKET if it does not exist"
- aws s3 mb --profile $BUCKET s3://$BUCKET 2>/dev/null || true
- # Check access to the bucket.
- echo "test $BUCKET exists"
- aws s3 --profile $BUCKET ls s3://$BUCKET
- # Make the bucket accessible through website endpoints.
- echo "make $BUCKET accessible as a website"
- #aws s3 website s3://$BUCKET --index-document index.html --error-document jsearch/index.html
- local s3conf=$(cat s3_website.json | envsubst)
- aws s3api --profile $BUCKET put-bucket-website --bucket $BUCKET --website-configuration "$s3conf"
- }
- build_current_documentation() {
- mkdocs build
- cd site/
- gzip -9k -f search_content.json
- cd ..
- }
- upload_current_documentation() {
- src=site/
- dst=s3://$BUCKET$1
- cache=max-age=3600
- if [ "$NOCACHE" ]; then
- cache=no-cache
- fi
- printf "\nUploading $src to $dst\n"
- # a really complicated way to send only the files we want
- # if there are too many in any one set, aws s3 sync seems to fall over with 2 files to go
- # versions.html_fragment
- include="--recursive --include \"*.$i\" "
- run="aws s3 cp $src $dst $OPTIONS --profile $BUCKET --cache-control $cache --acl public-read $include"
- printf "\n=====\n$run\n=====\n"
- $run
- # Make sure the search_content.json.gz file has the right content-encoding
- aws s3 cp --profile $BUCKET --cache-control $cache --content-encoding="gzip" --acl public-read "site/search_content.json.gz" "$dst"
- }
- invalidate_cache() {
- if [[ -z "$DISTRIBUTION_ID" ]]; then
- echo "Skipping Cloudfront cache invalidation"
- return
- fi
- dst=$1
- aws configure set preview.cloudfront true
- # Get all the files
- # not .md~ files
- # replace spaces w %20 so urlencoded
- files=( $(find site/ -not -name "*.md*" -type f | sed 's/site//g' | sed 's/ /%20/g') )
- len=${#files[@]}
- last_file=${files[$((len-1))]}
- echo "aws cloudfront create-invalidation --profile $AWS_S3_BUCKET --distribution-id $DISTRIBUTION_ID --invalidation-batch '" > batchfile
- echo "{\"Paths\":{\"Quantity\":$len," >> batchfile
- echo "\"Items\": [" >> batchfile
- for file in "${files[@]}" ; do
- if [[ $file == $last_file ]]; then
- comma=""
- else
- comma=","
- fi
- echo "\"$dst$file\"$comma" >> batchfile
- done
- echo "]}, \"CallerReference\":\"$(date)\"}'" >> batchfile
- sh batchfile
- }
- main() {
- [ "$AWS_S3_BUCKET" ] || usage
- # Make sure there is an awsconfig file
- export AWS_CONFIG_FILE=$(pwd)/awsconfig
- [ -f "$AWS_CONFIG_FILE" ] || usage
- # Get the version
- VERSION=$(cat VERSION)
- # Disallow pushing dev docs to master
- if [ "$AWS_S3_BUCKET" == "docs.docker.com" ] && [ "${VERSION%-dev}" != "$VERSION" ]; then
- echo "Please do not push '-dev' documentation to docs.docker.com ($VERSION)"
- exit 1
- fi
- # Clean version - 1.0.2-dev -> 1.0
- export MAJOR_MINOR="v${VERSION%.*}"
- export BUCKET=$AWS_S3_BUCKET
- export AWS_DEFAULT_PROFILE=$BUCKET
- # debug variables
- echo "bucket: $BUCKET, full version: $VERSION, major-minor: $MAJOR_MINOR"
- echo "cfg file: $AWS_CONFIG_FILE ; profile: $AWS_DEFAULT_PROFILE"
- # create the robots.txt
- create_robots_txt
- if [ "$OPTIONS" != "--dryrun" ]; then
- setup_s3
- fi
- # Default to only building the version specific docs
- # so we don't clober the latest by accident with old versions
- if [ "$BUILD_ROOT" == "yes" ]; then
- echo "Building root documentation"
- build_current_documentation
- echo "Uploading root documentation"
- upload_current_documentation
- [ "$NOCACHE" ] || invalidate_cache
- fi
- #build again with /v1.0/ prefix
- sed -i "s/^site_url:.*/site_url: \/$MAJOR_MINOR\//" mkdocs.yml
- echo "Building the /$MAJOR_MINOR/ documentation"
- build_current_documentation
- echo "Uploading the documentation"
- upload_current_documentation "/$MAJOR_MINOR/"
- # Invalidating cache
- [ "$NOCACHE" ] || invalidate_cache "/$MAJOR_MINOR"
- }
- main
|