diff --git a/.github/workflows/Build_and_Publish_Images.yaml b/.github/workflows/Build_and_Publish_Images.yaml index 3f1b563d5..13ce5a0b3 100644 --- a/.github/workflows/Build_and_Publish_Images.yaml +++ b/.github/workflows/Build_and_Publish_Images.yaml @@ -1,17 +1,22 @@ name: Build and Publish Docker Image on: - push: - tags: - - 'Seed-Test_v*' + release: + types: + - published + - edited jobs: - build-and-publish: + build-and-publish-release: runs-on: ubuntu-latest + if: startsWith(github.event.release.name, 'Seed-Test_v') steps: - name: Checkout Repository uses: actions/checkout@v2 + - name: Install Dependencies + run: npm install node-fetch + - name: Login to Docker Hub uses: docker/login-action@v2 with: @@ -50,4 +55,105 @@ jobs: - name: Push Docker Image to Docker Hub run: | docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-frontend:${{ steps.get_tag_name.outputs.version }} - docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-frontend:latest \ No newline at end of file + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-frontend:latest + + # SINGLE QUICK DEMO CONTAINER + - name: Build Docker Image as Latest + run: | + docker build -t seed-test-demo:${{ steps.get_tag_name.outputs.version }} . + + - name: Tag Docker Image as Latest + run: | + docker tag seed-test-demo:${{ steps.get_tag_name.outputs.version }} ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:${{ steps.get_tag_name.outputs.version }} + docker tag seed-test-demo:${{ steps.get_tag_name.outputs.version }} ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:latest + + - name: Push Docker Image to Docker Hub + run: | + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:${{ steps.get_tag_name.outputs.version }} + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:latest + + - name: Post susccess message + uses: ./actions/notifyTeams + with: + title: "Publish Release DockerHub ๐Ÿณ๐ŸŒ" + text: "Publishing Images for release ${{ github.event.release.name }} successfully." + style: "success" + webhook: ${{ secrets.MS_TEAMS_WEBHOOK_URI }} + + - name: Post error message + if: ${{ failure() }} + uses: ./actions/notifyTeams + with: + title: "Publish Release DockerHub ๐Ÿณ๐ŸŒโŒ" + text: "Publishing Images for release ${{ github.event.release.name }} failed." + style: "failure" + webhook: ${{ secrets.MS_TEAMS_WEBHOOK_URI }} + + build-and-publish-test: + runs-on: ubuntu-latest + if: startsWith(github.event.release.name, 'Test_v') + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Install Dependencies + run: npm install node-fetch + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Get Tag Name + id: get_tag_name + run: | + version=$(echo $GITHUB_REF | sed 's/refs\/tags\///') + echo "version=${version}" >> ${GITHUB_OUTPUT} + + # BACKEND + - name: Build Docker Image + run: | + docker build -t seed-test-backend:${{ steps.get_tag_name.outputs.version }} ./backend + docker tag seed-test-backend:${{ steps.get_tag_name.outputs.version }} ${{ secrets.DOCKER_USERNAME }}/seed-test-backend:${{ steps.get_tag_name.outputs.version }} + + - name: Push Docker Image to Docker Hub + run: | + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-backend:${{ steps.get_tag_name.outputs.version }} + + # FRONTEND + - name: Build Docker Image + run: | + docker build -t seed-test-frontend:${{ steps.get_tag_name.outputs.version }} ./frontend + docker tag seed-test-frontend:${{ steps.get_tag_name.outputs.version }} ${{ secrets.DOCKER_USERNAME }}/seed-test-frontend:${{ steps.get_tag_name.outputs.version }} + + - name: Push Docker Image to Docker Hub + run: | + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-frontend:${{ steps.get_tag_name.outputs.version }} + + # SINGLE QUICK DEMO CONTAINER + - name: Build Docker Image as Latest + run: | + docker build -t seed-test-demo:${{ steps.get_tag_name.outputs.version }} . + docker tag seed-test-demo:${{ steps.get_tag_name.outputs.version }} ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:${{ steps.get_tag_name.outputs.version }} + + - name: Push Docker Image to Docker Hub + run: | + docker push ${{ secrets.DOCKER_USERNAME }}/seed-test-demo:${{ steps.get_tag_name.outputs.version }} + + - name: Post susccess message + uses: ./actions/notifyTeams + with: + title: "Publish Test-Release DockerHub ๐Ÿงช๐Ÿณ๐ŸŒ" + text: "Publishing Images for test-release ${{ github.event.release.name }} successfully." + style: "success" + webhook: ${{ secrets.MS_TEAMS_WEBHOOK_URI }} + + - name: Post error message + if: ${{ failure() }} + uses: ./actions/notifyTeams + with: + title: "Publish Test-Release DockerHub ๐Ÿณ๐ŸŒโŒ" + text: "Publishing Images for test-release ${{ github.event.release.name }} failed." + style: "failure" + webhook: ${{ secrets.MS_TEAMS_WEBHOOK_URI }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..85414fd2c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,109 @@ +FROM node:18.13 + +RUN apt-get update && apt-get -y install wget + +# Set DATABASE_URI to be localhost +ENV DATABASE_URI=mongodb://localhost:27017 + +# Create app directory +WORKDIR /usr/src/app + +# install mongoDB +RUN apt-get -y install gnupg curl +RUN curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \ + gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \ + --dearmor +RUN echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] http://repo.mongodb.org/apt/debian bullseye/mongodb-org/7.0 main" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list +RUN apt-get update && apt-get -y install mongodb-org +RUN mkdir /data +RUN mkdir /data/db +RUN mongod --fork --logpath /var/log/mongodb.log + +# ----- BACKEND (from /backend dockerfile) ----------------------------------------------------------------------- + +# install chrome +RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +RUN apt-get -y install ./google-chrome-stable_current_amd64.deb +RUN rm -f google-chrome-stable_current_amd64.deb + +# install chromedriver +RUN google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+' > chromeversion.txt +RUN apt-get install -yqq unzip curl +RUN wget -O /tmp/chromedriverzip.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$(cat chromeversion.txt)/linux64/chromedriver-linux64.zip +RUN unzip /tmp/chromedriverzip.zip chromedriver-linux64/chromedriver -d /usr/local/bin/ +RUN mv /usr/local/bin/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver + +# install firefox +RUN wget -O ~/FirefoxSetup.tar.bz2 "https://download.mozilla.org/?product=firefox-latest&os=linux64" +RUN tar xjf ~/FirefoxSetup.tar.bz2 -C /opt/ +RUN ln -s /opt/firefox/firefox /usr/local/bin/ +RUN apt-get update && apt-get install -y wget bzip2 libxtst6 libgtk-3-0 libx11-xcb-dev libdbus-glib-1-2 libxt6 libpci-dev && rm -rf /var/lib/apt/lists/* + +# install edge +RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg +RUN install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/ +RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list' +RUN rm microsoft.gpg +RUN apt-get update && apt-get install -y microsoft-edge-stable +# include in path +RUN export PATH=$PATH:/opt/microsoft/msedge/ +ENV PATH="${PATH}:/opt/microsoft/msedge/" + +# install msedgedriver +# # Extract the latest stable version of edge +RUN msedge --version | sed 's/.*Edge \([0-9.]*\).*/\1/' > latest_stable.txt + +# # Remove the driver-pagehtml +RUN wget -O /tmp/msedgedriver.zip https://msedgedriver.azureedge.net/$(cat latest_stable.txt)/edgedriver_linux64.zip +RUN unzip /tmp/msedgedriver.zip msedgedriver -d /usr/local/bin/ +RUN rm -f latest_stable.txt + +# Clean up the cache after installing all necessary packages +RUN apt-get update && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/src/app/backend +# Bundle app source +COPY ./backend . + +RUN npm ci +# If you are building your code for production +# RUN npm ci --only=production + +EXPOSE 8080 + +# Start dbus-daemon for google-chrome +RUN service dbus start + +# ----- FRONTEND (from /frontend dockerfile) --------------------------------------------------------------------- + +# Create app directory +WORKDIR /usr/src/app/frontend + +# Copy package.json and package-lock.json +COPY ./frontend/package*.json ./ + +# Install dependencies +RUN npm ci --ignore-scripts + +# Install Angular CLI +RUN npm install --ignore-scripts -g @angular/cli + +COPY ./frontend . + +EXPOSE 4200 +EXPOSE 27017-27019 +RUN npm run build + +# ----------------------------------------------------------------------------------------------------------------- + +# Create a startup script +RUN echo "#!/bin/sh" > /usr/src/app/start.sh && \ + echo "mongod --fork --logpath /var/log/mongodb.log" >> /usr/src/app/start.sh && \ + echo "cd /usr/src/app/backend && npm run database && npm run database-examples && npm run start &" >> /usr/src/app/start.sh && \ + echo "cd /usr/src/app/frontend && node server.js" >> /usr/src/app/start.sh + +# Make the script executable +RUN chmod +x /usr/src/app/start.sh + +# Set the script as the ENTRYPOINT +ENTRYPOINT ["/usr/src/app/start.sh"] \ No newline at end of file diff --git a/README.md b/README.md index 148694c5e..4abe63f25 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,41 @@ Seed-Test is a website user interface testing tool, which uses approaches of beh Please contact us via mail seed-test@adesso.de +Seed-Test can be installed via docker or by hand. + +## ๐Ÿš€Give Seed-Test Demo a Try! + +Seed-Test offers a handy demo version that's ready for you to dive into. If you're just looking to test out Seed-Test, you can easily do so by installing this demo. + +#### Prerequisites + +Before you begin, make sure you have [Docker](https://www.docker.com/products/docker-desktop/) installed. + +#### Installation + +Follow these simple steps to get up and running: + +- Open your terminal and run this command: + + ``` + docker run -p 4200:4200 -p 8080:8080 seedtest/seed-test-demo:latest + ``` + +**Try Seed-Test in Your Browser** + +Now, you can experience Seed-Test in your web browser at http://localhost:4200. + +An example user account is ready for you to explore. + +- E-Mail: `seed@test.de` +- Password: `seedtest` + +Have Fun! ๐Ÿš€๐ŸŒŸ + +#### โš ๏ธ Important Note + +Please note that Seed-Test's demo version is for testing purposes only and should not be used in a production environment. For production use, consider using the full version of Seed-Test. Check out the Installation section bellow. + ## Installation Seed-Test can be installed via docker or by hand. diff --git a/backend/package.json b/backend/package.json index f185e42a5..6815717cd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,6 +9,7 @@ "test": "jest --verbose", "test-coverage": "jest --coverage", "database": "node src/database/installDatabase.js", + "database-examples": "node src/database/insertExampleData.js", "clean": "rimraf ./dist", "tsc": "tsc", "lint": "./node_modules/.bin/eslint src/database --fix", @@ -69,6 +70,8 @@ "/spec/serverHelper.spec.js", "/node_modules/" ], - "setupFiles": ["./spec/setupTest.js"] + "setupFiles": [ + "./spec/setupTest.js" + ] } } diff --git a/backend/src/database/insertExampleData.js b/backend/src/database/insertExampleData.js new file mode 100644 index 000000000..2e59adfbb --- /dev/null +++ b/backend/src/database/insertExampleData.js @@ -0,0 +1,104 @@ +const { exit } = require('process'); +const bcrypt = require('bcrypt'); +const dbService = require('./DbServices'); +require('dotenv').config(); + +const exampleUser = 'seed@test.de'; +const examplePassword = 'seedtest'; +const exampleStory = 'Example Story'; +const exampleDescription = 'Example Description'; +const exampleScenario = { + scenario_id: 1, + name: 'Example Scenario', + comment: null, + stepDefinitions: { + given: [ + { + id: 1, + mid: '', + pre: 'I am on the website:', + stepType: 'given', + type: 'Website / URL', + values: [ + 'https://www.youtube.com/' + ], + isExample: [ + false + ] + } + ], + when: [], + then: [ + { + id: 1, + mid: '', + pre: 'I take a screenshot. Optionally: Focus the page on the element', + stepType: 'then', + type: 'Screenshot', + values: [ + '' + ], + isExample: [ + false + ] + } + ], + example: [] + }, + browser: 'chrome', + lastTestPassed: null +}; + +const uri = process.env.DATABASE_URI || 'mongodb://SeedAdmin:SeedTest@localhost:27017'; + +async function insertExampleUser() { + try { + // eslint-disable-next-line max-len + const result = await dbService.registerUser({ email: exampleUser, password: bcrypt.hashSync(examplePassword, bcrypt.genSaltSync(10)) }); + console.log('\x1b[32mExample-User inserted! \n\x1b[0m'); + return result; + } catch (error) { + console.log(`\x1b[31m${error} \x1b[0m`); + return dbService.getUserByEmail(exampleUser); + } +} + +async function insertExampleTest(user) { + try { + // createRepository + const repoId = await dbService.createRepo(user.insertedId, 'Test Repo'); + console.log('\x1b[32mExample-Repo inserted! \n\x1b[0m'); + // createStory + const storyId = await dbService.createStory(exampleStory, exampleDescription, repoId); + await dbService.insertStoryIdIntoRepo(storyId, repoId); + console.log('\x1b[32mExample-Story inserted! \n\x1b[0m'); + // fillTestScenario + await dbService.updateScenario(storyId, exampleScenario); + console.log('\x1b[32mExample-Scenario-Data inserted! \n\x1b[0m'); + } catch (error) { + console.log(`\x1b[31m${error} \x1b[0m`); + } +} + +async function insertExampleData() { + // wait to give establishConnection enough time to establish connection xD + await new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, 1500); + }); + console.log(`\x1b[33mSetting Up DB-Exampel-Data in: ${uri}\n\x1b[0m`); + console.log('\x1b[34mInserting Example User: \x1b[0m'); + const user = await insertExampleUser(); + console.log('\x1b[34mInserting Example Test: \x1b[0m'); + await insertExampleTest(user); + console.log('\x1b[32mExample-Data set up! \x1b[0m'); +} + +insertExampleData().then(() => { + exit(); +}) + .catch((err) => { + console.error(err); + exit(1); + });