From 56f5d655c6017f6e0aacb2145fc3f7cc5fc663b4 Mon Sep 17 00:00:00 2001 From: David Joy Date: Tue, 31 Aug 2021 12:07:59 -0400 Subject: [PATCH] fix: modernize build process, remove npm publish, use github actions (#472) * build: switch from travis to Github actions. Subsequent commits will clean up some of the 'npm-dist' code that we're no longer using. * build: remove npm distribution from repository Once upon a time, we published the components of the profile MFE to NPM because we believed we might want to embed them in frontend-app-learner-portal. We abandoned that idea about two years ago, but never cleaned up the experiment of publishing the MFE to npm. This commit does that. The prior commit on this branch disabled it by cutting over from travis to github actions - this commit just finishes the job. * fix: cleaning up a bad URL for order history. * docs: cleaning up a documentation URL in openedx.yml * fix: removing download of Roboto font None of our other MFEs do this; it was left over from an early design decision. It also doesn't appear to be having any effect, as I think this font is included via Paragon, if at all. It may also be that it's a secondary font choice after something else already available. Regardless, removing these two lines had no effect on the look and feel of the MFE, and reduces bundle size. * fix: using updated logo instead of pre-rebrand edX logo. This now uses the FAVICON_URL environment variable like all our other MFEs. --- .env.development | 2 +- .env.test | 2 +- .github/workflows/ci.yml | 32 ++++++++++++++++++++++++++++++++ .gitignore | 3 +-- .releaserc | 27 --------------------------- .travis.yml | 23 ----------------------- Makefile | 22 +++++++++++++--------- README.rst | 8 +------- commitlint.config.js | 3 --- openedx.yaml | 3 +-- package.json | 12 ------------ public/index.html | 4 +--- src/assets/favicon.ico | Bin 34894 -> 0 bytes src/index.jsx | 1 - 14 files changed, 51 insertions(+), 91 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .releaserc delete mode 100755 .travis.yml delete mode 100644 commitlint.config.js delete mode 100644 src/assets/favicon.ico diff --git a/.env.development b/.env.development index 39f4b1a..ace25a5 100644 --- a/.env.development +++ b/.env.development @@ -10,7 +10,7 @@ LMS_BASE_URL='http://localhost:18000' LOGIN_URL='http://localhost:18000/login' LOGOUT_URL='http://localhost:18000/logout' MARKETING_SITE_BASE_URL='http://localhost:18000' -ORDER_HISTORY_URL='localhost:1996/orders' +ORDER_HISTORY_URL='http://localhost:1996/orders' REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh' SEGMENT_KEY='' SITE_NAME=localhost diff --git a/.env.test b/.env.test index 2526f82..434fa51 100644 --- a/.env.test +++ b/.env.test @@ -8,7 +8,7 @@ LMS_BASE_URL='http://localhost:18000' LOGIN_URL='http://localhost:18000/login' LOGOUT_URL='http://localhost:18000/logout' MARKETING_SITE_BASE_URL='http://localhost:18000' -ORDER_HISTORY_URL='localhost:1996/orders' +ORDER_HISTORY_URL='http://localhost:1996/orders' REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh' SEGMENT_KEY=null SITE_NAME=localhost diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7baeb8d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +--- +name: ci +on: + push: + branches: + - master + pull_request: +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: + - 12 + npm-test: + - i18n_extract + - is-es5 + - lint + - test + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install -g npm@6 + - run: make requirements + - run: make test NPM_TESTS=build + - run: make test NPM_TESTS=${{ matrix.npm-test }} + - name: upload coverage + uses: codecov/codecov-action@v2 + with: + fail_ci_if_error: false diff --git a/.gitignore b/.gitignore index 61e9345..4e93143 100755 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ temp/babel-plugin-react-intl ### Emacs ### *~ -/.vscode /temp -/npm-dist +/.vscode /module.config.js diff --git a/.releaserc b/.releaserc deleted file mode 100644 index afb5f33..0000000 --- a/.releaserc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "branch": "master", - "tagFormat": "v${version}", - "verifyConditions": [ - "@semantic-release/npm", - { - "path": "@semantic-release/github", - "assets": { - "path": "npm-dist/*" - } - } - ], - "analyzeCommits": "@semantic-release/commit-analyzer", - "generateNotes": "@semantic-release/release-notes-generator", - "prepare": "@semantic-release/npm", - "publish": [ - "@semantic-release/npm", - { - "path": "@semantic-release/github", - "assets": { - "path": "npm-dist/*" - } - } - ], - "success": [], - "fail": [] -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100755 index 00c12bc..0000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -node_js: 12 -before_install: -- npm install -g npm@6 -install: -- npm ci -script: -- make validate-no-uncommitted-package-lock-changes -- npm run i18n_extract -- npm run lint -- npm run test -- npm run build -- npm run npm-build -- npm run is-es5 -after_success: -- npx semantic-release -- codecov -env: - global: - # GH_TOKEN - - secure: qvCsyn5Ioj+b/gvX95yaQ+Vha+r60pGxuKFm6HzVbnWJyKAbR1NN8+RpIo0HUD9S5RPEFjLae82bLa2g/syS+D1DU9qF8NYderjy58bjibgrPdC1YOhi2SEY5u6TW6/T88+w9DyfZ6MF883lJi/6uzs24bHE13RguARlO79OeGvHk6SecoJSWe9yq2IHA0wAScKrvS64+AcUWyTDUvkrxHEvupVJs6aJ6EsdPALODLJ7JnXX7Rh+68nyqbezh+ZnumxBPkdCzUNdtO9C0o7JjV6/P1xg9rNre/huWGx4SYndPaPEmoOpWEfyCZw1ub83LHC1HBnE7eRJku/CmiaiaLGSfeU2sCRteBLlSyI5fEOQ4Su2xLu2k+Yuczj4BlIbjr+xC+bNg+WbOF8vj7TL4/YCxOG/8V4nLfDcHFsZDsPoYZyBe9Z5HsS77S5ZrutQ3i/qR+4zfs4X/QfPXfW3MqI7+oGo+PVNPgxI24i2Kwq5+ZUjnmkVnuGC5ZOZMN8aYojEvqdF+u5VALL/YCmXsXysL6BUsqv4kiZJpQEVBG0WPbh0FJH8qiB8OjLGogxkoSrL4Yd++o4fnSAvW1UgARIlJ0iHVf5r/wVei1KCQiFS6mh0Pwq1lM0Vo2SlTCF5UylnV80Hv7XY6Sp9dYi/EaVG1dv4DyJOHnPti1JAM/U= - # NPM_TOKEN - - secure: S6spzx4jJGWqucSwjaSdPEaNWlwzA75FisK+NoLFDY6uU7KIi2dayHiFlSW1C1vl5xQkkosHXJAInSwcnQMCUomCEuD1FFzydXA1/Dn8NmPc35coKR4CX9yJiArRbjZZjboCulrTPUVWHWoPfA7JTnqCDgOnXspgRKy7emzFLXkdn8vuUQcyXmmT/vDfQQjgq/T+DdBbMiradMvlTzxmKydAVeHAZ03A1Z5O6ePnR6IsFv4LgJ/RfGn501jHeTww6HsxfQX27tWLo5AyQ00YjMl9oXfs57n5u+em/ph3Xoc8Pz6wjkMLJ+eYo+xkYjoZ3d+/f+WXPLMBUNz0LpIBs7LcBHhAc2z4N+dce42CTXur/v8ra0BZEnZQsvOakHvox6KisDDlipPqc0yF7MgThbd31fc8QjdVxdh5w7tLH4PJ7QpBUtZwPskDLABKjnrxkxH+BysHADvVaNOBcZMwIA9yHY3GqzpyQ2upcS07h5a+SHx07viuA7hEn14XCtYrM1AHwS0n2sNdinb0qWOCcGOXzl39FU3N6xNueKoH/eIXuqJ7oiUkKBiSP9zApTApPL6nrng0InZhGjzZHOMNePPdin/uIrxk/fp/wqneGTQemCGRkfHdPT0yuIP22bUv/OmDtgNEG9t9hbIZGYgQmG4FTeTQQ7lC5RjmLrn+uWI= diff --git a/Makefile b/Makefile index 3333213..49dc1b6 100755 --- a/Makefile +++ b/Makefile @@ -10,8 +10,19 @@ tx_url2 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transi # This directory must match .babelrc . transifex_temp = ./temp/babel-plugin-react-intl -requirements: - npm install +NPM_TESTS=build i18n_extract lint test is-es5 + +.PHONY: test +test: $(addprefix test.npm.,$(NPM_TESTS)) ## validate ci suite + +.PHONY: test.npm.* +test.npm.%: validate-no-uncommitted-package-lock-changes + test -d node_modules || $(MAKE) requirements + npm run $(*) + +.PHONY: requirements +requirements: ## install ci requirements + npm ci i18n.extract: # Pulling display strings from .jsx files into .json files... @@ -48,10 +59,3 @@ pull_translations: validate-no-uncommitted-package-lock-changes: # Checking for package-lock.json changes... git diff --exit-code package-lock.json - -npm-build: - rm -rf ./npm-dist - ./node_modules/.bin/fedx-scripts babel src/profile --out-dir npm-dist --source-maps --ignore **/*.test.jsx,**/*.test.js,**/setupTest.js --copy-files - @# --copy-files will bring in everything else that wasn't processed by babel. Remove what we don't want. - @find npm-dist -name '*.test.js*' -delete - @rm -rf ./npm-dist/__mocks__ diff --git a/README.rst b/README.rst index 541099e..e75a471 100755 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -|Build Status| |Codecov| |npm_version| |npm_downloads| |license| |semantic-release| +|Build Status| |Codecov| |license| frontend-app-profile ==================== @@ -53,11 +53,5 @@ edX /dev/null", "is-es5": "es-check es5 ./dist/*.js", "lint": "fedx-scripts eslint --ext .js --ext .jsx .", @@ -19,15 +17,6 @@ "start": "fedx-scripts webpack-dev-server --progress", "test": "fedx-scripts jest --coverage --passWithNoTests" }, - "files": [ - "/npm-dist" - ], - "husky": { - "hooks": { - "pre-commit": "npm run lint", - "commit-msg": "commitlint -e $GIT_PARAMS" - } - }, "bugs": { "url": "https://github.com/edx/frontend-app-profile/issues" }, @@ -80,7 +69,6 @@ "enzyme-adapter-react-16": "1.15.6", "es-check": "5.2.4", "glob": "7.1.7", - "husky": "7.0.2", "react-test-renderer": "16.14.0", "reactifex": "1.1.1", "redux-mock-store": "1.5.4" diff --git a/public/index.html b/public/index.html index ef65320..e54972e 100755 --- a/public/index.html +++ b/public/index.html @@ -4,9 +4,7 @@ Learner Profile | <%= process.env.SITE_NAME %> - - - +
diff --git a/src/assets/favicon.ico b/src/assets/favicon.ico deleted file mode 100644 index 13801059f168105d6fc9f9a4bf611aa0ed2b40a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34894 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 { ReactDOM.render(