name: Release run-name: Testing and Releasing DC on: push: branches: - main jobs: Build-production-and-ng-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 20 - name: Write .npmrc file run: | touch client/.npmrc echo '${{ secrets.NPMRC}}' > client/.npmrc - name: Install Chrome for Angular tests run: | apt-get update wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb apt install -y ./google-chrome*.deb; export CHROME_BIN=/usr/bin/google-chrome - name: Write cypress credentials run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json shell: bash env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - name: Install dependencies run: | cd client npm ci # Decrypt and Install sheet echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg npm i ./libraries/sheet-crypto.tgz # End - name: Check audit # Audit should fail and stop the CI if critical vulnerability found run: | npm audit --audit-level=critical --omit=dev cd ./sas npm audit --audit-level=critical --omit=dev cd ../client npm audit --audit-level=critical --omit=dev - name: Angular Tests run: | cd client npm run test:headless - name: Angular Production Build run: | cd client npm run postinstall npm run build Build-and-test-development: runs-on: ubuntu-latest needs: Build-production-and-ng-test steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 20 - name: Write .npmrc file run: | touch client/.npmrc echo '${{ secrets.NPMRC}}' > client/.npmrc - run: apt-get update - run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - run: apt install -y ./google-chrome*.deb; - run: export CHROME_BIN=/usr/bin/google-chrome - run: apt-get update -y - run: apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb - run: apt -y install jq - name: Write cypress credentials run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json shell: bash env: CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }} - name: Install dependencies run: | cd client npm ci # Decrypt and Install sheet echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg npm i ./libraries/sheet-crypto.tgz # End # Install pm2 and prepare SASJS server - run: npm i -g pm2 - run: curl -L https://github.com/sasjs/server/releases/latest/download/linux.zip > linux.zip - run: unzip linux.zip - run: touch .env - run: echo RUN_TIMES=js >> .env - run: echo NODE_PATH=node >> .env - run: echo CORS=enable >> .env - run: echo WHITELIST=http://localhost:4200 >> .env - run: cat .env - run: pm2 start api-linux --wait-ready - name: Deploy mocked services run: | cd ./sas/mocks/sasjs npm install -g @sasjs/cli npm install -g replace-in-files-cli sasjs cbd -t server-ci # sasjs request services/admin/makedata -t server-ci -d ./deploy/makeData4GL.json -c ./deploy/requestConfig.json -o ./output.json - name: Install ZIP run: | apt-get update apt-get install zip - name: Prepare and run frontend and cypress run: | cd ./client mv ./cypress.env.example.json ./cypress.env.json replace-in-files --regex='"username".*' --replacement='"username":"'${{ secrets.CYPRESS_USERNAME_SASJS }}'",' ./cypress.env.json replace-in-files --regex='"password".*' --replacement='"password":"'${{ secrets.CYPRESS_PWD_SASJS }}'" ' ./cypress.env.json cat ./cypress.env.json npm run postinstall # Prepare index.html to SASJS local replace-in-files --regex='serverUrl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./src/index.html replace-in-files --regex='appLoc=".*?"' --replacement='appLoc="/Public/app/devtest"' ./src/index.html replace-in-files --regex='serverType=".*?"' --replacement='serverType="SASJS"' ./src/index.html replace-in-files --regex='"hosturl".*' --replacement='hosturl:"http://localhost:4200",' ./cypress.config.ts cat ./cypress.config.ts # Start frontend and run cypress npm start & npx wait-on http://localhost:4200 && npx cypress run --browser chrome --spec "cypress/e2e/liveness.cy.ts,cypress/e2e/editor.cy.ts,cypress/e2e/excel.cy.ts,cypress/e2e/filtering.cy.ts,cypress/e2e/licensing.cy.ts" - name: Zip Cypress videos if: always() run: | zip -r cypress-videos ./client/cypress/videos - name: Add cypress videos artifacts if: always() uses: actions/upload-artifact@v3 with: name: cypress-videos.zip path: cypress-videos.zip release: runs-on: ubuntu-latest needs: [Build-production-and-ng-test, Build-and-test-development] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 20 - name: Write .npmrc file run: | echo "$NPMRC" > client/.npmrc echo "legacy-peer-deps=true" >> client/.npmrc shell: bash env: NPMRC: ${{ secrets.NPMRC}} - name: Install packages run: | apt-get update apt-get install zip -y # sasjs cli is used to compile & build the SAS services npm i -g @sasjs/cli # jq is used to parse the release JSON apt-get install jq -y # doxygen is used for the SASJS docs apt-get update apt-get install doxygen -y - name: Frontend Preliminary Build description: We want to prevent creating empty release if frontend fails run: | cd client npm ci # Decrypt and Install sheet echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg npm i ./libraries/sheet-crypto.tgz # End npm i webpack npm run build - name: Create Empty Release (assets are posted later) run: | npm i npm i -g semantic-release # We do a semantic-release DRY RUN to make the job fail if there are no changes to release GITEA_TOKEN=${{ secrets.RELEASE_TOKEN }} GITEA_URL=https://git.datacontroller.io semantic-release --dry-run | grep -q "There are no relevant changes, so no new version is released." && exit 1 GITEA_TOKEN=${{ secrets.RELEASE_TOKEN }} GITEA_URL=https://git.datacontroller.io semantic-release - name: Frontend Build description: Must be created AFTER the release as the version (git tag) is used in the interface run: | cd client npm run build - name: Build SAS9 EBI Release description: Compile SAS 9 services, remove tests & create deployment program run: | cd sas npm i sasjs c -t sas9 rm -rf sasjsbuild/tests sasjs b -t sas9 cp sasjsbuild/mysas9deploy.sas ./demostream_sas9.sas # # remove streamed component and rebuild SAS 9 services # rm -rf sasjsbuild/services/web9 rm sasjsbuild/services/clickme.sas sasjs b -t sas9 cp sasjsbuild/mysas9deploy.sas ./sas9.sas - name: Build SASjs Server Release description: Compile Base (SASjs) services, remove tests & create deployment JSON run: | cd sas cp sasjs/utils/favicon.ico ../client/dist/favicon.ico sasjs c -t server rm -rf sasjsbuild/tests sasjs b -t server cp sasjsbuild/server.json.zip ./sasjs_server.json.zip - name: Build Viya Release description: compile Viya Streaming Deploy (without tests) run: | cd sas sasjs c -t viya rm -rf sasjsbuild/tests sed -i -e 's/servertype="SASJS"/servertype="SASVIYA"/g' sasjsbuild/services/clickme.html sasjs b -t viya cp sasjsbuild/viya.sas ./demostream_viya.sas # compile Viya Full deploy (without web) rm -rf sasjsbuild/services/web rm sasjsbuild/services/clickme.html sasjs b -t viya cp sasjsbuild/viya.sas ./viya.sas cp sasjsbuild/viya.json ./viya.json - name: Zip Frontend (including viya.json for full viya deploy) run: | cd sas cp sasjsbuild/viya.json ../client/dist cd .. zip -r frontend.zip ./client/dist - name: Release Typedoc run: | cd client npm -g install cloudron-surfer npm run compodoc:build surfer put --token ${{ secrets.TSDOC_TOKEN }} --server webdoc.datacontroller.io documentation/* / - name: Release code.datacontroller.io run: | cd sas sasjs doc surfer put --token ${{ secrets.CODE_DATACONTROLLER_IO }} --server code.datacontroller.io sasjsbuild/sasdocs/* / - name: Upload assets to release run: | RELEASE_ID=`curl -k 'https://git.datacontroller.io/api/v1/repos/dc/dc/releases/latest?access_token=${{ secrets.RELEASE_TOKEN }}' | jq -r '.id'` RELEASE_BODY=`curl -k 'https://git.datacontroller.io/api/v1/repos/dc/dc/releases/latest?access_token=${{ secrets.RELEASE_TOKEN }}' | jq -r '.body'` # Update body curl --data '{"draft": false,"body":"'"$RELEASE_BODY\n\nFor installation instructions, please visit https://docs.datacontroller.io/"'"}' -X PATCH --header 'Content-Type: application/json' -k https://git.datacontroller.io/api/v1/repos/dc/dc/releases/$RELEASE_ID?access_token=${{ secrets.RELEASE_TOKEN }} # Upload assets URL="https://git.datacontroller.io/api/v1/repos/dc/dc/releases/$RELEASE_ID/assets?access_token=${{ secrets.RELEASE_TOKEN }}" curl -k $URL -F attachment=@frontend.zip curl -k $URL -F attachment=@sas/demostream_sas9.sas curl -k $URL -F attachment=@sas/demostream_viya.sas curl -k $URL -F attachment=@sas/sasjs_server.json.zip curl -k $URL -F attachment=@sas/sas9.sas curl -k $URL -F attachment=@sas/viya.sas curl -k $URL -F attachment=@sas/viya.json