Create update-config-files.yml reusable workflow, add reusable-configurations folder (#3)
* Add reusable workflow and shareable config files * Make workflow throw if specified reference file doesn't exist * Fix review points * Fix review points * Update eslint and prettier configs, change file extension * Fix review points, update yml and configuration files * Update set of rules for ESLint * Update set of rules for ESLint * Update set of rules for ESLint * Update set of rules for ESLint * Prepare update-config-files.yml for PR in the actions org * Fix check-dist.yml
This commit is contained in:
		
							parent
							
								
									a8533f184b
								
							
						
					
					
						commit
						ddc40c8708
					
				
							
								
								
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @ -45,7 +45,7 @@ jobs: | ||||
| 
 | ||||
|       - name: Compare the expected and actual dist directories | ||||
|         run: | | ||||
|           if [ "$(git diff --ignore-space-at-eol ${{inputs.folder-path}} | wc -l)" -gt "0" ]; then | ||||
|           if [ "$(git diff --ignore-space-at-eol ${{inputs.dist-path}} | wc -l)" -gt "0" ]; then | ||||
|             echo "Detected uncommitted changes after the build. See the status below:" | ||||
|             git diff | ||||
|             exit 1 | ||||
|  | ||||
							
								
								
									
										167
									
								
								.github/workflows/update-config-files.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								.github/workflows/update-config-files.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,167 @@ | ||||
| # This workflow helps to keep configuration files for such tools as ESLint and Prettier in your repo up to date with the reference configuration files from the actions/reusable-workflows repository. | ||||
| # Once the reference configuration files are changed in the https://github.com/actions/reusable-workflows/tree/main/reusable-configurations, the workflow will automatically create PR with updates in your repo. | ||||
| 
 | ||||
| name: Update configuration files | ||||
| 
 | ||||
| on: | ||||
|   workflow_call: | ||||
|     inputs: | ||||
|       base-pr-branch: | ||||
|         description: "Optional input to specify the branch where PR changes should be integrated." | ||||
|         required: false | ||||
|         type: string | ||||
|         default: "main" | ||||
|       head-pr-branch: | ||||
|         description: "Optional input to specify the branch where PR changes should be made." | ||||
|         required: false | ||||
|         type: string | ||||
|         default: "tool-config-auto-update" | ||||
|       target-folder: | ||||
|         description: "Optional input to set a relative path to a folder where updated configuration files should be placed." | ||||
|         required: false | ||||
|         type: string | ||||
|         default: "./" | ||||
|       reference-files: | ||||
|         description: "Optional input to specify which files should be used as references. Files can be supplied in comma-separated format, wildcards are supported." | ||||
|         required: false | ||||
|         type: string | ||||
|         default: "*" | ||||
| 
 | ||||
| jobs: | ||||
|   update-configuration-files: | ||||
|     runs-on: "ubuntu-latest" | ||||
|     steps: | ||||
|       - name: Checkout ${{github.repository}} repository | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           ref: "${{inputs.base-pr-branch}}" | ||||
|           path: "target" | ||||
| 
 | ||||
|       - name: Checkout actions/reusable-workflows repository | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           repository: "actions/reusable-workflows" | ||||
|           ref: "main" | ||||
|           path: "source" | ||||
| 
 | ||||
|       - name: Configure git service account | ||||
|         run: | | ||||
|           git config --global user.name 'github-actions[bot]' | ||||
|           git config --global user.email 'github-actions[bot]@users.noreply.github.com' | ||||
| 
 | ||||
|       - name: Update configuration files | ||||
|         working-directory: ./target | ||||
|         id: successful-update | ||||
|         run: | | ||||
|           if [ ! -d "${{inputs.target-folder}}" ]; then | ||||
|             echo "::error::Directory: '${{inputs.target-folder}}' supplied to the 'target-folder' input does not exist in the ${{github.repository}} repository on the branch: ${{inputs.base-pr-branch}}." | ||||
|             exit 1 | ||||
|           fi | ||||
| 
 | ||||
|           git checkout -b ${{inputs.head-pr-branch}} | ||||
| 
 | ||||
|           filePatterns="${{inputs.reference-files}}" | ||||
|           mapfile -td ',' arrOfFilePatterns < <(echo -n "${filePatterns//, /,}") | ||||
| 
 | ||||
|           for filePattern in "${arrOfFilePatterns[@]}"; do | ||||
|             if [ "$(find ${{github.workspace}}/source/reusable-configurations -name "$filePattern")" ]; then | ||||
|               rsync -a --include="$filePattern" --exclude="*" ${{github.workspace}}/source/reusable-configurations/ ${{github.workspace}}/target/${{inputs.target-folder}} | ||||
|             else | ||||
|               echo "::error::Files corresponding to the specified file pattern: '$filePattern' do not exist in the reference https://github.com/actions/reusable-workflows/tree/main/reusable-configurations folder." | ||||
|               exit 1 | ||||
|             fi | ||||
|           done | ||||
| 
 | ||||
|           git add . | ||||
| 
 | ||||
|           if [ "$(git diff --ignore-space-at-eol --staged ${{github.workspace}}/target/${{inputs.target-folder}} | wc -l)" -gt "0" ]; then | ||||
|             echo "Configuration files update is successful." | ||||
|             echo "STATUS=true" >> $GITHUB_OUTPUT | ||||
|           else | ||||
|             echo "::notice::Referenced configuration files are up to date with the files from https://github.com/actions/reusable-workflows/tree/main/reusable-configurations folder." | ||||
|             echo "STATUS=false" >> $GITHUB_OUTPUT | ||||
|           fi | ||||
| 
 | ||||
|       - name: Install Node.js | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 16 | ||||
| 
 | ||||
|       - name: Install dependencies | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         working-directory: ./target | ||||
|         continue-on-error: true | ||||
|         run: npm ci | ||||
| 
 | ||||
|       - name: Automatically apply the updated configuration files | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         working-directory: ./target | ||||
|         id: automatic-apply | ||||
|         continue-on-error: true | ||||
|         run: | | ||||
|           npm run format; npm run lint:fix | ||||
| 
 | ||||
|       - name: Create commit and push changes to ${{github.repository}} | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         working-directory: ./target | ||||
|         run: | | ||||
|           git add . | ||||
|           git commit -m "Update configuration files" | ||||
|           git push origin ${{inputs.head-pr-branch}} -f | ||||
| 
 | ||||
|       - name: Check PR existence | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         id: pr-existence | ||||
|         run: | | ||||
|           response=$(curl \ | ||||
|             --no-progress-meter \ | ||||
|             -H "Accept: application/vnd.github+json" \ | ||||
|             -H "Authorization: Bearer ${{github.token}}" \ | ||||
|             -H "X-GitHub-Api-Version: 2022-11-28" \ | ||||
|             https://api.github.com/repos/${{github.repository}}/pulls?head=${{github.repository_owner}}:${{inputs.head-pr-branch}}&base=${{inputs.base-pr-branch}}) | ||||
| 
 | ||||
|           if [ "$( echo "$response" | jq length)" != "0" ]; then | ||||
|             prNumber=$( echo "$response" | jq -r '.[0].number' ) | ||||
|             echo "STATUS=true" >> $GITHUB_OUTPUT | ||||
|             echo "PR_NUMBER=$prNumber" >> $GITHUB_OUTPUT | ||||
|             echo "Existed PR №$prNumber with configuration files update is found in the ${{github.repository}} repository." | ||||
|           else | ||||
|             echo "STATUS=false" >> $GITHUB_OUTPUT | ||||
|             echo "Existed PR with configuration files update is not found in the ${{github.repository}} repository." | ||||
|           fi | ||||
| 
 | ||||
|       - name: Create/update pull request | ||||
|         if: ${{ steps.successful-update.outputs.STATUS == 'true' }} | ||||
|         run: | | ||||
|           if [ "${{ steps.automatic-apply.outcome }}" == "success" ]; then | ||||
|             bodyText=$'In the scope of this PR, configuration files should be updated to match examples stored in the '"[reusable-workflows](https://github.com/actions/reusable-workflows/tree/main/reusable-configurations)"' repository. The updated configuration files are applied to the repository files automatically.' | ||||
|           else | ||||
|             bodyText=$'In the scope of this PR, configuration files should be updated to match examples stored in the '"[reusable-workflows](https://github.com/actions/reusable-workflows/tree/main/reusable-configurations)"' repository.\n>**Warning**\n> The updated configuration files can not be applied to the repository automatically. Please apply the updated configuration files to the repository manually.' | ||||
|           fi | ||||
| 
 | ||||
|           if [ "${{ steps.pr-existence.outputs.STATUS }}" == "true" ]; then | ||||
|             echo "::group::GitHub API response" | ||||
|               curl \ | ||||
|               --no-progress-meter \ | ||||
|               -X PATCH \ | ||||
|               -H "Accept: application/vnd.github+json" \ | ||||
|               -H "Authorization: Bearer ${{github.token}}" \ | ||||
|               -H "X-GitHub-Api-Version: 2022-11-28" \ | ||||
|               https://api.github.com/repos/${{github.repository}}/pulls/${{ steps.pr-existence.outputs.PR_NUMBER }} \ | ||||
|               -d '{"title":"'"Automatic update of configuration files from $(date +'%m/%d/%Y')"'","body":"'"$bodyText"'","state":"open","base":"${{inputs.base-pr-branch}}"}' | ||||
|               echo "::endgroup::" | ||||
|             echo "PR №${{ steps.pr-existence.outputs.PR_NUMBER }} in the ${{ github.repository }} repository is successfully updated." | ||||
|           else | ||||
|             echo "::group::GitHub API response" | ||||
|               curl \ | ||||
|               --no-progress-meter \ | ||||
|               -X POST \ | ||||
|               -H "Accept: application/vnd.github+json" \ | ||||
|               -H "Authorization: Bearer ${{github.token}}" \ | ||||
|               -H "X-GitHub-Api-Version: 2022-11-28" \ | ||||
|               https://api.github.com/repos/${{github.repository}}/pulls \ | ||||
|               -d '{"title":"'"Automatic update of configuration files from $(date +'%m/%d/%Y')"'","body":"'"$bodyText"'","head":"${{inputs.head-pr-branch}}","base":"${{inputs.base-pr-branch}}"}' | ||||
|             echo "::endgroup::" | ||||
|             echo "PR is successfully created in the ${{ github.repository }} repository" | ||||
|           fi | ||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @ -46,10 +46,22 @@ codeql-analysis-call: | ||||
| 
 | ||||
| This workflow helps to check the statuses of cached dependencies used in action with the help of the Licensed tool. | ||||
| 
 | ||||
| **Usage** | ||||
| ```yaml | ||||
| licensed-call: | ||||
|   uses: actions/reusable-workflows/.github/workflows/licensed.yml@main | ||||
| ``` | ||||
| 
 | ||||
| - [`update-config-files.yml`](./.github/workflows/update-config-files.yml) | ||||
| 
 | ||||
| This workflow helps to keep configuration files for such tools as ESLint and Prettier up to date with the reference configuration files from the [actions/reusable-workflows](https://github.com/actions/reusable-workflows) repository. | ||||
| Once the reference configuration files are changed in the [reference folder](https://github.com/actions/reusable-workflows/tree/main/reusable-configurations), the workflow will automatically create PR with updates in the repo where it's launched. | ||||
| 
 | ||||
| **Usage** | ||||
| ```yaml | ||||
| update-config-files-call: | ||||
|   uses: actions/reusable-workflows/.github/workflows/update-config-files.yml@main | ||||
| ``` | ||||
| ## Adjusting reusable workflows | ||||
| 
 | ||||
| If the default behaviour of a reusable workflow isn't what you need, you can adjust it using the workflow's inputs. | ||||
|  | ||||
							
								
								
									
										50
									
								
								reusable-configurations/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								reusable-configurations/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| // This is a reusable configuration file copied from https://github.com/actions/reusable-workflows/tree/main/reusable-configurations. Please don't make changes to this file as it's the subject of an automatic update.
 | ||||
| module.exports = { | ||||
|   extends: [ | ||||
|     'eslint:recommended', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|     'plugin:eslint-plugin-jest/recommended', | ||||
|     'eslint-config-prettier' | ||||
|   ], | ||||
|   parser: '@typescript-eslint/parser', | ||||
|   plugins: ['@typescript-eslint', 'eslint-plugin-jest'], | ||||
|   rules: { | ||||
|     '@typescript-eslint/no-require-imports': 'error', | ||||
|     '@typescript-eslint/no-non-null-assertion': 'off', | ||||
|     '@typescript-eslint/no-explicit-any': 'off', | ||||
|     '@typescript-eslint/no-empty-function': 'off', | ||||
|     '@typescript-eslint/ban-ts-comment': [ | ||||
|       'error', | ||||
|       { | ||||
|         'ts-ignore': 'allow-with-description' | ||||
|       } | ||||
|     ], | ||||
|     'no-console': 'error', | ||||
|     'yoda': 'error', | ||||
|     'prefer-const': [ | ||||
|       'error', | ||||
|       { | ||||
|         destructuring: 'all' | ||||
|       } | ||||
|     ], | ||||
|     'no-control-regex': 'off', | ||||
|     'no-constant-condition': ['error', {checkLoops: false}] | ||||
|   }, | ||||
|   overrides: [ | ||||
|     { | ||||
|       files: ['**/*{test,spec}.ts'], | ||||
|       rules: { | ||||
|         '@typescript-eslint/no-unused-vars': 'off', | ||||
|         'jest/no-standalone-expect': 'off', | ||||
|         'jest/no-conditional-expect': 'off', | ||||
|         'no-console': 'off', | ||||
| 
 | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   env: { | ||||
|     node: true, | ||||
|     es6: true, | ||||
|     'jest/globals': true | ||||
|   } | ||||
| }; | ||||
							
								
								
									
										11
									
								
								reusable-configurations/.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								reusable-configurations/.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| // This is a reusable configuration file copied from https://github.com/actions/reusable-workflows/tree/main/reusable-configurations. Please don't make changes to this file as it's the subject of an automatic update.
 | ||||
| module.exports = { | ||||
|   printWidth: 80, | ||||
|   tabWidth: 2, | ||||
|   useTabs: false, | ||||
|   semi: true, | ||||
|   singleQuote: true, | ||||
|   trailingComma: 'none', | ||||
|   bracketSpacing: false, | ||||
|   arrowParens: 'avoid' | ||||
| }; | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user