| # 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 }} |