From 2192da7d347bee6a6c970660c5b843be818bba52 Mon Sep 17 00:00:00 2001 From: DrMxrcy Date: Mon, 27 Feb 2023 19:49:02 -0500 Subject: [PATCH] Add OneDev --- apps/onedev/config.json | 47 +++++++++++ apps/onedev/docker-compose.yml | 47 +++++++++++ apps/onedev/metadata/description.md | 120 ++++++++++++++++++++++++++++ apps/onedev/metadata/logo.jpg | Bin 0 -> 37518 bytes 4 files changed, 214 insertions(+) create mode 100644 apps/onedev/config.json create mode 100644 apps/onedev/docker-compose.yml create mode 100644 apps/onedev/metadata/description.md create mode 100644 apps/onedev/metadata/logo.jpg diff --git a/apps/onedev/config.json b/apps/onedev/config.json new file mode 100644 index 00000000..36f85912 --- /dev/null +++ b/apps/onedev/config.json @@ -0,0 +1,47 @@ +{ + "$schema": "../schema.json", + "name": "OneDev", + "port": 6610, + "available": true, + "exposable": true, + "id": "onedev", + "tipi_version": 1, + "version": "8.0.4", + "categories": ["development"], + "description": "Self-hosted Git Server with Kanban and CI/CD", + "short_desc": "Self-hosted Git Server with Kanban and CI/CD", + "author": "https://code.onedev.io/", + "source": "https://code.onedev.io/onedev/server", + "form_fields": [ + { + "type": "random", + "label": "DB_PASSWORD", + "min": 32, + "env_variable": "DB_PASSWORD" + }, + { + "type": "text", + "label": "Onedev Inital Username", + "max": 50, + "min": 3, + "required": true, + "env_variable": "initial_user" + }, + { + "type": "text", + "label": "Onedev Inital Email", + "max": 50, + "min": 3, + "required": true, + "env_variable": "initial_email" + }, + { + "type": "password", + "label": "Onedev Inital Password", + "max": 50, + "min": 3, + "required": true, + "env_variable": "initial_password" + } + ] +} diff --git a/apps/onedev/docker-compose.yml b/apps/onedev/docker-compose.yml new file mode 100644 index 00000000..92f0bff7 --- /dev/null +++ b/apps/onedev/docker-compose.yml @@ -0,0 +1,47 @@ +version: "3.7" + +services: + onedev: + image: 1dev/server:8.0.4 + container_name: onedev + environment: + - hibernate_dialect=io.onedev.server.persistence.PostgreSQLDialect + - hibernate_connection_driver_class=org.postgresql.Driver + - hibernate_connection_url=jdbc:postgresql://onedev-db:5432/onedev + - hibernate_connection_username=tipi + - hibernate_connection_password=${DB_PASSWORD} + - initial_user=${initial_user} + - initial_password=${initial_password} + - initial_email=${initial_email} + - initial_server_url=${APP_DOMAIN} + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/onedev:/opt/onedev + - /var/run/docker.sock:/var/run/docker.sock + ports: + - ${APP_PORT}:6610 + - "6611:6611" + depends_on: + - onedev-db + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.onedev.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.onedev.entrypoints: websecure + traefik.http.routers.onedev.service: onedev + traefik.http.routers.onedev.tls.certresolver: myresolver + traefik.http.services.onedev.loadbalancer.server.port: 6610 + + onedev-db: + container_name: onedev-db + image: postgres:14 + restart: unless-stopped + environment: + - POSTGRES_USER=tipi + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=onedev + volumes: + - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data + networks: + - tipi_main_network diff --git a/apps/onedev/metadata/description.md b/apps/onedev/metadata/description.md new file mode 100644 index 00000000..7e7b48b3 --- /dev/null +++ b/apps/onedev/metadata/description.md @@ -0,0 +1,120 @@ +## Out-of-box Symbol Search and Navigation + +Of course IDE is good at doing this, but often we need to search in old commits (investigate issues in release versions etc), and switching commits in IDE can be troublesome and slow. + +It works by analyzing source code with ANTLR, extracting symbols for storage incrementally, fast and space efficient. Now supports Java, JavaScript, C, C++, CSharp, Go, PHP, Python, CSS, SCSS, LESS and R. GitHub adds this feature several years ago, but seems that it only works for main branch, and GitLab has to configure CI job to generate and upload LSIF which is troublesome and can occupy considerable space if you do it for each commit. + +You can also jump to symbol definition in diff while reviewing commits or pull requests. + +![searchsymbol](doc/images/search-symbol.gif) + +![jumpsymbol](doc/images/symbol.gif) + +## Code Search with Regular Expression + +You may switch to any commit, and search code with regular expression. OneDev under the hood indexes the code with Lucene incrementally. At search time, literal tri-grams in the regular expression are extracted for a coarse search, followed by exact match in the result. This makes the regex search blazing fast, even for large repositories like Linux. + +![regex](doc/images/regex-search.gif) + +## Annotate Source/Diff with Static Analysis Result to Facilitate Code Review + +Of course this can be done by many third party applications at GitHub, however they display the result on their own applications, and this makes review activities such as adding comment over analysis result difficult. Not to mention that you need to pay for these services. + +![annotation](doc/images/annotation.png) + +## Customizable Issue State and Field, with Deep CI/CD Integration + +The simple open/close state of GitHub/GitLab issues does not work well for many workflows. Considering issues submitted by customers: + +1. If developer closes issue upon committing the code, customer will be notified and may ask for the release fixing the issue. +2. If developer closes the issue at release time, QA might be confused at what issues to test as they all remain open at test time. + +With customizable issue states, we may address the issue with four states: open, committed, test ready and released: + +1. When code is committed, issue transits to committed state automatically +2. When a test build is created and deployed, the issue transits to test ready state automatically. QA will be notified and can check issue detail to know which environment the test build is deployed into. +3. When test passes, and a release build is created, customers submitting the issue will be notified and they can check issue detail to see which release contains the fix. + +![boards](doc/images/boards.png) + +![fixing-build](doc/images/fixing-build.png) + +## Service Desk to Create/Discuss Issues via Email + +Service desk allows your users to submit tickets via email without the need to have a OneDev account. These tickets can then be created in desired projects, and assigned to appropriate members in your team. All further discussions over the tickets can take place completely in email, with discussion contents posted to ticket as comments. User will also get notifications when there are any ticket activities, for instance, when a relevant release is created or deployed + +![service-desk.png](doc/images/service-desk.png) + +## A powerful and Intuitive Query Language + +Thanks to ANTLR again, OneDev ships sophisticated query languages for projects, commits, issues, builds, and pull requests, with intuitive auto-completions and hints. For instance, it enables our customers finding fixed issues between their running release and latest release, and enables us to find all commits submitted by someone touching specified modules, etc. + +Queries can be saved and subscribed, so that you won't miss anything interested. + +![query](doc/images/query.gif) + +## A Full-fledge CI/CD Engine without Writing Yaml + +OneDev ships with GUI to generate CI/CD Yaml. No need to google around for Yaml grammars. A one-liner docker command to start OneDev server and you have a local CI/CD runner automatically. Concerns about server capability to run massive jobs? Another one-liner to connect self-updating agent from any machine. Want auto-scale CI/CD farm? A helm one-liner to deploy OneDev into k8s cluster. + +Build pipeline, matrix jobs, typed parameters, parameter chaining, step templates, build promotions… too many neat features to elaborate… + +![job-def](doc/images/job-command.gif) + +![run-job](doc/images/build-option.gif) + +![pipeline.gif](doc/images/pipeline.gif) + +## Flexible Pull Request Review Policy and Reviewer Suggestion + +Specify pull request review policy based on author, branch, and changed files. OneDev can leverage git change history to suggest most appropriate reviewers for pull requests touching certain files. + +![review-policy](doc/images/review-policy.gif) + +## Lightweight Review without Pull Request + +Comment on any part of code or diff to start a lightweight review without opening pull request. Review comments live through code modification and even file rename to serve as documentation. + +Each discussion is threaded so that you can easily know discussions with new comments/updates. + +![file-comment](doc/images/file-comment.gif) + +![thread-comments](doc/images/threaded-comments.png) + +## Command Palette to Access Features Quickly + +Press cmd/ctrl-k to bring up command palette from anywhere. Search projects, files, issues, pull requests, builds, and various settings and jump to them without leaving your keyboard + +![command-palette.gif](doc/images/command-palette.gif) + +## Write Markdown Pleasantly With a Smart Editor + +When embedding an image in a markdown file in GitHub/GitLab, you need to upload the image in a separate page, and then figure out the relative path to reference that image. With OneDev, you simply upload the image to desired folder in same editor, and the link will be generated automatically. + +OneDev tracks your cursor in edit window and scrolls the preview window as necessary so that you can always preview what you are typing. + +![markdown](doc/images/markdown.gif) + +## SLOC Trend By Language + +OneDev inspects git history of main branch to calculate trend of source lines of code by language efficiently. + +![stats](doc/images/stats.png) + +## Project Hierarchy to Facilitate Setting Inheritance + +Organization is ideal for public service. However for self-hosted internal use, we feel that a hierarchical structure is more practical to organize projects. Child projects can inherit settings from parent project and can selectively override some of them if necessary. This reduces a lot of overhead to manage a lot of projects in the company. + +## Fast and Reliable with Moderate Resource Usage + +OneDev is carefully designed with performance in mind. With a 2 core 2GB box, you will get all features above for medium sized projects. +It has been intensively used for more than 5 years, with battle-proven reliability. Fixing bugs is our highest priority, and there is +normally few to no known bugs in the wild. + +---- + +# Special Thanks + +![yourkit](https://www.yourkit.com/images/yklogo.png) + +[YourKit](https://yourkit.com) supports this project by providing a free open source license of their excellent Java profiler \ No newline at end of file diff --git a/apps/onedev/metadata/logo.jpg b/apps/onedev/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5953e1a2e70f05bfd9fde64183d954ea03c30fa GIT binary patch literal 37518 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