106 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
version: 2
 | 
						|
jobs:
 | 
						|
  hold:
 | 
						|
    machine: true
 | 
						|
    steps:
 | 
						|
      - run: echo "This build requires approval to continue..."
 | 
						|
  build:
 | 
						|
    machine: true
 | 
						|
    working_directory: ~/repo
 | 
						|
    steps:
 | 
						|
      - checkout
 | 
						|
      - run:
 | 
						|
          name: Choose which test suite to run based on which files were modified
 | 
						|
          command: |
 | 
						|
            ## As far as I'm aware, there are three possibile cases to check for here. The CIRCLE_COMPARE_URL environment variable will either contain:
 | 
						|
            ## - A SHA1 hash for the commit (If there is only a single commit on the branch)
 | 
						|
            ## - Two SHA1 hashes in a "xxxxxxxx..yyyyyyyy" (comparing the two most recent commits
 | 
						|
            ## - Nothing
 | 
						|
            ## There is certainly a better way to accomplish all of this, but my limited knowledge of git has lead me to write this awful spaghetti code :-/
 | 
						|
            ## We'll handle all 3 of these cases below:
 | 
						|
            ## Checking commits for changes to Packer files
 | 
						|
            COMMIT_SHA1=""
 | 
						|
            PACKER_MODIFIED=0
 | 
						|
            VAGRANT_MODIFIED=0
 | 
						|
            ## Check for empty CIRCLE_COMPARE_URL. If it is, set the SHA1 hash to the CIRCLE_SHA1 environment variable
 | 
						|
            if [ "$(echo -n $CIRCLE_COMPARE_URL | wc -c)" -eq 0 ]; then
 | 
						|
              export COMMIT_SHA1=$CIRCLE_SHA1
 | 
						|
            ## Check for two short-hashes in the CIRCLE_COMPARE_URL by searching for '..'. If it exists, use the second short-hash
 | 
						|
            elif echo "$CIRCLE_COMPARE_URL" | grep '\.\.'; then
 | 
						|
              export COMMIT_SHA1="$(echo $CIRCLE_COMPARE_URL | cut -d '.' -f 5)"
 | 
						|
            ## Check for a single short hash in the CIRCLE_COMPARE_URL and use it if it exists
 | 
						|
            ## TODO: This check may not be needed.
 | 
						|
            else
 | 
						|
              export COMMIT_SHA1="$(echo $CIRCLE_COMPARE_URL | cut -d '/' -f 7)"
 | 
						|
            fi
 | 
						|
            ## Display the files that were modified in this branch
 | 
						|
            echo "Files modified since origin/Master:"
 | 
						|
            git diff-tree --no-commit-id --name-only -r $(git rev-parse origin/HEAD) "$COMMIT_SHA1"
 | 
						|
            ## Check to see if Packer files were modified
 | 
						|
            if [ "$(git diff-tree --no-commit-id --name-only -r $(git rev-parse origin/HEAD) "$COMMIT_SHA1" | grep -c ^Packer/)" -gt 0 ]; then
 | 
						|
              export PACKER_MODIFIED=1
 | 
						|
            fi
 | 
						|
            if [ "$(git diff-tree --no-commit-id --name-only -r $(git rev-parse origin/HEAD) "$COMMIT_SHA1" | grep -c ^Vagrant/)" -gt 0 ]; then
 | 
						|
              export VAGRANT_MODIFIED=1
 | 
						|
            fi
 | 
						|
            echo "Displaying the values of the modifier environment variables:"
 | 
						|
            echo "VAGRANT_MODIFIED=$VAGRANT_MODIFIED"
 | 
						|
            echo "PACKER_MODIFIED=$PACKER_MODIFIED"
 | 
						|
            ## Choosing which test suite to run based on the files that were changed
 | 
						|
            if [[ "$PACKER_MODIFIED" -eq 1 ]] && [[ "$VAGRANT_MODIFIED" -eq 1 ]]; then
 | 
						|
              echo "Running the test suite for Packer and Vagrant changes"
 | 
						|
              chmod +x ci/circle_workflows/packer_and_vagrant_changes.sh
 | 
						|
              ci/circle_workflows/packer_and_vagrant_changes.sh
 | 
						|
              exit 0
 | 
						|
            fi
 | 
						|
            if [[ "$PACKER_MODIFIED" -eq 0 ]] && [[ "$VAGRANT_MODIFIED" -eq 0 ]]; then
 | 
						|
              echo "Running the default test suite (Vagrant-only)"
 | 
						|
              chmod +x ci/circle_workflows/vagrant_changes.sh
 | 
						|
              ci/circle_workflows/vagrant_changes.sh
 | 
						|
              exit 0
 | 
						|
            fi
 | 
						|
            if [ "$PACKER_MODIFIED" -eq 1 ]; then
 | 
						|
              echo "Running the test suite for Packer-only changes"
 | 
						|
              chmod +x ci/circle_workflows/packer_changes.sh
 | 
						|
              ci/circle_workflows/packer_changes.sh
 | 
						|
              exit 0
 | 
						|
            fi
 | 
						|
            if [ "$VAGRANT_MODIFIED" -eq 1 ]; then
 | 
						|
              echo "Running the test suite for Vagrant-only changes"
 | 
						|
              chmod +x ci/circle_workflows/vagrant_changes.sh
 | 
						|
              ci/circle_workflows/vagrant_changes.sh
 | 
						|
              exit 0
 | 
						|
            fi
 | 
						|
 | 
						|
      - store_artifacts:
 | 
						|
          path: /tmp/artifacts
 | 
						|
 | 
						|
workflows:
 | 
						|
  version: 2
 | 
						|
  workflow:
 | 
						|
    jobs:
 | 
						|
      - hold:
 | 
						|
          type: approval
 | 
						|
          filters:
 | 
						|
            branches:
 | 
						|
              # Don't rebuild the PR after it has been merged into master
 | 
						|
              # Users cannot push directly to master as it is a protected branch
 | 
						|
              ignore: master
 | 
						|
      - build:
 | 
						|
          requires:
 | 
						|
            - hold
 | 
						|
          filters:
 | 
						|
            branches:
 | 
						|
              # Don't rebuild the PR after it has been merged into master
 | 
						|
              ignore: master
 | 
						|
  weekly-build:
 | 
						|
    jobs:
 | 
						|
      - build
 | 
						|
    triggers:
 | 
						|
      - schedule:
 | 
						|
          cron: "0 0 * * 0"
 | 
						|
          filters:
 | 
						|
            branches:
 | 
						|
              # Automatically re-build the contents of master once per week
 | 
						|
              only: master
 |