blob: 185239a1bfc5a912a25cb1869f489ded2ba29313 [file] [log] [blame]
# Builds and deploys the site if the build was successful
#
# This job builds the website and deploys the build artifacts to the 'content' directory
# Any additional files that are not part of the site build but should be published (e.g. website configuration files) must be handled explicitly
# See step "Move additional resources to build directory" and sub-steps "Dropping old site resources" and "Adding new site configuration" of the 'publish' step
name: Build & Deploy Site
# Conditions necessary to trigger a build
on:
push:
# Only run for pushes to the following branches
#
# Including the branch that is pushed by this action will lead to an infinite loop
branches:
- 'master'
# Only build if a file in one of these paths has been changed
paths:
- 'src/main/asciidoc/**'
- 'src/main/template/**'
- '.asf.yaml.publish'
- '.htaccess'
jobs:
deploy-site:
name: Build & Deploy Site
runs-on: ubuntu-latest
defaults:
run:
shell: bash
env:
# The name of the branch used to publish the website build artifacts
BRANCH_NAME: publish
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 1
- name: Build Site
run: |
mvn clean package
# Determines the short sha of the commit that triggered the build
- name: Determine Short SHA
if: success()
id: short-sha
run: |
short_sha=$(git rev-parse --short=10 $GITHUB_SHA)
echo "::set-output name=SHORT_SHA::$short_sha"
# Determines the author data of the HEAD commit
# Sets up the author data to be used for the site deploy commit
- name: Determine HEAD Commit Author Data
if: success()
id: author-data
run: |
echo "Reading author data"
author_name=$(git log -1 --format='%aN' HEAD)
author_email=$(git log -1 --format='%aE' HEAD)
echo "Setting up author data to use for deploy commit"
git config user.name $author_name
git config user.email $author_email
# Adds additional configuration files that are supposed to be included in the page deploy to the build directory
#
# This ensures that such files are preserved when checking out the publish branch
- name: Add Additional Resources to Build Directory
if: success()
run: |
cp -v .asf.yaml.publish target/site/.asf.yaml
cp -v .htaccess target/site/
- name: Check Out Site Branch
if: success()
run: |
git fetch origin ${{ env.BRANCH_NAME }}
git checkout -b ${{ env.BRANCH_NAME }} origin/${{ env.BRANCH_NAME }}
# Drops all existing files and folders except the base folder and the resources excluded by the regex
# This ensures that old configuration files that were removed on the master will be removed from the site branch as well
# Additional resources to exclude can be added by modifying the regex or adding new regex by using "-a -not -regex '...'"
- name: Drop Old Site Resources
if: success()
run: |
find . \
-mindepth 1 -regextype posix-extended \
-not -regex '^\./(target|.git)(/.*)?$' \
-delete -print
# Moves additional configuration files that were added to the build directory to their target directory
# In general, this should move all resources touched in the step 'Add additional resources to build directory'
- name: Add New Site Configuration
if: success()
run: |
mv -v target/site/.asf.yaml ./
mv -v target/site/.htaccess ./
# Moves the new site resources from the build directory to the content directory
- name: Add New Site Resources
if: success()
run: |
mkdir -v content
mv -v target/site/* content/
# Explicitly removes build dir
# This checks whether there are any remaining resources that were not moved to the correct location
# Drops the rest of the resources in the target directory if there are any
echo
echo "Removing site build directory"
if rmdir -v target/site
then
echo
echo "Removing remaining build directories"
rm -r -v target
else
echo
echo "Failed due to resources remaining in site build directory:"
tree target/site
exit 1
fi
- name: Stage Changes
id: stage-changes
if: success()
run: |
git add -v -A
if $(git diff -s --cached --exit-code)
then
# nothing staged
echo "Nothing to commit"
has_staged_changes=false
else
# something staged
has_staged_changes=true
fi
echo "::set-output name=HAS_STAGED_CHANGES::$has_staged_changes"
# Publishes the build results
# Does nothing if there is nothing to publish
- name: Publish Results
if: success() && steps.stage-changes.outputs.HAS_STAGED_CHANGES == 'true'
run: |
echo "Committing changes"
git commit -m "Auto-deploy site for commit ${{ steps.short-sha.outputs.SHORT_SHA }}"
echo
echo "Pushing site branch"
git push origin ${{ env.BRANCH_NAME }}