From 8f74bb7bba5952a63d90d2efa3b7bfe51107fc62 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 25 Aug 2021 09:14:00 +0800 Subject: [PATCH] chore: support simpleauth cd on GitHub action (#1954) * chore: support simpleauth cd on github action * chore: update * chore: update * chore: chrome dirver update * chore: restore simpleauth setting config * chore: update * chore: udpate --- .github/scripts/pkg-postversion.sh | 18 ++++ .github/scripts/pkg-version.sh | 22 +++++ .github/scripts/sdk-postversion.sh | 6 -- .github/scripts/sdk-version.sh | 9 -- .github/scripts/simpleauth-azdo-pipelines.sh | 26 ++++++ .github/scripts/update-simpleauth-ver.js | 75 ++++++++++++++++ .github/workflows/cd.yml | 83 +++++++++++++++--- .gitignore | 1 + lerna.json | 1 + packages/sdk/package.json | 4 +- packages/simpleauth/package-lock.json | 87 +++++++++++++++++++ packages/simpleauth/package.json | 16 ++++ .../Microsoft.TeamsFx.SimpleAuth.Tests.csproj | 2 +- .../appsettings.IntegrationTests.json | 2 +- 14 files changed, 321 insertions(+), 31 deletions(-) create mode 100755 .github/scripts/pkg-postversion.sh create mode 100755 .github/scripts/pkg-version.sh delete mode 100755 .github/scripts/sdk-postversion.sh delete mode 100755 .github/scripts/sdk-version.sh create mode 100755 .github/scripts/simpleauth-azdo-pipelines.sh create mode 100644 .github/scripts/update-simpleauth-ver.js create mode 100644 packages/simpleauth/package-lock.json create mode 100644 packages/simpleauth/package.json diff --git a/.github/scripts/pkg-postversion.sh b/.github/scripts/pkg-postversion.sh new file mode 100755 index 0000000000..750ef7bfdb --- /dev/null +++ b/.github/scripts/pkg-postversion.sh @@ -0,0 +1,18 @@ +#!/bin/bash +if [[ $1 == 'templates' ]]; then + if [[ $SkipSyncup == *"template"* ]]; then + echo "skip sync up templates version with sdk version" + elif [[ -z "$(git tag --points-at HEAD | grep templates)" && ! -z "$(git diff HEAD^ -- ../../templates/package.json|grep version)" ]] + then + echo "need to tag on templates cause templates has no tags but bump up version" + git tag "templates@$(node -p "require('../../templates/package.json').version")" + fi +elif [[ $1 == 'fx-core' ]]; then + if [[ $SkipSyncup == *"fx-core"* ]]; then + echo "skip sync up fx-core version with simpleauth version" + elif [[ -z "$(git tag --points-at HEAD | grep @microsoft/teamsfx-core)" && ! -z "$(git diff HEAD^ -- ../fx-core/package.json|grep version)" ]] + then + echo "need to tag on fx-core cause fx-core has no tags but bump up version" + git tag "@microsoft/teamsfx-core@$(node -p "require('../fx-core/package.json').version")" + fi +fi \ No newline at end of file diff --git a/.github/scripts/pkg-version.sh b/.github/scripts/pkg-version.sh new file mode 100755 index 0000000000..268688ee47 --- /dev/null +++ b/.github/scripts/pkg-version.sh @@ -0,0 +1,22 @@ +#!/bin/bash +if [ $1 == 'templates' ]; then + if [[ $SkipSyncup == *"template"* ]]; then + echo "skip sync up templates version with sdk version" + elif [[ -z "$(git diff -- ../../templates)" ]]; then + echo "need bump up templates version since templates don not bump up by self" + node ../../.github/scripts/sdk-sync-up-version.js yes; + else + echo "no need to bump up templates version" + node ../../.github/scripts/sdk-sync-up-version.js + fi + git add ../../templates +elif [ $1 == 'fx-core' ]; then + if [[ -z "$(git diff -- ../fx-core)" ]]; then + echo "need bump up fx-core version since fx-core don not bump up by self" + node ../../.github/scripts/update-simpleauth-ver.js yes; + else + echo "no need to bump up templates version" + node ../../.github/scripts/update-simpleauth-ver.js + fi + git add ../fx-core +fi \ No newline at end of file diff --git a/.github/scripts/sdk-postversion.sh b/.github/scripts/sdk-postversion.sh deleted file mode 100755 index 9d5112d7b0..0000000000 --- a/.github/scripts/sdk-postversion.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [[ -z "$(git tag --points-at HEAD | grep templates)" && ! -z "$(git diff HEAD^ -- ../../templates/package.json|grep version)" ]] -then - echo "need to tag on templates cause templates has no tags but bump up version" - git tag "templates@$(node -p "require('../../templates/package.json').version")" -fi \ No newline at end of file diff --git a/.github/scripts/sdk-version.sh b/.github/scripts/sdk-version.sh deleted file mode 100755 index b1b3c67936..0000000000 --- a/.github/scripts/sdk-version.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -if [ -z "$(git diff -- ../../templates)" ]; then -echo "need bump up templates version since templates don not bump up by self" -node ../../.github/scripts/sdk-sync-up-version.js yes; -else -echo "no need to bump up templates version" -node ../../.github/scripts/sdk-sync-up-version.js -fi -git add ../../templates \ No newline at end of file diff --git a/.github/scripts/simpleauth-azdo-pipelines.sh b/.github/scripts/simpleauth-azdo-pipelines.sh new file mode 100755 index 0000000000..188e918ba2 --- /dev/null +++ b/.github/scripts/simpleauth-azdo-pipelines.sh @@ -0,0 +1,26 @@ +#!/bin/bash +countNum=1 +restUrl="https://dev.azure.com/mseng/VSIoT/_apis/build/latest/$2?api-version=6.0-preview.1" +rsp=$(curl -u :$1 $restUrl | jq -r '.value| .[0]') +status=$(echo $rsp | jq -r '.state') +buildId=$(echo $rsp | jq -r '.id') +echo "===== build id is: " $buildId +echo "===== build pipeline status: " $status +while [[ $countNum -le 50 && "$status" != "completed" ]] +do + sleep 1m + rsp=$(curl -u :$1 $restUrl | jq -r '.value| .[0]') + status=$(echo $rsp | jq -r '.state') + echo "loop status" $status + countNum=$(( $countNum + 1 )) +done +if [[ "$status" != "completed" ]] +then +exit 1 +fi + +restUrl="https://dev.azure.com/mseng/VSIoT/_apis/build/builds/$buildId/artifacts?api-version=6.0" +asset_rsp=$(curl -u :$1 $restUrl) +echo "====== asset url response:" $asset_rsp +asset_id=$(echo $asset_rsp | jq '.value |.[] | .resource' |jq '.data' | tr -d -c 0-9) +echo "====== asset id is: " $asset_id \ No newline at end of file diff --git a/.github/scripts/update-simpleauth-ver.js b/.github/scripts/update-simpleauth-ver.js new file mode 100644 index 0000000000..a644f2d36a --- /dev/null +++ b/.github/scripts/update-simpleauth-ver.js @@ -0,0 +1,75 @@ +const fs = require("fs"); +const path = require("path") +const simpleauth = path.join(__dirname, "../../packages/simpleauth") +const xml2js = require(path.join(simpleauth, "node_modules/xml2js")) +const csprojFile = path.join(simpleauth, "src/TeamsFxSimpleAuth/Microsoft.TeamsFx.SimpleAuth.csproj"); +const simpleauthVer = require(path.join(simpleauth, "package.json")).version +console.log("===== simple auth version: ", simpleauthVer) +// update .csproj file +fs.readFile(csprojFile, "utf-8", (err, data) => { + if (err) { + throw err; + } + + // convert XML data to JSON object + xml2js.parseString(data, (err, result) => { + if (err) { + throw err; + } + + // replace `version` with new version + for(let prop of result['Project'].PropertyGroup) { + if(prop.Version) { + prop.Version[0] = simpleauthVer; + break; + } + } + // convert SJON objec to XML + const builder = new xml2js.Builder({trim: true, headless: true}); + const xml = builder.buildObject(result); + + // write updated XML string to a file + fs.writeFile(csprojFile, xml, (err) => { + if (err) { + throw err; + } + console.log(`Updated XML is written to a new file.`); + }); + + }); +}); + +const synup = process.env.SkipSyncup +if(synup && synup.includes("fx-core")) { + return; +} + +// update fx-core tempaltes version.txt file +const fxCorePath = path.join(__dirname, "../../packages/fx-core"); +const simpleauthVerTxt = path.join(fxCorePath, "./templates/plugins/resource/simpleauth/version.txt") +fs.writeFileSync(simpleauthVerTxt, simpleauthVer, "utf8") + +// only rc and stable release bump up version on main branch, rarely run. +let needBumpUp = process.argv[2] === "yes" ? true : false; +if (needBumpUp) { + let file = path.join(fxCorePath, "package.json"); + let pkg_ = fse.readJsonSync(file); + let ver = pkg_.version; + if (semver.prerelease(simpleauthVer)) { + ver = semver.inc(ver, "prerelease", "rc"); + } else { + ver = semver.inc(ver, "patch"); + } + + pkg_.version = ver; + fse.writeFileSync(file, JSON.stringify(pkg_, null, 4)); + + file = path.join(fxCorePath, "package-lock.json"); + if (file) { + pkg_ = fse.readJsonSync(file); + pkg_.version = ver; + fse.writeFileSync(file, JSON.stringify(pkg_, null, 4)) + } + + console.log("bump up fx-core version as ", ver); +} \ No newline at end of file diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index e530bb7693..5e6fe892c6 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -11,6 +11,10 @@ on: description: "release RC version just with lerna publish, skip run lerna version(yes or no)" required: false default: "no" + skip-sync-version-pkg: + description: "skip sync up target pkg version. input templates to skip sync up version with sdk; fx-core to skip sync up with simpleauth" + required: false + default: "" schedule: - cron: "0 8 * * *" @@ -55,20 +59,15 @@ jobs: with: node-version: 14 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.x + - name: Setup npm registry run: | echo "${{ secrets.NPMRC }}" > ~/.npmrc - - name: Download Simple Auth bits - uses: nick-invision/retry@v2 - with: - timeout_minutes: 10 - max_attempts: 10 - retry_on: error - shell: pwsh - command: | - ./.github/scripts/downloadSimpleAuth.ps1 - - name: Setup project run: | npm run setup @@ -87,17 +86,23 @@ jobs: if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.preid == 'rc' && github.ref == 'refs/heads/main' && github.event.inputs.skip-version-rc == 'no'}} run: | npx lerna version --conventional-commits --conventional-prerelease --preid=rc --no-changelog --ignore-scripts --yes - + env: + SkipSyncup: ${{ github.event.inputs.skip-sync-version-pkg }} + - name: version rc npm packages to npmjs.org on hotfix if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.preid == 'rc' && startsWith(github.ref, 'refs/heads/hotfix/') && github.event.inputs.skip-version-rc == 'no'}} run: | npx lerna version --conventional-commits --conventional-prerelease --preid=rc-hotfix --no-changelog --allow-branch ${GITHUB_REF#refs/*/} --ignore-scripts --yes + env: + SkipSyncup: ${{ github.event.inputs.skip-sync-version-pkg }} - name: version stable npm packages to npmjs.org if: ${{ github.event_name == 'workflow_dispatch' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/hotfix/')) && github.event.inputs.preid == 'stable' }} run: | npx lerna version --conventional-commits --conventional-graduate --no-changelog --allow-branch ${GITHUB_REF#refs/*/} --yes - + env: + SkipSyncup: ${{ github.event.inputs.skip-sync-version-pkg }} + - name: version change id: version-change run: | @@ -105,6 +110,8 @@ jobs: echo "::set-output name=TEMPLATE_VERSION::$(git tag --points-at HEAD | grep templates)" echo "::set-output name=EXTENSION_VERSION_NUM::$(git tag --points-at HEAD | grep ms-teams-vscode-extension@ | cut -d '@' -f2)" echo "::set-output name=EXTENSION_VERSION::$(git tag --points-at HEAD | grep ms-teams-vscode-extension@)" + echo "::set-output name=SIMPLEAUTH_VERSION::$(git tag --points-at HEAD | grep simpleauth)" + echo "::set-output name=SIMPLEAUTH_VERSION_NUM::$(git tag --points-at HEAD| grep simpleauth| cut -d '@' -f2)" if git tag --points-at HEAD | grep templates | grep rc; then git push -d origin $(git tag --points-at HEAD | grep templates | grep rc) @@ -179,6 +186,58 @@ jobs: - name: cleanup templates run: rm -rf ./*.zip && git clean -df + - name: trigger simpleauth azure build pipeline for stable release + if: ${{ contains(steps.version-change.outputs.CHANGED, 'simpleauth') && github.event_name == 'workflow_dispatch' && github.event.inputs.preid == 'stable' }} + uses: Azure/pipelines@v1 + with: + azure-devops-project-url: 'https://dev.azure.com/mseng/VSIoT' + azure-pipeline-name: 'Build Simple Auth Release Artifacts' + azure-devops-token: '${{ secrets.ADO_PAT }}' + + - name: check build status and download assets for stable release + if: ${{ contains(steps.version-change.outputs.CHANGED, 'simpleauth') && github.event_name == 'workflow_dispatch' && github.event.inputs.preid == 'stable' }} + run: | + output=$(./.github/scripts/simpleauth-azdo-pipelines.sh ${{ secrets.ADO_PAT }} 11303 >&1) + echo $output + asset_id=$(echo $output | rev |cut -d ' ' -f 1 | rev) + curl "https://dev.azure.com/mseng/_apis/resources/Containers/$asset_id/drop?itemPath=drop/Microsoft.TeamsFx.SimpleAuth_${{ steps.version-change.outputs.SIMPLEAUTH_VERSION_NUM }}.zip" -L -O -u :${{ secrets.ADO_PAT }} + if [ ! -f Microsoft.TeamsFx.*.zip ]; then exit 1; fi + + - name: build SimpleAuth on prerelease + if: ${{ contains(steps.version-change.outputs.CHANGED, 'simpleauth') && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && github.event.inputs.preid != 'stable') }} + run: | + dotnet build --configuration Release + zip -r -j ../../Microsoft.TeamsFx.SimpleAuth_${{ steps.version-change.outputs.SIMPLEAUTH_VERSION_NUM }}.zip src/TeamsFxSimpleAuth/bin/Release/* + working-directory: ./packages/simpleauth + + - name: download simpleauth to fx-core + uses: nick-invision/retry@v2 + with: + timeout_minutes: 10 + max_attempts: 10 + retry_on: error + command: | + if [ -f Microsoft.TeamsFx.SimpleAuth_*.zip ]; then + cp Microsoft.TeamsFx.SimpleAuth_*.zip packages/fx-core/templates/plugins/resource/simpleauth/SimpleAuth.zip + else + ./.github/scripts/downloadSimpleAuth.ps1 + fi + - name: publish alpha simpleauth to github release page + if: ${{ contains(steps.version-change.outputs.CHANGED, 'simpleauth') && github.ref == 'refs/heads/dev' }} + uses: ncipollo/release-action@v1.7.3 + with: + token: ${{ secrets.CD_PAT }} + tag: 'simpleauth-${{steps.version-change.outputs.SIMPLEAUTH_VERSION_NUM}}' + artifacts: Microsoft.TeamsFx.SimpleAuth_*.zip + + - name: publish simpleauth to github release page + if: ${{ contains(steps.version-change.outputs.CHANGED, 'simpleauth') && github.ref == 'refs/heads/main'}} + uses: ncipollo/release-action@v1.7.3 + with: + token: ${{ secrets.CD_PAT }} + tag: ${{ steps.version-change.outputs.SIMPLEAUTH_VERSION }} + artifacts: Microsoft.TeamsFx.SimpleAuth_*.zip + - name: publish alpha release to npm org if: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/dev' && github.event.inputs.preid == 'alpha')}} run: | diff --git a/.gitignore b/.gitignore index e394e1ed14..caef508868 100644 --- a/.gitignore +++ b/.gitignore @@ -368,6 +368,7 @@ test-results.* # simple auth SimpleAuth.zip SimpleAuthUnzipOutput +Microsoft.TeamsFx.SimpleAuth_*.zip # so you can npm install inside a template and not worry about committing templates/*/*/package-lock.json diff --git a/lerna.json b/lerna.json index cfd1a4b99a..7c20b2a6aa 100644 --- a/lerna.json +++ b/lerna.json @@ -7,6 +7,7 @@ "packages/cli", "packages/vscode-extension", "packages/failpoint-ts", + "packages/simpleauth", "templates" ], "command": { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 6d60a2f138..9e39cfef5d 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -38,8 +38,8 @@ "test:unit": "npm run build:test && npm run unit-test:node && npm run unit-test:browser", "ui-test": "mocha --no-timeouts -r test/mocha.env.ts -r ts-node/register test/ui/**/*.spec.ts --exit", "precommit": "lint-staged", - "version": "../../.github/scripts/sdk-version.sh", - "postversion": "../../.github/scripts/sdk-postversion.sh" + "version": "../../.github/scripts/pkg-version.sh templates", + "postversion": "../../.github/scripts/pkg-postversion.sh templates" }, "files": [ "dist/", diff --git a/packages/simpleauth/package-lock.json b/packages/simpleauth/package-lock.json new file mode 100644 index 0000000000..0157e2dddb --- /dev/null +++ b/packages/simpleauth/package-lock.json @@ -0,0 +1,87 @@ +{ + "name": "simpleauth", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/packages/simpleauth/package.json b/packages/simpleauth/package.json new file mode 100644 index 0000000000..efdb077146 --- /dev/null +++ b/packages/simpleauth/package.json @@ -0,0 +1,16 @@ +{ + "name": "simpleauth", + "version": "0.1.0", + "description": "The Simple Auth is a backend service helping Teams tab app access first/third party services from client side.", + "scripts": { + "version": "../../.github/scripts/pkg-version.sh fx-core && git add .", + "postversion": "../../.github/scripts/pkg-postversion.sh fx-core && git add ." + }, + "private": "true", + "license": "MIT", + "devDependencies": { + "fs-extra": "^10.0.0", + "semver": "^7.3.5", + "xml2js": "^0.4.23" + } +} diff --git a/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/Microsoft.TeamsFx.SimpleAuth.Tests.csproj b/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/Microsoft.TeamsFx.SimpleAuth.Tests.csproj index 619d92e49a..bbe6ddc524 100644 --- a/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/Microsoft.TeamsFx.SimpleAuth.Tests.csproj +++ b/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/Microsoft.TeamsFx.SimpleAuth.Tests.csproj @@ -28,7 +28,7 @@ - + diff --git a/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/appsettings.IntegrationTests.json b/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/appsettings.IntegrationTests.json index 6536092a49..8a64d5c588 100644 --- a/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/appsettings.IntegrationTests.json +++ b/packages/simpleauth/src/TeamsFxSimpleAuth.Tests/appsettings.IntegrationTests.json @@ -25,4 +25,4 @@ "TestPassword2": "__TEST_PASSWORD_2__", "Scope": "access_as_user" } -} +} \ No newline at end of file