diff --git a/.dockerignore b/.dockerignore index 04167b9..f8bef75 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,14 @@ */.idea/ */*.iml *.orig -*/target/ +frontend/ +frontend-webjars/ +backend/ *.env **/*.db */*.ipr */*.iws -.DS_Store - +.DS_Store +*/.git/ +!backend/target/ide-backend.jar +!backend/src/main/resources/lib diff --git a/.gitignore b/.gitignore index b25c15b..efd9db0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *~ +node_modules/ + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..cca1e4b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,52 @@ +dist: trusty +language: java +jdk: +- oraclejdk8 + +service: +- docker + +cache: + directories: + - $HOME/.m2 + - $HOME/docker + - $HOME/.yarn-cache + - frontend/node_modules + +env: + global: + - secure: NtkK4A4aYmudQue+KzS/PRyO2+5YkKp9x0r0AFRpZB6F9v+4cX+aWynX1reVQ1By9NmB/F3W9t+hujS2Dm7pIwlzj4oDRzdSda/aakOF6fiJvy41xaa4fGNEDdrvrtzfFHoFCuG7lg8mO5hVAIlwXeLR+XjDQXj6XklgHcjxF5WCEzElN9ZcA8K3b7tU1pxyaGeKTN3Qu+L1xVNkFnfi7sCiLIkXG8LV/0O8al/qow5SAm3gBAIqplSN7o2AKur331IsZD6PfTqPTZJbQMYFkcRZisZ+8J/H+xCHTk/Bf56BpMuJYLr0ScZURznmX5Hhh+JSx4kZnQbgs6F26/c1k1vWy9G1ZMRdepBZm+UG3yobbAKH/Nu4tt47UjBdbkedvRJbLUQQCo/StUE0kqRFa9ykQYltGYPm879NRyZbryEK5LHkwW0CNSZFU1zlToo8q7IH47cZz+kJTDFkYoP/0wOVf9sSCV07tWTnegI7P6YR5s+q7n7XYhVUOcS+x0PERYajIybgU0bJ0r2hQc8kg05YlVOH88wR3BGegKnv0J2kw2IKpENIG6FNRmhIeXi27dTIAfcC4w+1XsqBBQZr6f/HKHgLvMi+Y6lrXV/hGJL1CkiEtkuuUyDF8zC68jfqhvunXAuIZD6FnRkHJBVnKqbcqMYD0BxLae4ic5sRXfI= + - secure: HZipPIhxoHUMxO+EsCImjcbaJNsbXTo4NpmBzGm5uv2RdQRTyauePpwNfcFnpZNrCz0e6BfSAxzEZ6HZ+hIViPZUCWBrB3us7XOSd9U9S40a6E4LnfMMfX53awC7BFAoiU5eIrcOAgSppIic0ZaOHdM0BbIFJeU3mUsApHQ9s4fj8pRp38e9PYfAQ7K0zreU5rnEV/cWJhF2G1Qx7jkeiA99tf4ndjNP9L8Olcs/jaN1nxggR7QuT8hTfNJNIVeYBirhudu/5K2TblydBh7CKcmv77N5H6um07SP32oXAOoUESpfEntKS/FgUAMcckYYX1SIsYzMuqZbN60kgmPocppsDp2NARsKn4/EEV1aZe0Dm8udOXipxVaXBCnKXS5mm+zlmmgRY//DCoH8Jk8ULOhqc6Yevj3IMUK4KIL46q4tfaB9ktVVa+a3b/Ljqs0dgsAKC11tx+rUWHjUCX30ixH035H40xOzRw+5DVVyy2KtppNnwKWx+3xBRrwx1zwWBb2p9UsXZ1hEo3c/cCpseuHvbbXYVOoOXRxA2ZtJf5MnjU9Y5K20gBM4qFJ/E2xYJ5LiE5HOLluNECyF6lzIWZeVMp1qic98C662+Hpyj9HnHnDGdwkHyuBBWlsQxyKTiQt9S6HfG0WDQFvS1PF3/9dW4yO8bkrXBTeuBWy9638= + - COMMIT=${TRAVIS_COMMIT::8} + - DOCKER_CACHE_FILE=${HOME}/docker/cache.tar.gz + - REPO=webide/webide + - NODE_ENV=prod + +before_install: +- sudo apt-get update +- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce +- nvm install 7 +- nvm use 7 +- if [ -f ${DOCKER_CACHE_FILE} ]; then gunzip -c ${DOCKER_CACHE_FILE} | docker load; fi + +install: true + +script: +- set -e +- cd frontend && yarn && yarn run build +- cd ../frontend-webjars && mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V +- cd ../backend && mvn package -DskipTests=true -Dmaven.javadoc.skip=true -B -V +- cd .. && docker build -f Dockerfile -t $REPO:$COMMIT . +- if [ -n "$TRAVIS_TAG" ]; then docker tag $REPO:$COMMIT $REPO:$TRAVIS_TAG ; docker tag $REPO:$COMMIT $REPO:latest ; docker login -u $DOCKER_USER -p $DOCKER_PASS ; docker push $REPO ; fi + +before_cache: +- set -e +- mkdir -p $(dirname ${DOCKER_CACHE_FILE}) +- docker save $(docker history -q $REPO:$COMMIT | grep -v '') | gzip > ${DOCKER_CACHE_FILE} + +notifications: + slack: + on_failure: always + on_success: change + rooms: + secure: htxsb1e6mOjdWfyyL2D46tDSwrZsJZd22/VlVLykoSt4vktIBGBFIyfroc0BAD3Bxn/4LT23q1TXVXafFDwUa9NWUFOTciyn5wWoJfTzC/GZ3fk4c9dLX2zcFf+Nz+2UU4Kyg7v4rvm5DiqfyGPmvzoKHG+GjbdYLUTjWr0jKscP5zDIRWv/0RUiea8kgGR4dQLY+xq2tAmvCZBzNnb20NWNzdWHviTN8sdbQMipeLm3rW8LwMQavU/IWNRn4yMVTtUzz1eE+cG74c0H4RTU7iJh1NQFjaFKZvEGuE3ZnTA7e6WGeA5bHbaYY44fjZEEu5uhixj08huMuK3fEyTu1rNh5bkAowxqrI53RLPHsECq0xF+Y5aZpV5dEx+gvz/dNCWlV8d658H11oBhL3gPQPcouJTMoktW+12kEqeKVRnSm6fXJmhYZHLal+bF9iQZjh2Ask+1hoWvQJbFONlrCHp+XGKzMxSxyqXWV491QIDZIQsBw17qNSD1zQG0dSdHogxl/N5MB7lgCCmjMPrPaD29tqO1a3qJAN/2dw0dW0VBOznixNz+hpBVbUELJJjsu8wlrm1wBFsdwLIwCVjSKJ3CgQPoMcYTI1nCm5vzuUEExfGTArh00uvYG4H7usfF/KbMt4zQkwxEwjihLvnw5G//YwWpG+JIte5BMnSJuFU= diff --git a/Dockerfile b/Dockerfile index 8da8760..e3b7f59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,20 @@ -FROM ksimple/java8-mvn-nodejs-npm-python3 -MAINTAINER tanhe123 from Coding IDE Team +FROM java:8-jdk-alpine EXPOSE 8080 -RUN apt-get update && apt-get install -y zsh && apt-get clean && rm -rf /var/lib/apt/lists/* - -# Add user `coding` -RUN useradd --create-home --home-dir /home/coding --shell /usr/bin/zsh coding \ - && echo "coding:coding" | chpasswd \ - && adduser coding sudo \ - && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers - -USER coding -ENV HOME /home/coding -ENV SHELL /usr/bin/zsh -ENV TERM xterm -ADD . /opt/coding/WebIDE +RUN set -ex && \ + if [ $(wget -qO- ipinfo.io/country) == CN ]; then echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories ;fi && \ + apk update && \ + apk add --no-cache zsh git openssh # Install oh-my-zsh -RUN git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh \ +RUN git clone --depth=1 git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh \ && cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc -RUN sudo chown -R coding /opt/coding/WebIDE \ - && mkdir $HOME/.m2 +ENV SHELL /bin/zsh -RUN cd /opt/coding/WebIDE/frontend && npm install && npm run build \ - && cd /opt/coding/WebIDE/frontend-webjars && mvn clean install \ - && cd /opt/coding/WebIDE/backend && mvn clean package -Dmaven.test.skip=true \ - && cp /opt/coding/WebIDE/backend/target/ide-backend.jar /opt/coding/WebIDE \ - && cd /opt/coding/WebIDE/frontend && rm -r build node_modules \ - && cd /opt/coding/WebIDE/frontend-webjars && mvn clean \ - && cd /opt/coding/WebIDE/backend && mvn clean \ - && rm -fr $HOME/.m2 +ADD backend/target/ide-backend.jar /root +ADD backend/src/main/resources/lib /root/lib -ENV CODING_IDE_HOME /home/coding/coding-ide-home -CMD ["java", "-jar", "/opt/coding/WebIDE/ide-backend.jar", "--PTY_LIB_FOLDER=/opt/coding/WebIDE/backend/src/main/resources/lib"] +WORKDIR /root +CMD ["java", "-jar", "ide-backend.jar", "--PTY_LIB_FOLDER=/root/lib"] diff --git a/README-zh.md b/README-zh.md index 2d3549b..8a9da81 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,7 +1,12 @@ # Coding WebIDE +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://github.com/Coding/WebIDE/blob/master/LICENSE) [![Build Status](https://travis-ci.org/Coding/WebIDE.svg?branch=master)](https://travis-ci.org/Coding/WebIDE) [![Docker Stars](https://img.shields.io/docker/stars/webide/webide.svg)](https://hub.docker.com/r/webide/webide 'DockerHub') [![Docker Pulls](https://img.shields.io/docker/pulls/webide/webide.svg)](https://hub.docker.com/r/webide/webide 'DockerHub') README: [English](https://github.com/Coding/WebIDE/blob/master/README.md) | [中文](https://github.com/Coding/WebIDE/blob/master/README-zh.md) +---- +### 线上 WebIDE 现已全面升级为 Cloud Studio,欢迎访问 https://studio.coding.net/ +---- + ![](https://raw.githubusercontent.com/Coding/WebIDE/gh-pages/screenshots/import.png) ![](https://raw.githubusercontent.com/Coding/WebIDE/gh-pages/screenshots/workspace.png) @@ -35,10 +40,11 @@ Coding WebIDE(https://ide.coding.net) 是 Coding 自主研发的在线集成开 ## 运行环境 -WebIDE Frontend 依赖 **npm** 做包管理,**webpack** 和 **babel** 做构建工具 +WebIDE Frontend 需要 **node v6.x** 作为编译运行环境(可以避免很多奇怪的错误),使用 **yarn** 做包管理工具,做构建工具使用 **webpack** 和 **babel** + WebIDE-Frontend-Webjars & WebIDE-Backend 项目依赖 **maven3** 和 **java8** -在编译、运行项目前,请保证环境依赖已被正确配置。 +运行该项目需要至少 512MB 的内存空间。在编译、运行项目前,请保证环境依赖已被正确配置。 ## Server 版 @@ -60,7 +66,7 @@ git submodule update 这样就会通过 git 的 submodule 机制 clone 另外 3 个 repo。 ``` -./ide.sh build # 编译并打包前端项目 +./ide.sh build # 编译并打包前端项目 ./ide.sh run # 启动项目 ``` @@ -68,19 +74,19 @@ git submodule update `backend/src/main/resources/application.properties` 包括用户、项目、数据库等配置,可以通过修改配置定制服务: -* **SPACE_HOME:** 存放 workspace 的目录,默认为 ${"user.home"}/.workspace -* **server.port:** 应用启动的端口 +* **SPACE_HOME:** 存放 workspace 的目录,默认为 `~/.coding-ide/workspace` +* **server.port:** 应用启动的端口 * **USERNAME:** 用户名,git 提交时会使用该值作为 user.name,默认为 coding。 -* **EMAIL:** 用户邮箱,git 提交时会使用该值作为 user.email,默认为 coding@coding.net +* **EMAIL:** 用户邮箱,git 提交时会使用该值作为 user.email,默认为 coding@coding.net * **AVATAR:** 用户头像 -* **CODING_IDE_HOME:** 应用数据存放目录 +* **CODING_IDE_HOME:** 应用数据存放目录,默认为 `~/.coding-ide` 修改配置后,需要重启应用。另外如果修改了 `USERNAME`、`EMAIL` 的值,会在创建新的 Workspace 时生效。 ## docker 版 ``` -docker run -p 8080:8080 --name webide webide/webide +docker run -p 8080:8080 -v coding-ide-home:/root/.coding-ide webide/webide ``` 更多 docker 命令,参照 wiki [English](https://github.com/Coding/WebIDE/wiki/Docker-Server.en) [中文](https://github.com/Coding/WebIDE/wiki/Docker-Server.zh) diff --git a/README.md b/README.md index 1dfda7d..5c362db 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,12 @@ # Coding WebIDE +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://github.com/Coding/WebIDE/blob/master/LICENSE) [![Build Status](https://travis-ci.org/Coding/WebIDE.svg?branch=master)](https://travis-ci.org/Coding/WebIDE) [![Docker Stars](https://img.shields.io/docker/stars/webide/webide.svg)](https://hub.docker.com/r/webide/webide 'DockerHub') [![Docker Pulls](https://img.shields.io/docker/pulls/webide/webide.svg)](https://hub.docker.com/r/webide/webide 'DockerHub') README: [English](https://github.com/Coding/WebIDE/blob/master/README.md) | [中文](https://github.com/Coding/WebIDE/blob/master/README-zh.md) +---- +### WebIDE is now upgraded to Cloud Studio,welcome to our new homepage https://studio.coding.net/ +---- + ![](https://raw.githubusercontent.com/Coding/WebIDE/gh-pages/screenshots/import.png) ![](https://raw.githubusercontent.com/Coding/WebIDE/gh-pages/screenshots/workspace.png) @@ -35,10 +40,11 @@ This is the entry point to setup and run the WebIDE Community Edition project. I ## Environment -WebIDE Frontend uses **npm** for package management, **webpack** and **babel** for building. +WebIDE Frontend require **node v6.x** as build environment (this will save you from alot of weird errors). We recommend **yarn** for package management, **webpack** and **babel** is used for building. + Frontend Webjars & WebIDE Backend use **maven3** and **java8**. -Please ensure you have corresponding tools installed in your environment before build and run the project. +The project requires at minimum 512MB memory to run. Please ensure you have corresponding tools installed in your environment before build and run the project. ## Native Server @@ -73,12 +79,12 @@ Server runs on port 8080 by default, visit localhost:8080 to check it out. `backend/src/main/resources/application.properties` contains configurations of user, project, database, etc., you can change these parameters to meet your need: -* **SPACE_HOME:** path to your workspace directory, default to `${"user.home"}/.workspace` +* **SPACE_HOME:** path to your workspace directory, default to `~/.coding-ide/workspace` * **server.port:** backend server port * **USERNAME:** username, used by git as its `user.name` config when commit, defaults to "coding" * **EMAIL:** email, used by git as its `user.email` config when commit, defaults to "coding@coding.net" * **AVATAR:** user's avatar -* **CODING_IDE_HOME:** path to store WebIDE application's data +* **CODING_IDE_HOME:** path to store WebIDE application's data, default to `~/.coding-ide` If changed, restart the application to let your configurations take effect. Note that changes on `USERNAME`, `EMAIL` *WILL NOT* apply to workspaces that are already created. @@ -86,7 +92,7 @@ If changed, restart the application to let your configurations take effect. Note ## Docker Server ``` -docker run -p 8080:8080 -h webide --name webide webide/webide +docker run -p 8080:8080 -v coding-ide-home:/root/.coding-ide webide/webide ``` To learn more about docker commands,please refer to wiki [English](https://github.com/Coding/WebIDE/wiki/Docker-Server.en) [中文](https://github.com/Coding/WebIDE/wiki/Docker-Server.zh) diff --git a/backend b/backend index 2e366a9..ddb5008 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 2e366a93a64ff4cbb9f951cc3e3372abd5f4808b +Subproject commit ddb5008e5f807d32217362697d09d4f78c61b75a diff --git a/config b/config new file mode 100644 index 0000000..26fa31d --- /dev/null +++ b/config @@ -0,0 +1,18 @@ +# Environment for running the application, either "prod" or "dev" +#RUN_ENV= + +# USER INFO +#USERNAME= +#EMAIL= +#AVATAR= + +# CORS (Seprate with comma) +#ALLOWED_ORIGINS= + +# Home Directory(Do not modify when using docker) +#CODING_IDE_HOME= +#SPACE_HOME= + +# Max file size to upload (in Mb) +#UPLOAD_FILE_SIZE_LIMIT= + diff --git a/frontend b/frontend index 9e007fd..fab3d99 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit 9e007fd1c64cfca9b1c2df181a3884b0d0f29390 +Subproject commit fab3d991cd90be0c04ec7c57332bca32c6e9cddf diff --git a/frontend-webjars b/frontend-webjars index 3872b1b..eabe1a7 160000 --- a/frontend-webjars +++ b/frontend-webjars @@ -1 +1 @@ -Subproject commit 3872b1bae6b1ece0e18aae192b9724b41bd76683 +Subproject commit eabe1a7ed38f66c45a2c585f58ca9d29ab5c9c5b diff --git a/ide.sh b/ide.sh index 88b7c8f..0ae30e2 100755 --- a/ide.sh +++ b/ide.sh @@ -8,7 +8,6 @@ BACKEND=$BASEDIR/backend FRONTEND=$BASEDIR/frontend FRONTEND_WEBJARS=$BASEDIR/frontend-webjars CONTAINER=webide -CODING_IDE_HOME=$HOME/.coding-ide-home valid_last_cmd() { if [ $? -ne 0 ]; then @@ -48,11 +47,9 @@ sub_backend() { do_build_frontend() { cd $FRONTEND - echo "npm install..." - npm install --registry=https://registry.npm.taobao.org - echo "building frontend..." - npm run build + yarn install + yarn run build valid_last_cmd cd $FRONTEND_WEBJARS @@ -62,21 +59,37 @@ do_build_frontend() { cd $BASEDIR } +do_build_backend() { + cd $BACKEND + echo "mvn clean and packaging..." + mvn clean package -Dmaven.test.skip=true + valid_last_cmd + cd $BASEDIR +} + sub_build() { build_usage() { - echo "Usage: $PROG_NAME build frontend" + echo "Usage: $PROG_NAME build [frontend | backend | run]" } case $1 in "-h" | "--help") build_usage ;; - "" | "frontend") + "") + do_build_frontend + do_build_backend + ;; + "backend") + do_build_backend + ;; + "frontend") do_build_frontend ;; "run") # build and run do_build_frontend + do_build_backend do_run_backend ;; esac @@ -142,12 +155,6 @@ container_is_running() { fi } -create_dir_if_not_exist() { - if [ ! -d "$1" ]; then - echo "$1 is not exist, creating..." - mkdir $1 - fi -} sub_docker() { @@ -184,16 +191,15 @@ sub_docker() { docker_usage ;; "build") - docker build $EXTRA_VARS . + docker build $EXTRA_VARS -t webide/webide . ;; "run") RUNNING=$(docker inspect --format="{{ .State.Running }}" $CONTAINER 2> /dev/null) if ! container_exist ; then - create_dir_if_not_exist $HOME/.coding-ide-home echo "creating container $CONTAINER" - docker create -p 8080:8080 -v $HOME/.coding-ide-home:/home/coding/coding-ide-home --name webide -h webide webide/webide + docker create -p 8080:8080 --env-file config -v coding-ide-home:/root/.coding-ide --name webide -h webide webide/webide valid_last_cmd elif [ "$RUNNING" == "true" ]; then echo "CRITICAL - $CONTAINER is running." @@ -234,9 +240,11 @@ sub_docker() { } do_run_backend() { - cd $BACKEND - mvn clean spring-boot:run ${1} - cd $BASEDIR + if [ ! -f $BACKEND/target/ide-backend.jar ]; then + sub_build + fi + . $BASEDIR/config + java -jar $BACKEND/target/ide-backend.jar --PTY_LIB_FOLDER=$BACKEND/src/main/resources/lib ${1} } sub_run() { @@ -250,7 +258,7 @@ sub_run() { while getopts ":p:" opt; do case $opt in p) - EXTRA_VARS=-Drun.arguments="--server.port=${OPTARG}" + EXTRA_VARS="--server.port=${OPTARG}" ;; \?) run_usage