|
@@ -0,0 +1,275 @@
|
|
|
|
|
+name: Reusable build app workflow for production
|
|
|
|
|
+
|
|
|
|
|
+on:
|
|
|
|
|
+ workflow_call:
|
|
|
|
|
+ inputs:
|
|
|
|
|
+ node-version:
|
|
|
|
|
+ required: true
|
|
|
|
|
+ type: string
|
|
|
|
|
+ skip-cypress:
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ cypress-report-artifact-name:
|
|
|
|
|
+ type: string
|
|
|
|
|
+ secrets:
|
|
|
|
|
+ SLACK_WEBHOOK_URL:
|
|
|
|
|
+ required: true
|
|
|
|
|
+
|
|
|
|
|
+jobs:
|
|
|
|
|
+
|
|
|
|
|
+ build-prod:
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+
|
|
|
|
|
+ outputs:
|
|
|
|
|
+ PROD_FILES: ${{ steps.archive-prod-files.outputs.file }}
|
|
|
|
|
+
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/checkout@v2
|
|
|
|
|
+
|
|
|
|
|
+ - uses: actions/setup-node@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: ${{ inputs.node-version }}
|
|
|
|
|
+ cache: 'yarn'
|
|
|
|
|
+ cache-dependency-path: '**/yarn.lock'
|
|
|
|
|
+
|
|
|
|
|
+ - name: Cache/Restore node_modules
|
|
|
|
|
+ id: cache-dependencies
|
|
|
|
|
+ uses: actions/cache@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ path: |
|
|
|
|
|
+ **/node_modules
|
|
|
|
|
+ key: node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
|
|
|
|
|
+ restore-keys: |
|
|
|
|
|
+ node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-
|
|
|
|
|
+
|
|
|
|
|
+ - name: lerna bootstrap
|
|
|
|
|
+ run: |
|
|
|
|
|
+ npx lerna bootstrap -- --frozen-lockfile
|
|
|
|
|
+
|
|
|
|
|
+ - name: Remove unnecessary packages
|
|
|
|
|
+ run: |
|
|
|
|
|
+ rm -rf packages/slackbot-proxy
|
|
|
|
|
+
|
|
|
|
|
+ - name: Build
|
|
|
|
|
+ run: |
|
|
|
|
|
+ yarn lerna run build
|
|
|
|
|
+ env:
|
|
|
|
|
+ ANALYZE_BUNDLE_SIZE: 1
|
|
|
|
|
+
|
|
|
|
|
+ - name: Archive production files
|
|
|
|
|
+ id: archive-prod-files
|
|
|
|
|
+ run: |
|
|
|
|
|
+ tar -cf production.tar packages/**/dist packages/app/public
|
|
|
|
|
+ echo ::set-output name=file::production.tar
|
|
|
|
|
+
|
|
|
|
|
+ - name: Upload production files as artifact
|
|
|
|
|
+ uses: actions/upload-artifact@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ name: Production Files
|
|
|
|
|
+ path: ${{ steps.archive-prod-files.outputs.file }}
|
|
|
|
|
+
|
|
|
|
|
+ - name: Upload report as artifact
|
|
|
|
|
+ uses: actions/upload-artifact@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ name: Bundle Analyzing Report
|
|
|
|
|
+ path: packages/app/report/bundle-analyzer.html
|
|
|
|
|
+
|
|
|
|
|
+ - name: Slack Notification
|
|
|
|
|
+ uses: weseek/ghaction-slack-notification@master
|
|
|
|
|
+ if: failure()
|
|
|
|
|
+ with:
|
|
|
|
|
+ type: ${{ job.status }}
|
|
|
|
|
+ job_name: '*Node CI for growi - build-prod (${{ inputs.node-version }})*'
|
|
|
|
|
+ channel: '#ci'
|
|
|
|
|
+ isCompactMode: true
|
|
|
|
|
+ url: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ launch-prod:
|
|
|
|
|
+ needs: [build-prod]
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+
|
|
|
|
|
+ services:
|
|
|
|
|
+ mongodb:
|
|
|
|
|
+ image: mongo:4.4
|
|
|
|
|
+ ports:
|
|
|
|
|
+ - 27017/tcp
|
|
|
|
|
+ mongodb36:
|
|
|
|
|
+ image: mongo:3.6
|
|
|
|
|
+ ports:
|
|
|
|
|
+ - 27017/tcp
|
|
|
|
|
+
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/checkout@v2
|
|
|
|
|
+
|
|
|
|
|
+ - uses: actions/setup-node@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: ${{ inputs.node-version }}
|
|
|
|
|
+ cache: 'yarn'
|
|
|
|
|
+ cache-dependency-path: '**/yarn.lock'
|
|
|
|
|
+
|
|
|
|
|
+ - name: Get Date
|
|
|
|
|
+ id: get-date
|
|
|
|
|
+ run: |
|
|
|
|
|
+ echo "::set-output name=dateYmdHM::$(/bin/date -u "+%Y%m%d%H%M")"
|
|
|
|
|
+ echo "::set-output name=dateYm::$(/bin/date -u "+%Y%m")"
|
|
|
|
|
+
|
|
|
|
|
+ - name: Cache/Restore node_modules (not reused)
|
|
|
|
|
+ id: cache-dependencies
|
|
|
|
|
+ uses: actions/cache@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ path: |
|
|
|
|
|
+ **/node_modules
|
|
|
|
|
+ key: node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ steps.get-date.outputs.dateYmdHM }}
|
|
|
|
|
+ restore-keys: |
|
|
|
|
|
+ node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
|
|
|
|
|
+ node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-
|
|
|
|
|
+ node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ steps.get-date.outputs.dateYm }}
|
|
|
|
|
+ node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
|
|
|
|
|
+
|
|
|
|
|
+ - name: Remove unnecessary packages
|
|
|
|
|
+ run: |
|
|
|
|
|
+ rm -rf packages/slackbot-proxy
|
|
|
|
|
+
|
|
|
|
|
+ - name: lerna bootstrap --production
|
|
|
|
|
+ run: |
|
|
|
|
|
+ npx lerna bootstrap -- --production
|
|
|
|
|
+
|
|
|
|
|
+ - name: Download production files artifact
|
|
|
|
|
+ uses: actions/download-artifact@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ name: Production Files
|
|
|
|
|
+
|
|
|
|
|
+ - name: Extract procution files artifact
|
|
|
|
|
+ run: |
|
|
|
|
|
+ tar -xf ${{ needs.build-prod.outputs.PROD_FILES }}
|
|
|
|
|
+
|
|
|
|
|
+ - name: yarn server:ci
|
|
|
|
|
+ working-directory: ./packages/app
|
|
|
|
|
+ run: |
|
|
|
|
|
+ cp config/ci/.env.local.for-ci .env.production.local
|
|
|
|
|
+ yarn server:ci
|
|
|
|
|
+ env:
|
|
|
|
|
+ MONGO_URI: mongodb://localhost:${{ job.services.mongodb.ports['27017'] }}/growi
|
|
|
|
|
+ - name: yarn server:ci with MongoDB 3.6
|
|
|
|
|
+ working-directory: ./packages/app
|
|
|
|
|
+ run: |
|
|
|
|
|
+ cp config/ci/.env.local.for-ci .env.production.local
|
|
|
|
|
+ yarn server:ci
|
|
|
|
|
+ env:
|
|
|
|
|
+ MONGO_URI: mongodb://localhost:${{ job.services.mongodb36.ports['27017'] }}/growi
|
|
|
|
|
+
|
|
|
|
|
+ - name: Slack Notification
|
|
|
|
|
+ uses: weseek/ghaction-slack-notification@master
|
|
|
|
|
+ if: failure()
|
|
|
|
|
+ with:
|
|
|
|
|
+ type: ${{ job.status }}
|
|
|
|
|
+ job_name: '*Node CI for growi - build-prod (${{ inputs.node-version }})*'
|
|
|
|
|
+ channel: '#ci'
|
|
|
|
|
+ isCompactMode: true
|
|
|
|
|
+ url: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ run-cypress:
|
|
|
|
|
+ needs: [build-prod]
|
|
|
|
|
+
|
|
|
|
|
+ if: ${{ !inputs.skip-cypress }}
|
|
|
|
|
+
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+ container: cypress/base:14.18.1
|
|
|
|
|
+
|
|
|
|
|
+ strategy:
|
|
|
|
|
+ fail-fast: false
|
|
|
|
|
+ matrix:
|
|
|
|
|
+ # List string expressions that is comma separated ids of tests in "test/cypress/integration"
|
|
|
|
|
+ spec-group: ['1', '2']
|
|
|
|
|
+
|
|
|
|
|
+ services:
|
|
|
|
|
+ mongodb:
|
|
|
|
|
+ image: mongo:4.4
|
|
|
|
|
+ ports:
|
|
|
|
|
+ - 27017/tcp
|
|
|
|
|
+
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/checkout@v2
|
|
|
|
|
+
|
|
|
|
|
+ - uses: actions/setup-node@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: ${{ inputs.node-version }}
|
|
|
|
|
+ cache: 'yarn'
|
|
|
|
|
+ cache-dependency-path: '**/yarn.lock'
|
|
|
|
|
+
|
|
|
|
|
+ # workaround by https://github.com/cypress-io/github-action/issues/407
|
|
|
|
|
+ - name: Setup yarn cache settings
|
|
|
|
|
+ run: yarn config set cache-folder ~/.cache/yarn
|
|
|
|
|
+
|
|
|
|
|
+ - name: Cache/Restore node_modules
|
|
|
|
|
+ uses: actions/cache@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ path: |
|
|
|
|
|
+ **/node_modules
|
|
|
|
|
+ ~/.cache/Cypress
|
|
|
|
|
+ key: node_modules-and-cypress-bin-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
|
|
|
|
|
+ restore-keys: |
|
|
|
|
|
+ node_modules-and-cypress-bin-${{ runner.OS }}-node${{ inputs.node-version }}
|
|
|
|
|
+
|
|
|
|
|
+ - name: lerna bootstrap
|
|
|
|
|
+ run: |
|
|
|
|
|
+ npx lerna bootstrap -- --frozen-lockfile
|
|
|
|
|
+
|
|
|
|
|
+ - name: Download production files artifact
|
|
|
|
|
+ uses: actions/download-artifact@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ name: Production Files
|
|
|
|
|
+
|
|
|
|
|
+ - name: Extract procution files artifact
|
|
|
|
|
+ run: |
|
|
|
|
|
+ tar -xf ${{ needs.build-prod.outputs.PROD_FILES }}
|
|
|
|
|
+
|
|
|
|
|
+ - name: Determine spec expression
|
|
|
|
|
+ id: determine-spec-exp
|
|
|
|
|
+ run: |
|
|
|
|
|
+ SPEC=`node bin/github-actions/generate-cypress-spec-arg.js --prefix="test/cypress/integration/" --suffix="-*/**" "${{ matrix.spec-group }}"`
|
|
|
|
|
+ echo "::set-output name=value::$SPEC"
|
|
|
|
|
+
|
|
|
|
|
+ - name: Copy dotenv file for ci
|
|
|
|
|
+ working-directory: ./packages/app
|
|
|
|
|
+ run: |
|
|
|
|
|
+ cat config/ci/.env.local.for-ci >> .env.production.local
|
|
|
|
|
+
|
|
|
|
|
+ - name: Copy dotenv file for automatic installation
|
|
|
|
|
+ if: ${{ matrix.spec-group != '1' }}
|
|
|
|
|
+ working-directory: ./packages/app
|
|
|
|
|
+ run: |
|
|
|
|
|
+ cat config/ci/.env.local.for-auto-install >> .env.production.local
|
|
|
|
|
+
|
|
|
|
|
+ - name: Cypress Run
|
|
|
|
|
+ uses: cypress-io/github-action@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ working-directory: ./packages/app
|
|
|
|
|
+ install: false
|
|
|
|
|
+ spec: '${{ steps.determine-spec-exp.outputs.value }}'
|
|
|
|
|
+ start: yarn server
|
|
|
|
|
+ wait-on: 'http://localhost:3000'
|
|
|
|
|
+ env:
|
|
|
|
|
+ MONGO_URI: mongodb://mongodb:27017/growi-vrt
|
|
|
|
|
+
|
|
|
|
|
+ - name: Upload results
|
|
|
|
|
+ if: always()
|
|
|
|
|
+ uses: actions/upload-artifact@v2
|
|
|
|
|
+ with:
|
|
|
|
|
+ name: ${{ inputs.cypress-report-artifact-name }}
|
|
|
|
|
+ path: |
|
|
|
|
|
+ packages/app/test/cypress/screenshots
|
|
|
|
|
+ packages/app/test/cypress/videos
|
|
|
|
|
+
|
|
|
|
|
+ - name: Slack Notification
|
|
|
|
|
+ uses: weseek/ghaction-slack-notification@master
|
|
|
|
|
+ if: failure()
|
|
|
|
|
+ with:
|
|
|
|
|
+ type: ${{ job.status }}
|
|
|
|
|
+ job_name: '*Node CI for growi - run-cypress (${{ inputs.node-version }})*'
|
|
|
|
|
+ channel: '#ci'
|
|
|
|
|
+ isCompactMode: true
|
|
|
|
|
+ url: ${{ secrets.SLACK_WEBHOOK_URL }}
|