{"id":7733,"date":"2017-09-24T13:16:49","date_gmt":"2017-09-24T11:16:49","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=7733"},"modified":"2023-11-07T23:32:03","modified_gmt":"2023-11-07T22:32:03","slug":"continuous-code-quality-for-plsql-with-docker","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/","title":{"rendered":"Continuous Code Quality for PL\/SQL with Docker"},"content":{"rendered":"\n<p>In this blog post, I show step-by-step how to set up a continuous code quality inspection environment for a PL\/SQL project hosted on GitHub. I&#8217;m going to use a Docker container for SonarQube and another container for Jenkins.<\/p>\n\n\n\n<p>Here is the table of contents of the major steps.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#install_docker\">Install Docker<\/a><\/li>\n\n\n\n<li><a href=\"#create_sonarqube_and_jenkins_container\">Create SonarQube and Jenkins Container<\/a><\/li>\n\n\n\n<li><a href=\"#install_plsql_cop_for_sonarqube\">Install PL\/SQL Cop for SonarQube<\/a><\/li>\n\n\n\n<li><a href=\"#install_plsql_cop\">Install PL\/SQL Cop (Command Line Utility)<\/a><\/li>\n\n\n\n<li><a href=\"#configure_sonarqube\">Configure SonarQube<\/a><\/li>\n\n\n\n<li><a href=\"#configure_jenkins\">Configure Jenkins<\/a><\/li>\n\n\n\n<li><a href=\"#create_code_analysis_job\">Create Code Analysis Job<\/a><\/li>\n\n\n\n<li><a href=\"#view_result_in_sonarqube\">View the Result in SonarQube<\/a><\/li>\n\n\n\n<li><a href=\"#summary\">Summary<\/a><\/li>\n<\/ol>\n\n\n\n<p>In the summary of this post, you find an audio-less video completing the process within 3.5 minutes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"install_docker\"><\/a>1. Install Docker<\/h2>\n\n\n\n<p>I&#8217;m assuming that you already have installed Docker on your machine. If not, download and install the free <a href=\"https:\/\/www.docker.com\/community-edition\">Docker Community Edition<\/a>&nbsp;including <a href=\"https:\/\/docs.docker.com\/compose\/install\/#install-compose\">Docker Compose<\/a>. I&#8217;m going to use <a href=\"https:\/\/docs.docker.com\/docker-for-mac\/install\/\">Docker for Mac<\/a>. But you may use <a href=\"https:\/\/docs.docker.com\/docker-for-windows\/install\/\">Docker for Windows<\/a> or a <a href=\"https:\/\/docs.docker.com\/engine\/installation\/#server\">Docker server<\/a> for one of the various supported Linux distributions. It is also possible to use a cloud provider, but the installation procedure will differ slightly.<\/p>\n\n\n\n<p>You are ready for the next steps when the command<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker run --rm hello-world\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">run<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">--rm<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">hello-world<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>produces this output<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"Hello from Docker!\nThis message shows that your installation appears to be working correctly.\n\nTo generate this message, Docker took the following steps:\n1. The Docker client contacted the Docker daemon.\n2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.\n3. The Docker daemon created a new container from that image which runs the\n   executable that produces the output you are currently reading.\n4. The Docker daemon streamed that output to the Docker client, which sent it\n   to your terminal.\n\nTo try something more ambitious, you can run an Ubuntu container with:\n $ docker run -it ubuntu bash\n\nShare images, automate workflows, and more with a free Docker ID:\n https:\/\/cloud.docker.com\/\n\nFor more examples and ideas, visit:\n https:\/\/docs.docker.com\/engine\/userguide\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Hello from Docker!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">This message shows that your installation appears to be working correctly.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">To generate this message, Docker took the following steps:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">1. The Docker client contacted the Docker daemon.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">3. The Docker daemon created a new container from that image which runs the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   executable that produces the output you are currently reading.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">4. The Docker daemon streamed that output to the Docker client, which sent it<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   to your terminal.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">To try something more ambitious, you can run an Ubuntu container with:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> $ docker run -it ubuntu bash<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Share images, automate workflows, and more with a free Docker ID:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> https:\/\/cloud.docker.com\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">For more examples and ideas, visit:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> https:\/\/docs.docker.com\/engine\/userguide\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>in your terminal window.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"create_sonarqube_and_jenkins_container\"><\/a>2. Create SonarQube and Jenkins Container<\/h2>\n\n\n\n<p>In this step, we create a container for SonarQube and another one for Jenkins. Jenkins will need to communicate with SonarQube. Docker Compose allows us to use hostnames instead of hard-coded IP addresses and to manage all involved containers together in a single YAML configuration file.<\/p>\n\n\n\n<p>Create a &#8220;docker-compose.yml&#8221; file in a &#8220;plsqlcop&#8221; directory. The directory name is used to derive names for containers and volumes. In this case, the volumes will be named &#8220;plsqlcop_sonardata&#8221; and &#8220;plsqlcop_cidata&#8221;. For the container names, the default naming has been overridden.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">plsqlcop\/docker-compose.yml<\/span><span role=\"button\" tabindex=\"0\" data-code=\"version: &quot;3.0&quot;\nservices:\n   sonar:\n      image: &quot;sonarqube:5.1.2&quot;\n      container_name: &quot;sonar&quot;\n      environment:\n         - SONARQUBE_JDBC_USERNAME=sonar\n         - SONARQUBE_JDBC_PASSWORD=sonar\n         - SONARQUBE_JDBC_URL=\n      ports:\n         - &quot;9010:9000&quot;\n      volumes:\n         - &quot;sonardata:\/opt\/sonarqube\/data&quot;\n   ci:\n      image: &quot;jenkins\/jenkins:2.79&quot;\n      container_name: &quot;ci&quot;\n      ports:\n         - &quot;9020:8080&quot;\n      volumes:\n         - &quot;cidata:\/var\/jenkins_home&quot;\nvolumes:\n   sonardata:\n      external: false\n   cidata:\n      external: false\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">version<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;3.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">services<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">sonar<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">image<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;sonarqube:5.1.2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">container_name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;sonar&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">environment<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">SONARQUBE_JDBC_USERNAME=sonar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">SONARQUBE_JDBC_PASSWORD=sonar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">SONARQUBE_JDBC_URL=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">ports<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">&quot;9010:9000&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">volumes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">&quot;sonardata:\/opt\/sonarqube\/data&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">ci<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">image<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;jenkins\/jenkins:2.79&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">container_name<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;ci&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">ports<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">&quot;9020:8080&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">volumes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         - <\/span><span style=\"color: #CE9178\">&quot;cidata:\/var\/jenkins_home&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">volumes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">sonardata<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">external<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">cidata<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">external<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">false<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Make sure you are located in the directory where the &#8220;docker-compose.yml&#8221; file is stored. Then create the containers in the background by running<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker-compose up -d\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker-compose<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">up<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-d<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>You should get an output similar to the following:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"Creating volume &quot;plsqlcop_sonardata&quot; with default driver\nCreating volume &quot;plsqlcop_cidata&quot; with default driver\nCreating ci ... \nCreating sonar ... \nCreating sonar\nCreating sonar ... done\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Creating volume &quot;plsqlcop_sonardata&quot; with default driver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Creating volume &quot;plsqlcop_cidata&quot; with default driver<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Creating ci ... <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Creating sonar ... <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Creating sonar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Creating sonar ... done<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"install_plsql_cop_for_sonarqube\"><\/a>3. Install PL\/SQL Cop for SonarQube<\/h2>\n\n\n\n<p>To install the current version of PL\/SQL Cop for SonarQube within the &#8220;sonar&#8221; container run<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker exec sonar wget --no-check-certificate https:\/\/www.salvis.com\/blog?ddownload=6822 -O \\\n\/opt\/sonarqube\/extensions\/plugins\/sonar-plsql-cop-plugin-2.1.1.jar\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">sonar<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">wget<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">--no-check-certificate<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">https:\/\/www.salvis.com\/blog?ddownload=<\/span><span style=\"color: #B5CEA8\">6822<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-O<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/opt\/sonarqube\/extensions\/plugins\/sonar-plsql-cop-plugin-2.1.1.jar<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Windows users please note, that the \\ (backslash) at the end of the first line is just the Unix line-continuation character (as the ` (grave accent) in PowerShell), you should omit it. The wget command will be executed within the sonar container.<\/p>\n\n\n\n<p>To load the plugin we need to restart the container.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker restart sonar\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">restart<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">sonar<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"install_plsql_cop\"><\/a>4. Install PL\/SQL Cop (Command Line Utility)<\/h2>\n\n\n\n<p>To install the current version of PL\/SQL Cop within the &#8220;ci&#8221; container run<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker exec -u 0 ci wget --no-check-certificate https:\/\/www.salvis.com\/blog\/?ddownload=6680 -O \/opt\/tvdcc.zip\ndocker exec -u 0 ci unzip \/opt\/tvdcc.zip -d \/opt \ndocker exec -u 0 ci bash -c &quot;mv \/opt\/tvdcc-* \/opt\/tvdcc&quot;  \ndocker exec -u 0 ci rm \/opt\/tvdcc.zip\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-u<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">ci<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">wget<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">--no-check-certificate<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">https:\/\/www.salvis.com\/blog\/?ddownload=<\/span><span style=\"color: #B5CEA8\">6680<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-O<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">\/opt\/tvdcc.zip<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-u<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">ci<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">unzip<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">\/opt\/tvdcc.zip<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-d<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">\/opt<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-u<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">ci<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">bash<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-c<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;mv \/opt\/tvdcc-* \/opt\/tvdcc&quot;<\/span><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-u<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">ci<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">rm<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">\/opt\/tvdcc.zip<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Why do we need to install this component in the &#8220;ci&#8221; container and not in the &#8220;sonar&#8221; container? Well, the SonarQube scanner is executed in the &#8220;ci&#8221; container and gets the code analyzer from the SonarQube server. This increases the scalability of the code analyzers since just the analysis reports need to be sent to the SonarQube server. However, the PL\/SQL Cop SonarQube plugin is a wrapper to the command line utility. This means that every Jenkins agent needs to have PL\/SQL Cop installed in the location configured on the SonarQube server.<\/p>\n\n\n\n<p>In an environment with multiple servers and multiple Jenkins agents, the PL\/SQL Cop installations need to be identical on every agent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"configure_sonarqube\"><\/a>5. Configure SonarQube<\/h2>\n\n\n\n<p>Open &#8220;http:\/\/localhost:9010&#8221; in your web browser.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01.png\" alt=\"\" class=\"wp-image-7759\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-01-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Press &#8220;Log in&#8221; in the upper right corner and login into SonarQube with the username &#8220;admin&#8221; and password &#8220;admin&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"276\" height=\"216\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02.png\" alt=\"\" class=\"wp-image-7760\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02.png 276w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02-187x146.png 187w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02-50x39.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-02-96x75.png 96w\" sizes=\"auto, (max-width:767px) 276px, 276px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Settings&#8221; and the Category &#8220;Trivadis PL\/SQL Cop&#8221; and change the &#8220;Path to PL\/SQL Cop command line tvdcc executable&#8221; to &#8220;\/opt\/tvdcc\/tvdcc.sh&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1365\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03.png\" alt=\"\" class=\"wp-image-7761\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03-225x300.png 225w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03-768x1024.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03-110x146.png 110w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03-38x50.png 38w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-03-56x75.png 56w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Press &#8220;Save Trivadis PL\/SQL Cop Settings&#8221; and your done.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"configure_jenkins\"><\/a>6. Configure Jenkins<\/h2>\n\n\n\n<p>Open &#8220;http:\/\/localhost:9020&#8221; in your web browser.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01.png\" alt=\"\" class=\"wp-image-7766\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-01-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Jenkins generated during the container creation a password for the user admin. To get this password execute in a terminal window the following:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker exec ci cat \/var\/jenkins_home\/secrets\/initialAdminPassword\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">docker<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">exec<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">ci<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">cat<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">\/var\/jenkins_home\/secrets\/initialAdminPassword<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Copy the output into the clipboard and paste it into the &#8220;Administrator password&#8221; field in the browser window and press &#8220;Continue&#8221;.<\/p>\n\n\n\n<p>Press on &#8220;Install Suggested Plugins&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02.png\" alt=\"\" class=\"wp-image-7767\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-02-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Wait until all plugins are installed.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03.png\" alt=\"\" class=\"wp-image-7768\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-03-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Enter the requested fields and press &#8220;Save and Finish&#8221;. And on the next page Click on &#8220;Start Using Jenkins&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04.png\" alt=\"\" class=\"wp-image-7769\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-04-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Mange Jenkins&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12.png\" alt=\"\" class=\"wp-image-7777\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-12-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Manage Plugins&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09.png\" alt=\"\" class=\"wp-image-7775\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-09-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Select &#8220;SonarQube Scanner for Jenkins&#8221; in the &#8220;Available&#8221; tab. Use the filter to find the entry. Press &#8220;Install without restart&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10.png\" alt=\"\" class=\"wp-image-7774\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-10-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Go back to top page&#8221; when the plugins have been installed successfully.<\/p>\n\n\n\n<p>Click on &#8220;Manage Jenkins&#8221; (again) and then on &#8220;Global Tool Configuration&#8221;.<\/p>\n\n\n\n<p>Within the Global Tool Configuration click on &#8220;Add SonarQube Scanner&#8221;, add a name for the scanner and press &#8220;Save&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15.png\" alt=\"\" class=\"wp-image-7780\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-15-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Configure System&#8221;.<\/p>\n\n\n\n<p>Scroll down to the &#8220;SonarQube servers&#8221; section and click on &#8220;Add SonarQube&#8221;.<\/p>\n\n\n\n<p>Enter &#8220;SonarQube 5.1.2&#8221; for name, enter &#8220;http:\/\/sonar:9000&#8221; for &#8220;Server URL&#8221;, select &#8220;5.1 or lower&#8221; in &#8220;Server version&#8221; and enter &#8220;jdbc:h2:tcp:\/\/sonar\/sonar&#8221; for &#8220;Database URL&#8221;. Click on &#8220;Save&#8221; to complete the Jenkins configuration.<\/p>\n\n\n\n<p>Please note, that we are accessing the host sonar via the internal network Docker Compose has set up for us. Therefore we have to use the default port 9000 and not port 9010 which we are using from outside, e.g. to access SonarQube in the web browser.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1176\" height=\"1680\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19.png\" alt=\"\" class=\"wp-image-7790\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19.png 1176w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-210x300.png 210w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-768x1097.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-717x1024.png 717w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-102x146.png 102w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-35x50.png 35w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-19-53x75.png 53w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1176px) 100vw, 1176px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"create_code_analysis_job\"><\/a>7. Create Code Analysis Job<\/h2>\n\n\n\n<p>Click on &#8220;create new jobs&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20.png\" alt=\"\" class=\"wp-image-7792\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-20-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Enter &#8220;plscope-utils&#8221; and click on &#8220;Freestyle project&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21.png\" alt=\"\" class=\"wp-image-7794\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-21-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on the &#8220;Source Code Management&#8221; tab, select &#8220;Git&#8221;, enter &#8220;https:\/\/github.com\/PhilippSalvisberg\/plscope-utils&#8221; for &#8220;Repository URL&#8221;, add &#8220;Sparse Checkout paths&#8221; in &#8220;Additional Behaviours&#8221;, enter &#8220;database\/utils&#8221; for &#8220;Paths&#8221; and click on &#8220;Apply&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22.png\" alt=\"\" class=\"wp-image-7793\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-22-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Build Triggers&#8221; tab, select &#8220;Poll SCM&#8221;. Enter &#8220;H\/15 * * * *&#8221; for &#8220;Schedule&#8221; and press &#8220;Apply&#8221;. This will look for changes in the Git repository every 15 minutes and starts a build if a change is detected.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23.png\" alt=\"\" class=\"wp-image-7795\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-23-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Build&#8221; tab and Scroll down to the Build section and add a &#8220;Execute SonarQube Scanner&#8221; build step.<\/p>\n\n\n\n<p>Copy the following lines into the &#8220;Analysis properties&#8221;.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"sonar.projectKey=plscope-utils:main\nsonar.projectName=plscope-utils\nsonar.projectVersion=0.5.0\nsonar.sources=database\nsonar.language=plsqlcop\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">sonar.projectKey<\/span><span style=\"color: #D4D4D4\">=plscope-utils:main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">sonar.projectName<\/span><span style=\"color: #D4D4D4\">=plscope-utils<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">sonar.projectVersion<\/span><span style=\"color: #D4D4D4\">=0.5.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">sonar.sources<\/span><span style=\"color: #D4D4D4\">=database<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">sonar.language<\/span><span style=\"color: #D4D4D4\">=plsqlcop<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>and click on &#8220;Save&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25.png\" alt=\"\" class=\"wp-image-7797\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-25-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Wait until the initial build is started or click on &#8220;Build Now&#8221; and then on &#8220;#1&#8221; (the first build job in the Build History).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26.png\" alt=\"\" class=\"wp-image-7798\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-26-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;Console Output&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27.png\" alt=\"\" class=\"wp-image-7799\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-27-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The analysis result has been stored successfully in SonarQube and can now be queried via http:\/\/localhost:9010 .<\/p>\n\n\n\n<p>Please note, that the link to SonarQube provided in the console output is not working, since it is referring a port of the internal Docker Compose network which is not accessible to your browser. However, it is possible to configure the external IP address and port for SonarQube in Jenkins and than this link will work.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1143\" height=\"3465\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28.png\" alt=\"\" class=\"wp-image-7800\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28.png 1143w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-99x300.png 99w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-768x2328.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-338x1024.png 338w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-48x146.png 48w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-16x50.png 16w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/ci-28-25x75.png 25w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1143px) 100vw, 1143px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"view_result_in_sonarqube\"><\/a>8. View the Result in SonarQube<\/h2>\n\n\n\n<p>Open &#8220;http:\/\/localhost:9010&#8221; in your web browser.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04.png\" alt=\"\" class=\"wp-image-7815\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-04-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;plscope-utils&#8221;, &nbsp;select the &#8220;Issues&#8221; tab for this project and select all rules.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05.png\" alt=\"\" class=\"wp-image-7820\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-05-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Click on &#8220;&gt;&#8221; at the right side of an issue to see the source code line causing this issue.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png\" alt=\"\" class=\"wp-image-7818\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06-100x75.png 100w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>See&nbsp;<a href=\"https:\/\/www.sonarqube.org\/features\/clean-code\/\">https:\/\/www.sonarqube.org\/features\/clean-code\/<\/a> for more information.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"summary\"><\/a>9. Summary<\/h2>\n\n\n\n<p>Setting up a continuous code quality inspection environment for a PL\/SQL project with Docker is quite simple. The audio-less video documents the complete process.<\/p>\n\n\n\n<p>Granted, for production use, you need to use a different database as SonarQube backbone, define some roles, manage users and probably integrate an Active Directory. That should not be too difficult, at least not technically.<\/p>\n\n\n\n<p>But the most challenging part will be to agree on some rules, adapt your development process and improve your code quality over time. So, let&#8217;s get started.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/Continuous_Code_Quality_for_PLSQL_with_Docker.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>In this blog post, I show step-by-step how to set up a continuous code quality inspection environment for a PL\/SQL project hosted on GitHub. I&#8217;m going to use a Docker container for SonarQube and another container for Jenkins. Here is the table of contents of the major steps. In the summary of<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":7818,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[86,99,101,13,92,91],"class_list":["post-7733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-code-analysis","tag-docker","tag-jenkins","tag-plsql","tag-plsql-cop","tag-sonarqube"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Continuous Code Quality for PL\/SQL with Docker - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuous Code Quality for PL\/SQL with Docker - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this blog post, I show step-by-step how to set up a continuous code quality inspection environment for a PL\/SQL project hosted on GitHub. I&#8217;m going to use a Docker container for SonarQube and another container for Jenkins. Here is the table of contents of the major steps. In the summary of [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-24T11:16:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-07T22:32:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Continuous Code Quality for PL\\\/SQL with Docker\",\"datePublished\":\"2017-09-24T11:16:49+00:00\",\"dateModified\":\"2023-11-07T22:32:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/\"},\"wordCount\":1214,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/09\\\/sonar-06.png\",\"keywords\":[\"Code Analysis\",\"Docker\",\"Jenkins\",\"PL\\\/SQL\",\"PL\\\/SQL Cop\",\"SonarQube\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/\",\"name\":\"Continuous Code Quality for PL\\\/SQL with Docker - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/09\\\/sonar-06.png\",\"datePublished\":\"2017-09-24T11:16:49+00:00\",\"dateModified\":\"2023-11-07T22:32:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/09\\\/sonar-06.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/09\\\/sonar-06.png\",\"width\":1024,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/09\\\/24\\\/continuous-code-quality-for-plsql-with-docker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuous Code Quality for PL\\\/SQL with Docker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Continuous Code Quality for PL\/SQL with Docker - Philipp Salvisberg&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/","og_locale":"en_US","og_type":"article","og_title":"Continuous Code Quality for PL\/SQL with Docker - Philipp Salvisberg&#039;s Blog","og_description":"In this blog post, I show step-by-step how to set up a continuous code quality inspection environment for a PL\/SQL project hosted on GitHub. I&#8217;m going to use a Docker container for SonarQube and another container for Jenkins. Here is the table of contents of the major steps. In the summary of [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2017-09-24T11:16:49+00:00","article_modified_time":"2023-11-07T22:32:03+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Continuous Code Quality for PL\/SQL with Docker","datePublished":"2017-09-24T11:16:49+00:00","dateModified":"2023-11-07T22:32:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/"},"wordCount":1214,"commentCount":0,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png","keywords":["Code Analysis","Docker","Jenkins","PL\/SQL","PL\/SQL Cop","SonarQube"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/","url":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/","name":"Continuous Code Quality for PL\/SQL with Docker - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png","datePublished":"2017-09-24T11:16:49+00:00","dateModified":"2023-11-07T22:32:03+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/09\/sonar-06.png","width":1024,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2017\/09\/24\/continuous-code-quality-for-plsql-with-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuous Code Quality for PL\/SQL with Docker"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=7733"}],"version-history":[{"count":78,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7733\/revisions"}],"predecessor-version":[{"id":12611,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/7733\/revisions\/12611"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/7818"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=7733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=7733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=7733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}