From db8b475bf71afecf3b007b0a1398840458418722 Mon Sep 17 00:00:00 2001 From: Davi Koscianski Vidal Date: Tue, 5 Nov 2024 17:01:29 +0100 Subject: [PATCH] Updates SonarQube Community Build references --- sonarqube/README-short.txt | 2 +- sonarqube/content.md | 30 ++++++++++++++++-------------- sonarqube/license.md | 2 +- sonarqube/logo.png | Bin 5988 -> 9180 bytes 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/sonarqube/README-short.txt b/sonarqube/README-short.txt index d1147e9c9c88..bf41551a0a53 100644 --- a/sonarqube/README-short.txt +++ b/sonarqube/README-short.txt @@ -1 +1 @@ -SonarQube is an open source platform for continuous inspection of code quality. \ No newline at end of file +Official images for SonarQube, code analysis tool for code quality and security diff --git a/sonarqube/content.md b/sonarqube/content.md index 1961b53c4db0..c5b56e7a946e 100644 --- a/sonarqube/content.md +++ b/sonarqube/content.md @@ -1,12 +1,14 @@ -# What is SonarQube? +# What is `sonarqube`? -[SonarQube](https://www.sonarqube.org/) is the leading tool for continuously inspecting the Code Quality and Security of your codebases, and guiding development teams during Code Reviews. Covering 27 programming languages, while pairing-up with your existing software pipeline, SonarQube provides clear remediation guidance for developers to understand and fix issues, and for teams overall to deliver better and safer software. With over 225,000 deployments helping small development teams as well as global organizations, SonarQube provides the means for all teams and companies around the world to own and impact their Code Quality and Security. +`sonarqube` Docker repository stores the official Sonar images for SonarQube Server and SonarQube Community Build. -%%LOGO%% +[SonarQube Server](https://www.sonarsource.com/products/sonarqube/) (formerly SonarQube) is an on-premise analysis tool designed to detect quality and security issues in 30+ languages, frameworks, and IaC platforms. The solution also provides fix recommendations leveraging AI with Sonar’s AI CodeFix capability. By integrating directly with your CI pipeline or on one of the supported DevOps platforms, your code is checked against an extensive set of rules that cover many attributes of code, such as maintainability, reliability, and security issues on each merge/pull request. -# How to use this image +[SonarQube Community Build](https://www.sonarsource.com/open-source-editions/sonarqube-community-edition/) (formerly SonarQube Community) is free and open source SonarQube offering. It provides core features such as bug detection, code smells, and basic security issue identification across 30+ programming languages and frameworks. However, advanced security analysis, enterprise-level integrations, and scalability options are reserved for SonarQube Server. -Here you'll find the Docker images for the Community Edition, Developer Edition, Enterprise Edition, and Data Center Edition of SonarQube. +## How to use this image + +Here you'll find the Docker images for the SonarQube Server (Developer Edition, Enterprise Edition, and Data Center Edition), as well as for SonarQube Community Build. ## Docker Host Requirements @@ -21,7 +23,7 @@ ulimit -n 131072 ulimit -u 8192 ``` -## Try Out SonarQube +## Demo To quickly run a demo instance, see Using Docker on the [Try Out SonarQube](https://docs.sonarqube.org/latest/setup/get-started-2-minutes/) page. When you are ready to move to a more sustainable setup, take some time to read the **Installation** and **Configuration** sections below. @@ -31,7 +33,7 @@ To quickly run a demo instance, see Using Docker on the [Try Out SonarQube](http For installation instructions, see Installing the Server from the Docker Image on the [Install the Server](https://docs.sonarqube.org/latest/setup/install-server/) page. -To run a cluster with the Data Center Edition, please refer to Installing SonarQube from the Docker Image on the [Install the Server as a Cluster](https://docs.sonarqube.org/latest/setup/install-cluster/) page. +To run a cluster with the SonarQube Server Data Center Edition, please refer to Installing SonarQube Server from the Docker Image on the [Install the Server as a Cluster](https://docs.sonarqube.org/latest/setup/install-cluster/) page. > The `lts` tag on Docker images is replaced with every new LTS release. If you want to avoid any automatic major upgrades, we recommend using the corresponding `9.9-` tag instead of `lts-`. @@ -42,18 +44,18 @@ To run a cluster with the Data Center Edition, please refer to Installing SonarQ By default, the server running within the container will listen on port 9000. You can expose the container port 9000 to the host port 9000 with the `-p 9000:9000` argument to `docker run`, like the command below: ```console -docker run --name sonarqube-custom -p 9000:9000 %%IMAGE%%:10.6-community +docker run --name sonarqube-custom -p 9000:9000 %%IMAGE%%:community ``` -You can then browse to `http://localhost:9000` or `http://host-ip:9000` in your web browser to access the SonarQube web interface. +You can then browse to `http://localhost:9000` or `http://host-ip:9000` in your web browser to access the web interface. ### Database By default, the image will use an embedded H2 database that is not suited for production. -> **Warning:** Only a single instance of SonarQube can connect to a database schema. If you're using a Docker Swarm or Kubernetes, make sure that multiple SonarQube instances are never running on the same database schema simultaneously. This will cause SonarQube to behave unpredictably and data will be corrupted. There is no safeguard until [SONAR-10362](https://jira.sonarsource.com/browse/SONAR-10362). The Data Center Edition has the same limitation in that only one cluster can connect to one database schema at the same time. +> **Warning:** Only a single instance of SonarQube Server or SonarQube Community Build can connect to a database schema. If you're using a Docker Swarm or Kubernetes, make sure that multiple instances are never running on the same database schema simultaneously. This will cause the SonarQube to behave unpredictably and data will be corrupted. There is no safeguard, as described on [SONAR-10362](https://jira.sonarsource.com/browse/SONAR-10362). The SonarQube Server Data Center Edition has the same limitation in that only one cluster can connect to one database schema at the same time. -Set up a database by following the "Installing the Database" section of https://docs.sonarqube.org/latest/setup/install-server/. +Set up a database by following the ["Installing the Database"](https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/install-the-server/installing-the-database/) section. ### Use volumes @@ -76,7 +78,7 @@ For upgrade instructions, see Upgrading from the Docker Image on the [Upgrade th In some environments, it may make more sense to prepare a custom image containing your configuration. A `Dockerfile` to achieve this may be as simple as: ```dockerfile -FROM %%IMAGE%%:10.6-community +FROM %%IMAGE%%:community COPY sonar-custom-plugin-1.0.jar /opt/sonarqube/extensions/ ``` @@ -87,9 +89,9 @@ $ docker build --tag=sonarqube-custom . $ docker run -ti sonarqube-custom ``` -### Avoid hard termination of SonarQube +### Avoid hard termination -A SonarQube instance will stop gracefully, waiting for any tasks in progress to finish. Waiting for in-progress tasks to finish can take a large amount of time which the docker does not expect by default when stopping. To avoid having the SonarQube instance killed by the Docker daemon after 10 seconds, it is best to configure a timeout to stop the container with `--stop-timeout`. For example: +The instance will stop gracefully, waiting for any tasks in progress to finish. Waiting for in-progress tasks to finish can take a large amount of time which the docker does not expect by default when stopping. To avoid having the instance killed by the Docker daemon after 10 seconds, it is best to configure a timeout to stop the container with `--stop-timeout`. For example: ```console docker run --stop-timeout 3600 %%IMAGE%% diff --git a/sonarqube/license.md b/sonarqube/license.md index bc16166651ad..542e24334751 100644 --- a/sonarqube/license.md +++ b/sonarqube/license.md @@ -1 +1 @@ -SonarQube Community Edition is licensed under [GNU Lesser General Public License, Version 3.0](http://www.gnu.org/licenses/lgpl.txt). SonarQube Developer, Enterprise, and Data Center Editions are licensed under [SonarSource Terms and Conditions](https://www.sonarsource.com/docs/sonarsource_terms_and_conditions.pdf). +SonarQube Community Build is licensed under [GNU Lesser General Public License, Version 3.0](http://www.gnu.org/licenses/lgpl.txt). SonarQube Server Developer, Enterprise, and Data Center Editions are licensed under [SonarSource Terms and Condition](https://www.sonarsource.com/docs/sonarsource_terms_and_conditions.pdf). diff --git a/sonarqube/logo.png b/sonarqube/logo.png index c17679b539e35eec213d4d79ab92df66e838e115..ef9dd66d53c9e6e0cc5661b6126bb9009c3cfc6e 100644 GIT binary patch literal 9180 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 literal 5988 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 StJNw10000