diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b457900bd..14a5d4089 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,12 +2,24 @@ ## PR Type What kind of change does this PR introduce? - + + + + + + + + + + + + + ## Other information diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 47de21204..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: CodeQL Analysis - -on: - push: - pull_request: - schedule: - - cron: '0 8 * * *' - -jobs: - analyze: - name: codeql-analysis - runs-on: windows-latest - strategy: - matrix: - configuration: [ Production ] - env: - SOLUTION_NAME: src\Notepads.sln - PROJECT_PATH: src\Notepads\Notepads.csproj - CONFIGURATION: ${{ matrix.configuration }} - steps: - - name: Checkout repository - id: checkout_repo - uses: actions/checkout@v2 - - # Due to the insufficient memory allocated by default, CodeQL sometimes requires more to be manually allocated - - name: Configure Pagefile - id: config_pagefile - uses: al-cheb/configure-pagefile-action@v1.2 - with: - minimum-size: 8GB - maximum-size: 32GB - disk-root: "D:" - - - name: Setup MSBuild - id: setup_msbuild - uses: microsoft/setup-msbuild@v1 - - - name: Restore application - id: restore_app - shell: pwsh - run: | - msbuild $env:SOLUTION_NAME ` - /t:Restore ` - /p:Configuration=$env:CONFIGURATION - - - name: Initialize CodeQL - id: init_codeql - uses: github/codeql-action/init@v1 - with: - queries: security-and-quality - - - name: Build application - id: build_app - shell: pwsh - run: | - msbuild $env:PROJECT_PATH ` - /p:Platform=$env:PLATFORM ` - /p:Configuration=$env:CONFIGURATION ` - /p:UapAppxPackageBuildMode=$env:APPX_PACKAGE_BUILD_MODE ` - /p:AppxBundle=$env:APPX_BUNDLE ` - /p:AppxPackageSigningEnabled=false ` - /p:AppxBundlePlatforms="$env:APPX_BUNDLE_PLATFORMS" - env: - PLATFORM: x64 - APPX_PACKAGE_BUILD_MODE: StoreUpload - APPX_BUNDLE: Always - APPX_BUNDLE_PLATFORMS: x64 - - - name: Perform CodeQL Analysis - id: analyze_codeql - uses: github/codeql-action/analyze@v1 - -# Built with ❤ by [Pipeline Foundation](https://pipeline.foundation) \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ecb7bee69..b0f34f198 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,38 +1,107 @@ name: Notepads CI/CD Pipeline -on: [push, pull_request, workflow_dispatch] +on: + push: + paths-ignore: + - '**.md' + - 'ScreenShots/**' + - '.whitesource' + - 'azure-pipelines.yml' + - '.github/**' + - '!.github/workflows/main.yml' + pull_request: + paths-ignore: + - '**.md' + - 'ScreenShots/**' + - '.whitesource' + - 'azure-pipelines.yml' + - '.github/**' + - '!.github/workflows/main.yml' + workflow_dispatch: + inputs: + type: + description: 'Type of event to trigger (type "release" to trigger release)' + required: false + default: 'test' + schedule: + - cron: '0 8 * * *' jobs: - ci: + setup: runs-on: windows-latest outputs: - new_version: ${{ steps.tag_generator.outputs.new_version }} - new_version_tag: ${{ steps.tag_generator.outputs.new_tag }} - is_push_to_master: ${{ steps.step_conditionals_handler.outputs.is_push_to_master }} - env: - SOLUTION_NAME: src\Notepads.sln - CONFIGURATION: Production - DEFAULT_DIR: ${{ github.workspace }} + matrix: ${{ steps.set_matrix.outputs.matrix }} steps: - - name: Steps' conditionals handler - id: step_conditionals_handler + - name: Setup strategy matrix + id: set_matrix shell: pwsh run: | - $IS_PUSH_TO_MASTER = 'false' - $IS_NOT_PR = 'true' - if ( ($env:GITHUB_EVENT_NAME -ceq 'push') -and ($env:GITHUB_REF -ceq 'refs/heads/master') ) { - $IS_PUSH_TO_MASTER = 'true' + $MATRIX = '{ + "include": [ + { + "configuration": "Debug", + "appxBundlePlatforms": "x86|x64", + "runCodeqlAnalysis": false, + "runSonarCloudScan": false, + "debug": true, + "release": false + },{ + "configuration": "Release", + "appxBundlePlatforms": "x86|x64|ARM64", + "runCodeqlAnalysis": false, + "runSonarCloudScan": false, + "debug": false, + "release": false + },{ + "configuration": "Production", + "appxBundlePlatforms": "x86|x64|ARM64", + "runCodeqlAnalysis": true, + "runSonarCloudScan": true, + "debug": false, + "release": false + } + ] + }' + $MATRIX_OBJ = $MATRIX | ConvertFrom-Json + if ( ($env:GITHUB_EVENT_NAME -ceq 'pull_request') -or ($env:GITHUB_EVENT_NAME -ceq 'schedule') ) { + $MATRIX_OBJ.include | Foreach-Object { $_.runSonarCloudScan = $false } } - if ( $env:GITHUB_EVENT_NAME -ceq 'pull_request' ) { - $IS_NOT_PR = 'false' + if ( !($env:GITHUB_EVENT_NAME -ceq 'push') -And !($env:GITHUB_EVENT_NAME -ceq 'pull_request') ) { + $MATRIX_OBJ.include = $MATRIX_OBJ.include | Where-Object { $_.configuration -ceq "$env:RELEASE_CONFIGURATION" } + if ( ($env:GITHUB_EVENT_NAME -ceq 'workflow_dispatch') -and ($env:EVENT_TYPE -ceq 'release') -and ($env:GITHUB_REF -ceq 'refs/heads/master') ) { + $MATRIX_OBJ.include | Foreach-Object { $_.runCodeqlAnalysis = $false } + $MATRIX_OBJ.include | Foreach-Object { if ( $_.configuration -eq "$env:RELEASE_CONFIGURATION" ) { $_.release = $true } } + } else { + $MATRIX_OBJ.include | Foreach-Object { $_.appxBundlePlatforms = 'x64' } + if ( !($env:GITHUB_EVENT_NAME -ceq 'schedule') ) { + $MATRIX_OBJ.include | Foreach-Object { $_.runCodeqlAnalysis = $false } + } + } } - echo "::set-output name=is_push_to_master::$(echo $IS_PUSH_TO_MASTER)" - echo "::set-output name=is_not_pr::$(echo $IS_NOT_PR)" + $MATRIX = $MATRIX_OBJ | ConvertTo-Json -depth 32 + echo "::set-output name=matrix::$($MATRIX -replace ' *\r*\n*', '')" env: + EVENT_TYPE: ${{ github.event.inputs.type }} GITHUB_EVENT_NAME: ${{ github.event_name }} GITHUB_REF: ${{ github.ref }} + RELEASE_CONFIGURATION: Production - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' + ci: + needs: setup + runs-on: windows-latest + strategy: + matrix: ${{ fromJson(needs.setup.outputs.matrix) }} + outputs: + changelog: ${{ steps.tag_generator.outputs.changelog }} + new_version: "${{ steps.tag_generator.outputs.new_version }}.0" + new_version_tag: "v${{ steps.tag_generator.outputs.new_version }}.0" + is_release: ${{ matrix.release }} + env: + SOLUTION_NAME: src\Notepads.sln + CONFIGURATION: ${{ matrix.configuration }} + DEFAULT_DIR: ${{ github.workspace }} + steps: + - if: matrix.runSonarCloudScan name: Set up JDK 11 id: Setup_JDK uses: actions/setup-java@v1 @@ -50,26 +119,57 @@ jobs: fetch-depth: 50 token: ${{ secrets.GITHUB_TOKEN }} - - if: steps.step_conditionals_handler.outputs.is_push_to_master == 'true' + # Due to the insufficient memory allocated by default, CodeQL sometimes requires more to be manually allocated + - if: matrix.runCodeqlAnalysis + name: Configure Pagefile + id: config_pagefile + uses: al-cheb/configure-pagefile-action@v1.2 + with: + minimum-size: 8GB + maximum-size: 32GB + disk-root: "D:" + + - if: matrix.release + name: Check latest tag + id: check_latest_tag + shell: pwsh + run: | + $LATEST_TAG = git -c 'versionsort.suffix=-' ls-remote --exit-code --refs --sort='version:refname' --tags "https://github.com/$env:GIT_REPOSITORY.git" '*.*.*' | tail --lines=1 | cut --delimiter='/' --fields=3 + $LATEST_VERSION = [System.Version]::Parse($LATEST_TAG -replace 'v') + echo "::set-output name=semver::$(echo "$($LATEST_VERSION.Major).$($LATEST_VERSION.Minor).$($LATEST_VERSION.Build)")" + env: + GIT_REPOSITORY: ${{ github.repository }} + + - if: matrix.release && steps.check_latest_tag.outputs.semver != '' name: Bump GitHub tag id: tag_generator - uses: mathieudutour/github-tag-action@v5 + uses: soumyamahunt/github-tag-action@test-other-ver-support with: github_token: ${{ secrets.GITHUB_TOKEN }} - default_bump: false + latest_ver: ${{ steps.check_latest_tag.outputs.semver }} + default_bump: true + dry_run: true - - if: steps.step_conditionals_handler.outputs.is_push_to_master == 'true' && steps.tag_generator.outputs.new_version != '' - name: Update Package.appxmanifest version - id: update_appxmanifest + - if: matrix.release && steps.tag_generator.outputs.new_version != '' + name: Update tag and manifest + id: update + shell: pwsh run: | - $APPXMANIFEST_PATH = 'src/Notepads/Package.appxmanifest' + git config --global user.name $env:GIT_USER_NAME + git config --global user.email $env:GIT_USER_EMAIL + git tag -a -m "$env:NEW_VERSION_TAG" $env:NEW_VERSION_TAG + git push --follow-tags $xml = [xml](Get-Content $APPXMANIFEST_PATH) - $xml.Package.Identity.SetAttribute('Version', "$env:NEW_VERSION.0") + $xml.Package.Identity.SetAttribute('Version', "$env:NEW_VERSION") $xml.save($APPXMANIFEST_PATH) env: - NEW_VERSION: ${{ steps.tag_generator.outputs.new_version }} + GIT_USER_NAME: ${{ secrets.GIT_USER_NAME }} + GIT_USER_EMAIL: ${{ secrets.GIT_USER_EMAIL }} + APPXMANIFEST_PATH: src\Notepads\Package.appxmanifest + NEW_VERSION: "${{ steps.tag_generator.outputs.new_version }}.0" + NEW_VERSION_TAG: "v${{ steps.get_assembly_version.outputs.version_tag }}.0" - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' + - if: matrix.runSonarCloudScan name: Cache SonarCloud packages id: cache_sonar_packages uses: actions/cache@v2 @@ -78,7 +178,7 @@ jobs: key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' + - if: matrix.runSonarCloudScan name: Cache SonarCloud scanner id: cache_sonar_scanner uses: actions/cache@v2 @@ -87,7 +187,7 @@ jobs: key: ${{ runner.os }}-sonar-scanner restore-keys: ${{ runner.os }}-sonar-scanner - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' && steps.cache_sonar_scanner.outputs.cache-hit != 'true' + - if: matrix.runSonarCloudScan && steps.cache_sonar_scanner.outputs.cache-hit != 'true' name: Install SonarCloud scanner id: install_sonar_scanner shell: pwsh @@ -95,7 +195,7 @@ jobs: New-Item -Path .\.sonar\scanner -ItemType Directory dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' + - if: matrix.runSonarCloudScan name: Initialize SonarCloud scanner id: init_sonar_scanner shell: pwsh @@ -109,15 +209,14 @@ jobs: env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - if: steps.step_conditionals_handler.outputs.is_push_to_master == 'true' + - if: matrix.release && steps.tag_generator.outputs.new_version != '' name: Create PFX certificate for AppxBundle id: create_pfx_cert shell: pwsh run: | - $BASE64_STR = $env:BASE64_STR $TARGET_FILE = "$env:DEFAULT_DIR\cert.pfx" - $FROM_BASE64_STR = [Convert]::FromBase64String($BASE64_STR) - [IO.File]::WriteAllBytes($TARGET_FILE, $FROM_BASE64_STR) + $FROM_BASE64_STR = [System.Convert]::FromBase64String("$env:BASE64_STR") + [System.IO.File]::WriteAllBytes($TARGET_FILE, $FROM_BASE64_STR) env: BASE64_STR: ${{ secrets.PACKAGE_CERTIFICATE_BASE64 }} @@ -125,9 +224,14 @@ jobs: id: restore_application shell: pwsh run: | - msbuild $env:SOLUTION_NAME ` - /t:Restore ` - /p:Configuration=$env:CONFIGURATION + msbuild $env:SOLUTION_NAME /t:Restore + + - if: matrix.runCodeqlAnalysis + name: Initialize CodeQL + id: init_codeql + uses: github/codeql-action/init@v1 + with: + queries: security-and-quality - name: Build and generate bundles id: build_app @@ -148,14 +252,36 @@ jobs: PLATFORM: x64 UAP_APPX_PACKAGE_BUILD_MODE: StoreUpload APPX_BUNDLE: Always - APPX_PACKAGE_SIGNING_ENABLED: ${{ steps.step_conditionals_handler.outputs.is_push_to_master }} - APPX_BUNDLE_PLATFORMS: x86|x64|ARM64 + APPX_PACKAGE_SIGNING_ENABLED: ${{ matrix.release }} + APPX_BUNDLE_PLATFORMS: ${{ matrix.appxBundlePlatforms }} ARTIFACTS_DIR: ${{ github.workspace }}\Artifacts PACKAGE_CERTIFICATE_KEYFILE: ${{ github.workspace }}\cert.pfx PACKAGE_CERTIFICATE_PASSWORD: ${{ secrets.PACKAGE_CERTIFICATE_PWD }} APP_CENTER_SECRET: ${{ secrets.APP_CENTER_SECRET }} - - if: steps.step_conditionals_handler.outputs.is_not_pr == 'true' + - if: matrix.debug && !contains( matrix.appxBundlePlatforms, 'arm64' ) + name: Test ARM build in debug configuration + id: build_app_arm_debug + shell: pwsh + run: | + msbuild $env:SOLUTION_NAME ` + /p:Platform=$env:PLATFORM ` + /p:Configuration=$env:CONFIGURATION ` + /p:UapAppxPackageBuildMode=$env:UAP_APPX_PACKAGE_BUILD_MODE ` + /p:AppxBundle=$env:APPX_BUNDLE ` + /p:AppxBundlePlatforms=$env:APPX_BUNDLE_PLATFORMS + env: + PLATFORM: ARM64 + UAP_APPX_PACKAGE_BUILD_MODE: StoreUpload + APPX_BUNDLE: Always + APPX_BUNDLE_PLATFORMS: ARM64 + + - if: matrix.runCodeqlAnalysis + name: Perform CodeQL Analysis + id: analyze_codeql + uses: github/codeql-action/analyze@v1 + + - if: matrix.runSonarCloudScan name: Send SonarCloud results id: send_sonar_results shell: pwsh @@ -166,7 +292,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.SONAR_GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - if: steps.step_conditionals_handler.outputs.is_push_to_master == 'true' + - if: matrix.release && steps.tag_generator.outputs.new_version != '' name: Upload build artifacts id: upload_artifacts uses: actions/upload-artifact@v1 @@ -176,12 +302,12 @@ jobs: cd: # "This job will execute when the workflow is triggered on a 'push event', the target branch is 'master' and the commit is intended to be a release." - if: needs.ci.outputs.is_push_to_master == 'true' && needs.ci.outputs.new_version != '' - needs: ci + if: needs.ci.outputs.is_release == 'true' && needs.ci.outputs.new_version != '' + needs: [ setup, ci ] runs-on: windows-latest env: - NEW_ASSEMBLY_VERSION: "${{ needs.ci.outputs.new_version }}.0" - NEW_TAG: ${{ needs.ci.outputs.new_version_tag }} + NEW_VERSION: ${{ needs.ci.outputs.new_version }} + NEW_VERSION_TAG: ${{ needs.ci.outputs.new_version_tag }} steps: - name: Checkout repository id: checkout_repo @@ -198,8 +324,9 @@ jobs: id: create_release uses: actions/create-release@v1 with: - tag_name: ${{ env.NEW_TAG }} - release_name: Notepads ${{ env.NEW_TAG }} + tag_name: ${{ env.NEW_VERSION_TAG }} + release_name: Notepads ${{ env.NEW_VERSION_TAG }} + body: ${{ needs.ci.outputs.changelog }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -208,8 +335,8 @@ jobs: uses: actions/upload-release-asset@v1 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: Artifacts/Notepads_${{ env.NEW_ASSEMBLY_VERSION }}_Production_Test/Notepads_${{ env.NEW_ASSEMBLY_VERSION }}_x86_x64_ARM64_Production.msixbundle - asset_name: Notepads_${{ env.NEW_ASSEMBLY_VERSION }}_x86_x64_ARM64.msixbundle + asset_path: Artifacts/Notepads_${{ env.NEW_VERSION }}_Production_Test/Notepads_${{ env.NEW_VERSION }}_x86_x64_ARM64_Production.msixbundle + asset_name: Notepads_${{ env.NEW_VERSION }}_x86_x64_ARM64.msixbundle asset_content_type: application/zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CI-CD_DOCUMENTATION.md b/CI-CD_DOCUMENTATION.md index ff45df259..13103e14a 100644 --- a/CI-CD_DOCUMENTATION.md +++ b/CI-CD_DOCUMENTATION.md @@ -55,6 +55,7 @@ - The Quality Gate will become active as soon as the next SonarCloud scan completes successfully
+ ## 2. Run workflow manually @@ -66,9 +67,11 @@ Once you've set up all the steps above correctly, you should be able to successf 3. On the right, next to the "This workflow has a workflow_dispatch event trigger" label, click on the "Run workflow" dropdown, make sure the default branch is selected (if not manually changed, should be main or master) in the "Use workflow from" dropdown and click the "Run workflow" button +4. You can optionally fill the argument textbox with "release" to trigger [GitHub Release](#github_release) and [Store Upload](#store_upload) + ![Actions_workflow_dispatch](ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png) -4. Once the workflow run has completed successfully, move on to the next step of the documentation +5. Once the workflow run has completed successfully, move on to the next step of the documentation NOTE: **screenshots are only exemplary** @@ -200,12 +203,13 @@ To add more descriptions, follow these steps: ![CSA_custom_2](ScreenShots/CI-CD_DOCUMENTATION/CSA_custom_2.png)
+ -## 5. Automated versioning +## 5. Automated GitHub release -Automatically bumps up the GitHub tag in the repo and executes the CD job +When triggered bumps up the GitHub tag in the repo and executes the CD job and produces release with changelogs -Note: **not every commit to your master branch creates a release** +Note: **not every commit to your master branch are included in changelog** #### Setup @@ -237,7 +241,23 @@ NOTE: #### Execution -Follow these instructions for any commit (push or PR merge) to your master branch, you would like to execute the automated versioning. +[Once you've set up all the steps for manual execution of the "Notepads CI/CD Pipeline" workflow correctly](#workflow_dispatch), you should be able to successfully trigger release with the same workflow. + +1. Go to the project's GitHub repository and click on the **Actions** tab + +2. From the "Workflows" list on the left, click on "Notepads CI/CD Pipeline" + +3. On the right, next to the "This workflow has a workflow_dispatch event trigger" label, click on the "Run workflow" dropdown, make sure the default branch is selected (if not manually changed, should be main or master) in the "Use workflow from" dropdown, type "release" in the argument textbox (By default "test" is typed) and click the "Run workflow" button + +![Actions_workflow_dispatch](ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png) + +4. The workflow will produce release assets and calculate version, generate changelogs from valid commits since previous tag. + +NOTE: **screenshots are only exemplary** + +
+ +#### - follow these instructions for any commit (push or PR merge) to your master branch, you would like to see in changelog and count towards version change. You would need one of three keywords at the start of your commit title. Each of the three keywords corresponds to a number in your release version i.e. v1.2.3. The release versioning uses the ["Conventional Commits" specification](https://www.conventionalcommits.org/en/v1.0.0/): @@ -255,6 +275,9 @@ Example(fix/PATCH):

`git push origin master`
+
+On triggering `Release`: +
Result: v1.2.3 -> **v1.2.4**

@@ -264,6 +287,9 @@ Example(feat/MINOR):

`git push origin master`
+
+On triggering `Release`: +
Result: v1.2.3 -> **v1.3.0**

@@ -276,12 +302,16 @@ Example(perf/MAJOR):

`git push origin master`
+
+On triggering `Release`: +
Result: v1.2.3 -> **v2.0.0**

Note: in the MAJOR release example, the PowerShell multiline syntax ` (backtick) is used. After writing a backtick, a press of the Enter key should open a new line.
+ ## 6. Setup automated publishing to the Windows Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f5e5553ad..0ab942f2b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,16 +4,17 @@ You can contribute to Notepads project by: - Report issues and bugs [here](https://github.com/JasonStein/Notepads/issues) - Submit feature requests [here](https://github.com/JasonStein/Notepads/issues) - Create a pull request to help me (Let me know before you do so): - * Fix an existing bug. - * Implement new features. - * Cleanup code and code refactoring. - * Fix grammar errors or improve my documentations. + * Fix an existing bug, prefix title with `fix: `. + * Implement new features, prefix title with `feat: `. + * Fix grammar errors or improve my documentations, prefix title with `doc: `. + * Improve CI/CD pipeline, prefix title with `ci: `. + * Cleanup code and code refactoring or anything else you want to change in the project not listed above, prefix title with `other: ` or assign a custom prefix with the same format (`label: `). - Internationalization and localization: * My only inputs for the work here is to recommend you guys to use existing phrases that you found in win32 notepad.exe or vs code or notepad++ as much as possible. It makes your translations more consistent and easier to understand by end users. - * Since Notepads is still in early beta. I might change texts and add texts now and then for the upcoming months. Whenever that happens, I will notify you in [Notepads Discord Server](https://discord.gg/VqetCub) (Please join it if possible). If someday you lose the passion, feel free to let me know so I can assign your language to others. + * Since Notepads is still in early beta. I might change texts and add texts now and then for the upcoming months. Whenever that happens, I will notify you in [Notepads Discord Server](https://discord.gg/VqetCub) (Please join it if possible) and in [GitHub Discussions](https://github.com/JasonStein/Notepads/discussions/818) (Subscribe to notifications). If someday you lose the passion, feel free to let me know so I can assign your language to others. * OK, here are the steps you need to follow if you want to contribute: 1. Make sure you can build and run Notepads project on your machine so that you can test it after your work. - 2. Click [here](https://github.com/JasonStein/Notepads/issues/33) and provide your information. + 2. Click [here](https://github.com/JasonStein/Notepads/discussions/818) and provide your information. 3. Do your work and test it on your machine and check your work to make sure it is not breaking any existing layout. 4. Finish your work and create a PR (Example: https://github.com/JasonStein/Notepads/pull/30) 5. Let me know and I will merge it if it looks good to me. @@ -22,7 +23,7 @@ You can contribute to Notepads project by: * Make sure your machine is running on Windows 10 1903+. * Make sure you have Visual Studio 2019 16.2+ installed. * Make sure you have "Universal Windows Platform development" component installed for Visual Studio. -* Make sure you installed "Windows 10 SDK (10.0.17763.0 + 10.0.18362.0)" as well. +* Make sure you installed "Windows 10 SDK (10.0.17763.0 + 10.0.19041.0)" as well. * Open src/Notepads.sln with Visual Studio and set Solution Platform to x64(amd64). * Once opened, right click on the solution and click on "Restore NuGet Packages". * Now you should be able to build and run Notepads on your machine. If it fails, try close the solution and reopen it again. diff --git a/ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png b/ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png index 279e39e0c..ec63f319b 100644 Binary files a/ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png and b/ScreenShots/CI-CD_DOCUMENTATION/Actions_workflow_dispatch.png differ