mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
add homework 9.3, complete it
This commit is contained in:
@@ -43,3 +43,4 @@
|
|||||||
* [8.5. Тестирование Roles](/src/homework/08-ansible/8.5)
|
* [8.5. Тестирование Roles](/src/homework/08-ansible/8.5)
|
||||||
* [8.6. Создание собственных modules](/src/homework/08-ansible/8.6)
|
* [8.6. Создание собственных modules](/src/homework/08-ansible/8.6)
|
||||||
* [9.1. Жизненный цикл ПО](/src/homework/09-ci/9.1)
|
* [9.1. Жизненный цикл ПО](/src/homework/09-ci/9.1)
|
||||||
|
* [9.3. CI\CD](/src/homework/09-ci/9.3)
|
||||||
|
|||||||
1
src/homework/09-ci/9.3/example/.gitignore
vendored
Normal file
1
src/homework/09-ci/9.3/example/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/.scannerwork/
|
||||||
12
src/homework/09-ci/9.3/example/fail.py
Normal file
12
src/homework/09-ci/9.3/example/fail.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
def increment(index):
|
||||||
|
newIndex = index+1
|
||||||
|
return newIndex
|
||||||
|
def get_square(numb):
|
||||||
|
return numb*numb
|
||||||
|
def print_numb(numb):
|
||||||
|
print("Number is {}".format(numb))
|
||||||
|
|
||||||
|
index = 0
|
||||||
|
while (index < 10):
|
||||||
|
index = increment(index)
|
||||||
|
print(get_square(index))
|
||||||
BIN
src/homework/09-ci/9.3/img/nexus_main.png
Normal file
BIN
src/homework/09-ci/9.3/img/nexus_main.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
BIN
src/homework/09-ci/9.3/img/nexus_maven_upload.png
Normal file
BIN
src/homework/09-ci/9.3/img/nexus_maven_upload.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
BIN
src/homework/09-ci/9.3/img/nexus_maven_upload_success.png
Normal file
BIN
src/homework/09-ci/9.3/img/nexus_maven_upload_success.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
BIN
src/homework/09-ci/9.3/img/sonar_main.png
Normal file
BIN
src/homework/09-ci/9.3/img/sonar_main.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
src/homework/09-ci/9.3/img/sonar_project_analysis.png
Normal file
BIN
src/homework/09-ci/9.3/img/sonar_project_analysis.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
BIN
src/homework/09-ci/9.3/img/sonar_project_analysis_fix.png
Normal file
BIN
src/homework/09-ci/9.3/img/sonar_project_analysis_fix.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
3
src/homework/09-ci/9.3/infrastructure/.gitignore
vendored
Normal file
3
src/homework/09-ci/9.3/infrastructure/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
files/*.pub
|
||||||
|
roles/*
|
||||||
|
inventory/hosts.yml
|
||||||
47
src/homework/09-ci/9.3/infrastructure/files/CentOS-Base.repo
Normal file
47
src/homework/09-ci/9.3/infrastructure/files/CentOS-Base.repo
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# CentOS-Base.repo
|
||||||
|
#
|
||||||
|
# The mirror system uses the connecting IP address of the client and the
|
||||||
|
# update status of each mirror to pick mirrors that are updated to and
|
||||||
|
# geographically close to the client. You should use this for CentOS updates
|
||||||
|
# unless you are manually picking other mirrors.
|
||||||
|
#
|
||||||
|
# If the mirrorlist= does not work for you, as a fall back you can try the
|
||||||
|
# remarked out baseurl= line instead.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
[base]
|
||||||
|
name=CentOS-$releasever - Base
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
exclude=postgresql*
|
||||||
|
|
||||||
|
#released updates
|
||||||
|
[updates]
|
||||||
|
name=CentOS-$releasever - Updates
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
exclude=postgresql*
|
||||||
|
|
||||||
|
#additional packages that may be useful
|
||||||
|
[extras]
|
||||||
|
name=CentOS-$releasever - Extras
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
#additional packages that extend functionality of existing packages
|
||||||
|
[centosplus]
|
||||||
|
name=CentOS-$releasever - Plus
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
enabled=0
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
89
src/homework/09-ci/9.3/infrastructure/files/pg_hba.conf
Normal file
89
src/homework/09-ci/9.3/infrastructure/files/pg_hba.conf
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# PostgreSQL Client Authentication Configuration File
|
||||||
|
# ===================================================
|
||||||
|
#
|
||||||
|
# Refer to the "Client Authentication" section in the PostgreSQL
|
||||||
|
# documentation for a complete description of this file. A short
|
||||||
|
# synopsis follows.
|
||||||
|
#
|
||||||
|
# This file controls: which hosts are allowed to connect, how clients
|
||||||
|
# are authenticated, which PostgreSQL user names they can use, which
|
||||||
|
# databases they can access. Records take one of these forms:
|
||||||
|
#
|
||||||
|
# local DATABASE USER METHOD [OPTIONS]
|
||||||
|
# host DATABASE USER ADDRESS METHOD [OPTIONS]
|
||||||
|
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
|
||||||
|
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
|
||||||
|
#
|
||||||
|
# (The uppercase items must be replaced by actual values.)
|
||||||
|
#
|
||||||
|
# The first field is the connection type: "local" is a Unix-domain
|
||||||
|
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
|
||||||
|
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
|
||||||
|
# plain TCP/IP socket.
|
||||||
|
#
|
||||||
|
# DATABASE can be "all", "sameuser", "samerole", "replication", a
|
||||||
|
# database name, or a comma-separated list thereof. The "all"
|
||||||
|
# keyword does not match "replication". Access to replication
|
||||||
|
# must be enabled in a separate record (see example below).
|
||||||
|
#
|
||||||
|
# USER can be "all", a user name, a group name prefixed with "+", or a
|
||||||
|
# comma-separated list thereof. In both the DATABASE and USER fields
|
||||||
|
# you can also write a file name prefixed with "@" to include names
|
||||||
|
# from a separate file.
|
||||||
|
#
|
||||||
|
# ADDRESS specifies the set of hosts the record matches. It can be a
|
||||||
|
# host name, or it is made up of an IP address and a CIDR mask that is
|
||||||
|
# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that
|
||||||
|
# specifies the number of significant bits in the mask. A host name
|
||||||
|
# that starts with a dot (.) matches a suffix of the actual host name.
|
||||||
|
# Alternatively, you can write an IP address and netmask in separate
|
||||||
|
# columns to specify the set of hosts. Instead of a CIDR-address, you
|
||||||
|
# can write "samehost" to match any of the server's own IP addresses,
|
||||||
|
# or "samenet" to match any address in any subnet that the server is
|
||||||
|
# directly connected to.
|
||||||
|
#
|
||||||
|
# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256",
|
||||||
|
# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert".
|
||||||
|
# Note that "password" sends passwords in clear text; "md5" or
|
||||||
|
# "scram-sha-256" are preferred since they send encrypted passwords.
|
||||||
|
#
|
||||||
|
# OPTIONS are a set of options for the authentication in the format
|
||||||
|
# NAME=VALUE. The available options depend on the different
|
||||||
|
# authentication methods -- refer to the "Client Authentication"
|
||||||
|
# section in the documentation for a list of which options are
|
||||||
|
# available for which authentication methods.
|
||||||
|
#
|
||||||
|
# Database and user names containing spaces, commas, quotes and other
|
||||||
|
# special characters must be quoted. Quoting one of the keywords
|
||||||
|
# "all", "sameuser", "samerole" or "replication" makes the name lose
|
||||||
|
# its special character, and just match a database or username with
|
||||||
|
# that name.
|
||||||
|
#
|
||||||
|
# This file is read on server startup and when the server receives a
|
||||||
|
# SIGHUP signal. If you edit the file on a running system, you have to
|
||||||
|
# SIGHUP the server for the changes to take effect, run "pg_ctl reload",
|
||||||
|
# or execute "SELECT pg_reload_conf()".
|
||||||
|
#
|
||||||
|
# Put your actual configuration here
|
||||||
|
# ----------------------------------
|
||||||
|
#
|
||||||
|
# If you want to allow non-local connections, you need to add more
|
||||||
|
# "host" records. In that case you will also need to make PostgreSQL
|
||||||
|
# listen on a non-local interface via the listen_addresses
|
||||||
|
# configuration parameter, or via the -i or -h command line switches.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# TYPE DATABASE USER ADDRESS METHOD
|
||||||
|
|
||||||
|
# "local" is for Unix domain socket connections only
|
||||||
|
local all all trust
|
||||||
|
# IPv4 local connections:
|
||||||
|
host all all 127.0.0.1/32 md5
|
||||||
|
# IPv6 local connections:
|
||||||
|
host all all ::1/128 md5
|
||||||
|
# Allow replication connections from localhost, by a user with the
|
||||||
|
# replication privilege.
|
||||||
|
local replication all trust
|
||||||
|
host replication all 127.0.0.1/32 md5
|
||||||
|
host replication all ::1/128 md5
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
jdk_url: https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
|
||||||
|
jdk_distr_name: openjdk-11+28_linux-x64_bin.tar.gz
|
||||||
|
jdk_folder: "{{ jdk_distr_name.split('-')[:2] | join('-') }}"
|
||||||
|
java_home: "/opt/jdk/{{ jdk_folder }}"
|
||||||
|
sonarqube_db_name: sonar
|
||||||
|
sonarqube_db_user: sonar
|
||||||
|
sonarqube_db_password: sonar
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
nexus_user_group: nexus
|
||||||
|
nexus_user_name: nexus
|
||||||
|
nexus_directory_data: "/home/{{ nexus_user_name }}/sonatype-work/nexus3"
|
||||||
|
nexus_directory_home: "/home/{{ nexus_user_name }}/nexus"
|
||||||
|
nexus_directory_log: "/home/{{ nexus_user_name }}/log"
|
||||||
|
nexus_directory_package: "/home/{{ nexus_user_name }}/pkg"
|
||||||
|
nexus_directory_tmp: "/home/{{ nexus_user_name }}/tmp"
|
||||||
|
nexus_version: 3.14.0-04
|
||||||
|
nexus_download_url: https://download.sonatype.com/nexus/3
|
||||||
|
nexus_service_enabled: true
|
||||||
|
nexus_ulimit: 65536
|
||||||
|
nexus_context_path: /
|
||||||
|
nexus_host: 0.0.0.0
|
||||||
|
nexus_port: 8081
|
||||||
|
nexus_port_check_timeout: 600
|
||||||
|
nexus_edition: nexus-oss-edition
|
||||||
|
nexus_features: nexus-oss-feature
|
||||||
|
nexus_java_heap_size: 1200M
|
||||||
|
nexus_java_max_direct_memory: 2G
|
||||||
|
nexus_service_start_on_boot: true
|
||||||
|
nexus_configuration_disk_free_space_limit: ~
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
postgresql_version: 11
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
sonar_version: 9.1.0.47736
|
||||||
|
sonar_download_url: "https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-{{ sonar_version }}.zip"
|
||||||
|
sonar_version_directory: "sonarqube-{{ sonar_version }}"
|
||||||
|
sonar_db_port: "5432"
|
||||||
|
sonar_web_context: ''
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
all:
|
||||||
|
hosts:
|
||||||
|
sonar-01:
|
||||||
|
ansible_host: <somehost2>
|
||||||
|
nexus-01:
|
||||||
|
ansible_host: <somehost>
|
||||||
|
children:
|
||||||
|
sonarqube:
|
||||||
|
hosts:
|
||||||
|
sonar-01:
|
||||||
|
nexus:
|
||||||
|
hosts:
|
||||||
|
nexus-01:
|
||||||
|
postgres:
|
||||||
|
hosts:
|
||||||
|
sonar-01:
|
||||||
|
vars:
|
||||||
|
ansible_connection_type: paramiko
|
||||||
|
ansible_user: <someuser>
|
||||||
382
src/homework/09-ci/9.3/infrastructure/site.yml
Normal file
382
src/homework/09-ci/9.3/infrastructure/site.yml
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
---
|
||||||
|
- name: Get OpenJDK installed
|
||||||
|
hosts: sonarqube
|
||||||
|
pre_tasks:
|
||||||
|
- name: install unzip
|
||||||
|
become: true
|
||||||
|
yum:
|
||||||
|
name: unzip
|
||||||
|
state: present
|
||||||
|
tasks:
|
||||||
|
- name: Upload .tar.gz file conaining binaries from remote storage
|
||||||
|
get_url:
|
||||||
|
url: "{{ jdk_url }}"
|
||||||
|
dest: "/tmp/jdk-{{ jdk_distr_name }}"
|
||||||
|
mode: 0755
|
||||||
|
register: download_java_remote_binaries
|
||||||
|
until: download_java_remote_binaries is succeeded
|
||||||
|
|
||||||
|
- name: Ensure installation dir exists
|
||||||
|
become: true
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
path: "{{ java_home }}"
|
||||||
|
mode: 0755
|
||||||
|
|
||||||
|
- name: Extract java in the installation directory
|
||||||
|
become: true
|
||||||
|
unarchive:
|
||||||
|
copy: false
|
||||||
|
src: "/tmp/jdk-{{ jdk_distr_name }}"
|
||||||
|
dest: "{{ java_home }}"
|
||||||
|
extra_opts: [--strip-components=1]
|
||||||
|
creates: "{{ java_home }}/bin/java"
|
||||||
|
|
||||||
|
- name: Export environment variables
|
||||||
|
become: true
|
||||||
|
template:
|
||||||
|
src: jdk.sh.j2
|
||||||
|
dest: /etc/profile.d/jdk.sh
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0644
|
||||||
|
|
||||||
|
- name: Get PostgreSQL installed
|
||||||
|
hosts: postgres
|
||||||
|
become: true
|
||||||
|
tasks:
|
||||||
|
- name: Change repo file
|
||||||
|
copy:
|
||||||
|
src: CentOS-Base.repo
|
||||||
|
dest: /etc/yum.repos.d/CentOS-Base.repo
|
||||||
|
mode: 0644
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
|
||||||
|
- name: Install PostgreSQL repos
|
||||||
|
yum:
|
||||||
|
name: https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
|
||||||
|
state: present
|
||||||
|
validate_certs: false
|
||||||
|
|
||||||
|
- name: Install PostgreSQL
|
||||||
|
yum:
|
||||||
|
name: "postgresql{{ postgresql_version }}-server"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Init template1 DB
|
||||||
|
command: /usr/pgsql-11/bin/postgresql-11-setup initdb
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Start pgsql service
|
||||||
|
systemd:
|
||||||
|
name: "postgresql-{{ postgresql_version }}"
|
||||||
|
state: started
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
- name: Create user in system
|
||||||
|
user:
|
||||||
|
name: "{{ sonarqube_db_user }}"
|
||||||
|
- name: Create user for Sonar in PostgreSQL
|
||||||
|
become_user: postgres
|
||||||
|
command: "createuser -s -e {{ sonarqube_db_user }}"
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Change password for Sonar user in PostgreSQL
|
||||||
|
become_user: postgres
|
||||||
|
command: "psql -c \"ALTER USER sonar WITH ENCRYPTED password '{{ sonarqube_db_password }}';\""
|
||||||
|
|
||||||
|
- name: Create Sonar DB
|
||||||
|
become_user: postgres
|
||||||
|
command: "createdb {{ sonarqube_db_name }}"
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Copy pg_hba.conf
|
||||||
|
copy:
|
||||||
|
src: pg_hba.conf
|
||||||
|
dest: /var/lib/pgsql/11/data/pg_hba.conf
|
||||||
|
mode: 0600
|
||||||
|
owner: postgres
|
||||||
|
group: postgres
|
||||||
|
|
||||||
|
- name: Prepare Sonar host
|
||||||
|
hosts: sonarqube
|
||||||
|
become: true
|
||||||
|
tasks:
|
||||||
|
- name: Create group in system
|
||||||
|
group:
|
||||||
|
name: "{{ sonarqube_db_user }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Create user in system
|
||||||
|
user:
|
||||||
|
name: "{{ sonarqube_db_user }}"
|
||||||
|
group: "{{ sonarqube_db_user }}"
|
||||||
|
|
||||||
|
- name: "Set up ssh key to access for managed node"
|
||||||
|
authorized_key:
|
||||||
|
user: "{{ sonarqube_db_user }}"
|
||||||
|
state: present
|
||||||
|
key: "{{ lookup('file', 'id_rsa.pub') }}"
|
||||||
|
|
||||||
|
- name: "Allow group to have passwordless sudo"
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/sudoers
|
||||||
|
state: present
|
||||||
|
regexp: '^%{{ sonarqube_db_user }}'
|
||||||
|
line: '%{{ sonarqube_db_user }} ALL=(ALL) NOPASSWD: ALL'
|
||||||
|
validate: 'visudo -cf %s'
|
||||||
|
|
||||||
|
- name: Increase Virtual Memory
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/sysctl.conf
|
||||||
|
state: present
|
||||||
|
regexp: '^vm.max_map_count'
|
||||||
|
line: 'vm.max_map_count=262144'
|
||||||
|
- name: Reboot VM
|
||||||
|
reboot:
|
||||||
|
|
||||||
|
- name: Get Sonarqube installed
|
||||||
|
hosts: sonarqube
|
||||||
|
vars:
|
||||||
|
ansible_user: "{{ sonarqube_db_user }}"
|
||||||
|
tasks:
|
||||||
|
- name: Get distrib ZIP
|
||||||
|
get_url:
|
||||||
|
url: "{{ sonar_download_url }}"
|
||||||
|
dest: "/tmp/{{ sonar_version_directory }}.zip"
|
||||||
|
validate_certs: false
|
||||||
|
|
||||||
|
- name: Unzip Sonar
|
||||||
|
become: true
|
||||||
|
unarchive:
|
||||||
|
src: "/tmp/{{ sonar_version_directory }}.zip"
|
||||||
|
dest: /usr/local/
|
||||||
|
copy: false
|
||||||
|
owner: "{{ sonarqube_db_user }}"
|
||||||
|
group: "{{ sonarqube_db_user }}"
|
||||||
|
creates: /usr/local/sonar/COPYING
|
||||||
|
|
||||||
|
- name: Move Sonar into place.
|
||||||
|
become: true
|
||||||
|
copy:
|
||||||
|
src: /usr/local/{{ sonar_version_directory }}/
|
||||||
|
dest: /usr/local/sonar/
|
||||||
|
owner: "{{ sonarqube_db_user }}"
|
||||||
|
group: "{{ sonarqube_db_user }}"
|
||||||
|
remote_src: true
|
||||||
|
|
||||||
|
- name: Configure SonarQube JDBC settings for PostgreSQL.
|
||||||
|
lineinfile:
|
||||||
|
dest: /usr/local/sonar/conf/sonar.properties
|
||||||
|
regexp: "{{ item.regexp }}"
|
||||||
|
line: "{{ item.line }}"
|
||||||
|
with_items:
|
||||||
|
- regexp: "^sonar.jdbc.username"
|
||||||
|
line: "sonar.jdbc.username={{ sonarqube_db_user }}"
|
||||||
|
- regexp: "^sonar.jdbc.password"
|
||||||
|
line: "sonar.jdbc.password={{ sonarqube_db_password }}"
|
||||||
|
- regexp: "^sonar.jdbc.url"
|
||||||
|
line: "sonar.jdbc.url=jdbc:postgresql://localhost:{{ sonar_db_port }}/{{ sonarqube_db_name }}?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance"
|
||||||
|
- regexp: "^sonar.web.context"
|
||||||
|
line: "sonar.web.context={{ sonar_web_context }}"
|
||||||
|
|
||||||
|
- name: Generate wrapper.conf
|
||||||
|
template:
|
||||||
|
src: wrapper.conf.j2
|
||||||
|
dest: /usr/local/sonar/conf/wrapper.conf
|
||||||
|
mode: 0644
|
||||||
|
|
||||||
|
- name: Symlink sonar bin.
|
||||||
|
become: true
|
||||||
|
file:
|
||||||
|
src: /usr/local/sonar/bin/linux-x86-64/sonar.sh
|
||||||
|
dest: /usr/bin/sonar
|
||||||
|
state: link
|
||||||
|
register: sonar_symlink
|
||||||
|
|
||||||
|
- name: Copy SonarQube systemd unit file into place (for systemd systems).
|
||||||
|
become: true
|
||||||
|
template:
|
||||||
|
src: sonar.unit.j2
|
||||||
|
dest: /etc/systemd/system/sonar.service
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
|
||||||
|
- name: Ensure Sonar is running and set to start on boot.
|
||||||
|
become: true
|
||||||
|
service:
|
||||||
|
name: sonar
|
||||||
|
state: restarted
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
- name: Allow Sonar time to build on first start.
|
||||||
|
pause:
|
||||||
|
seconds: 180
|
||||||
|
when: sonar_symlink.changed
|
||||||
|
tags: ['skip_ansible_lint']
|
||||||
|
|
||||||
|
- name: Make sure Sonar is responding on the configured port.
|
||||||
|
wait_for:
|
||||||
|
port: 9000
|
||||||
|
delay: 3
|
||||||
|
timeout: 300
|
||||||
|
- name: Get Nexus installed
|
||||||
|
hosts: nexus
|
||||||
|
pre_tasks:
|
||||||
|
- name: Create Nexus group
|
||||||
|
become: true
|
||||||
|
group:
|
||||||
|
name: "{{ nexus_user_group }}"
|
||||||
|
state: present
|
||||||
|
- name: Create Nexus user
|
||||||
|
become: true
|
||||||
|
user:
|
||||||
|
name: "{{ nexus_user_name }}"
|
||||||
|
- name: Install JDK
|
||||||
|
become: true
|
||||||
|
package:
|
||||||
|
name: [java-1.8.0-openjdk, java-1.8.0-openjdk-devel]
|
||||||
|
state: present
|
||||||
|
tasks:
|
||||||
|
- name: Create Nexus directories
|
||||||
|
become: true
|
||||||
|
file:
|
||||||
|
group: "{{ nexus_user_group }}"
|
||||||
|
owner: "{{ nexus_user_name }}"
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
with_items:
|
||||||
|
- "{{ nexus_directory_log }}"
|
||||||
|
- "{{ nexus_directory_data }}"
|
||||||
|
- "{{ nexus_directory_data }}/etc"
|
||||||
|
- "{{ nexus_directory_package }}"
|
||||||
|
- "{{ nexus_directory_tmp }}"
|
||||||
|
|
||||||
|
- name: Download Nexus
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
get_url:
|
||||||
|
dest: "{{ nexus_directory_package }}/nexus-{{ nexus_version }}.tar.gz"
|
||||||
|
url: "{{ nexus_download_url }}/nexus-{{ nexus_version }}-unix.tar.gz"
|
||||||
|
validate_certs: false
|
||||||
|
|
||||||
|
- name: Unpack Nexus
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
unarchive:
|
||||||
|
copy: no
|
||||||
|
creates: "{{ nexus_directory_package }}/nexus-{{ nexus_version }}"
|
||||||
|
dest: "{{ nexus_directory_package }}"
|
||||||
|
src: "{{ nexus_directory_package }}/nexus-{{ nexus_version }}.tar.gz"
|
||||||
|
|
||||||
|
- name: Link to Nexus Directory
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
file:
|
||||||
|
dest: "{{ nexus_directory_home }}"
|
||||||
|
src: "{{ nexus_directory_package }}/nexus-{{ nexus_version }}"
|
||||||
|
state: link
|
||||||
|
|
||||||
|
- name: Add NEXUS_HOME for Nexus user
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
lineinfile:
|
||||||
|
create: yes
|
||||||
|
dest: "/home/{{ nexus_user_name }}/.bashrc"
|
||||||
|
insertafter: EOF
|
||||||
|
line: "export NEXUS_HOME={{ nexus_directory_home }}"
|
||||||
|
|
||||||
|
- name: Add run_as_user to Nexus.rc
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
lineinfile:
|
||||||
|
create: yes
|
||||||
|
dest: "{{ nexus_directory_home }}/bin/nexus.rc"
|
||||||
|
insertafter: EOF
|
||||||
|
line: "run_as_user=\"{{ nexus_user_name }}\""
|
||||||
|
regexp: "^run_as_user"
|
||||||
|
|
||||||
|
- name: Raise nofile limit for Nexus user
|
||||||
|
become: true
|
||||||
|
pam_limits:
|
||||||
|
domain: "{{ nexus_user_name }}"
|
||||||
|
limit_type: "-"
|
||||||
|
limit_item: nofile
|
||||||
|
value: "{{ nexus_ulimit }}"
|
||||||
|
|
||||||
|
- name: Create Nexus service for SystemD
|
||||||
|
become: true
|
||||||
|
template:
|
||||||
|
dest: /lib/systemd/system/nexus.service
|
||||||
|
mode: 0644
|
||||||
|
src: nexus.systemd.j2
|
||||||
|
|
||||||
|
- name: Ensure Nexus service is enabled for SystemD
|
||||||
|
become: true
|
||||||
|
systemd:
|
||||||
|
daemon_reload: yes
|
||||||
|
enabled: yes
|
||||||
|
name: nexus
|
||||||
|
when:
|
||||||
|
- nexus_service_enabled
|
||||||
|
|
||||||
|
- name: Create Nexus vmoptions
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
template:
|
||||||
|
dest: "{{ nexus_directory_home }}/bin/nexus.vmoptions"
|
||||||
|
src: nexus.vmoptions.j2
|
||||||
|
register: nexus_config_changed
|
||||||
|
|
||||||
|
- name: Create Nexus properties
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
template:
|
||||||
|
dest: "{{ nexus_directory_data }}/etc/nexus.properties"
|
||||||
|
src: nexus.properties.j2
|
||||||
|
register: nexus_config_changed
|
||||||
|
|
||||||
|
- name: Lower Nexus disk space threshold
|
||||||
|
become: true
|
||||||
|
become_user: "{{ nexus_user_name }}"
|
||||||
|
lineinfile:
|
||||||
|
backrefs: yes
|
||||||
|
dest: "{{ nexus_directory_home }}/etc/karaf/system.properties"
|
||||||
|
insertafter: EOF
|
||||||
|
line: "storage.diskCache.diskFreeSpaceLimit={{ nexus_configuration_disk_free_space_limit }}"
|
||||||
|
regexp: ^storage\.diskCache\.diskFreeSpaceLimit
|
||||||
|
when: nexus_configuration_disk_free_space_limit is not none
|
||||||
|
register: nexus_config_changed
|
||||||
|
|
||||||
|
- name: Start Nexus service if enabled
|
||||||
|
become: true
|
||||||
|
service:
|
||||||
|
enabled: yes
|
||||||
|
name: nexus
|
||||||
|
state: started
|
||||||
|
when:
|
||||||
|
- nexus_service_start_on_boot
|
||||||
|
- not nexus_config_changed.changed
|
||||||
|
tags:
|
||||||
|
- skip_ansible_lint
|
||||||
|
|
||||||
|
- name: Ensure Nexus service is restarted
|
||||||
|
become: true
|
||||||
|
service:
|
||||||
|
name: nexus
|
||||||
|
state: restarted
|
||||||
|
when:
|
||||||
|
- nexus_service_start_on_boot
|
||||||
|
- nexus_config_changed.changed
|
||||||
|
tags:
|
||||||
|
- skip_ansible_lint
|
||||||
|
|
||||||
|
- name: Wait for Nexus port if started
|
||||||
|
wait_for:
|
||||||
|
port: "{{ nexus_port }}"
|
||||||
|
state: started
|
||||||
|
timeout: "{{ nexus_port_check_timeout }}"
|
||||||
|
when:
|
||||||
|
- nexus_service_start_on_boot
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Warning: This file is Ansible Managed, manual changes will be overwritten on next playbook run.
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
export JAVA_HOME={{ java_home }}
|
||||||
|
export PATH=$PATH:$JAVA_HOME/bin
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
# Jetty section
|
||||||
|
application-host={{ nexus_host }}
|
||||||
|
application-port={{ nexus_port }}
|
||||||
|
nexus-context-path={{ nexus_context_path }}
|
||||||
|
|
||||||
|
# Nexus section
|
||||||
|
nexus-edition={{ nexus_edition }}
|
||||||
|
nexus-features=\
|
||||||
|
{{ nexus_features }}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=nexus service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
User={{ nexus_user_name }}
|
||||||
|
Group={{ nexus_user_group }}
|
||||||
|
LimitNOFILE={{ nexus_ulimit }}
|
||||||
|
ExecStart={{ nexus_directory_home }}/bin/nexus start
|
||||||
|
ExecStop={{ nexus_directory_home }}/bin/nexus stop
|
||||||
|
Restart=on-abort
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
-Xms{{ nexus_java_heap_size }}
|
||||||
|
-Xmx{{ nexus_java_heap_size }}
|
||||||
|
-XX:MaxDirectMemorySize={{ nexus_java_max_direct_memory }}
|
||||||
|
-XX:+UnlockDiagnosticVMOptions
|
||||||
|
-XX:+UnsyncloadClass
|
||||||
|
-XX:+LogVMOutput
|
||||||
|
-XX:LogFile={{ nexus_directory_log }}/jvm.log
|
||||||
|
-XX:-OmitStackTraceInFastThrow
|
||||||
|
-Djava.net.preferIPv4Stack=true
|
||||||
|
-Dkaraf.home=.
|
||||||
|
-Dkaraf.base=.
|
||||||
|
-Dkaraf.etc=etc/karaf
|
||||||
|
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
|
||||||
|
-Dkaraf.data={{ nexus_directory_data }}
|
||||||
|
-Djava.io.tmpdir={{ nexus_directory_tmp }}
|
||||||
|
-Dkaraf.startLocalConsole=false
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SonarQube
|
||||||
|
After=network.target network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
LimitNOFILE=131072
|
||||||
|
LimitNPROC=8192
|
||||||
|
User={{ sonarqube_db_user }}
|
||||||
|
Group={{ sonarqube_db_user }}
|
||||||
|
ExecStart=/usr/bin/sonar start
|
||||||
|
ExecStop=/usr/bin/sonar stop
|
||||||
|
ExecReload=/usr/bin/sonar restart
|
||||||
|
PIDFile=/usr/local/sonar/bin/linux-x86-64/./SonarQube.pid
|
||||||
|
Type=simple
|
||||||
|
PermissionsStartOnly=true
|
||||||
|
TimeoutStartSec=5
|
||||||
|
Restart=always
|
||||||
|
SuccessExitStatus=143
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# Path to JVM executable. By default it must be available in PATH.
|
||||||
|
# Can be an absolute path, for example:
|
||||||
|
wrapper.java.command={{ java_home }}/bin/java
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# DO NOT EDIT THE FOLLOWING SECTIONS
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
#********************************************************************
|
||||||
|
# Wrapper Java
|
||||||
|
#********************************************************************
|
||||||
|
wrapper.java.additional.1=-Dsonar.wrapped=true
|
||||||
|
wrapper.java.additional.2=-Djava.awt.headless=true
|
||||||
|
# extra args needed by hazelcast
|
||||||
|
wrapper.java.additional.3=--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
|
||||||
|
wrapper.java.additional.4=--add-opens=java.base/java.lang=ALL-UNNAMED
|
||||||
|
wrapper.java.additional.5=--add-opens=java.base/java.nio=ALL-UNNAMED
|
||||||
|
wrapper.java.additional.6=--add-opens=java.base/sun.nio.ch=ALL-UNNAMED
|
||||||
|
wrapper.java.additional.7=--add-opens=java.management/sun.management=ALL-UNNAMED
|
||||||
|
wrapper.java.additional.8=--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
|
||||||
|
|
||||||
|
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
|
||||||
|
wrapper.java.classpath.1=../../lib/sonar-application-9.1.0.47736.jar
|
||||||
|
wrapper.java.classpath.2=../../lib/jsw/wrapper-3.2.3.jar
|
||||||
|
wrapper.java.classpath.3=../../lib/sonar-shutdowner-9.1.0.47736.jar
|
||||||
|
wrapper.java.library.path.1=./lib
|
||||||
|
wrapper.app.parameter.1=org.sonar.application.App
|
||||||
|
wrapper.java.initmemory=8
|
||||||
|
wrapper.java.maxmemory=32
|
||||||
|
|
||||||
|
#********************************************************************
|
||||||
|
# Wrapper Logs
|
||||||
|
#********************************************************************
|
||||||
|
|
||||||
|
wrapper.console.format=PM
|
||||||
|
wrapper.console.loglevel=INFO
|
||||||
|
wrapper.logfile.format=M
|
||||||
|
wrapper.logfile.loglevel=INFO
|
||||||
|
wrapper.logfile.rollmode=DATE
|
||||||
|
wrapper.logfile=../../logs/sonar.YYYYMMDD.log
|
||||||
|
|
||||||
|
# Maximum size that the log file will be allowed to grow to before
|
||||||
|
# the log is rolled. Size is specified in bytes. The default value
|
||||||
|
# of 0, disables log rolling. May abbreviate with the 'k' (kb) or
|
||||||
|
# 'm' (mb) suffix. For example: 10m = 10 megabytes.
|
||||||
|
#wrapper.logfile.maxsize=0
|
||||||
|
|
||||||
|
# Maximum number of rolled log files which will be allowed before old
|
||||||
|
# files are deleted. The default value of 0 implies no limit.
|
||||||
|
wrapper.logfile.maxfiles=7
|
||||||
|
|
||||||
|
# Log Level for sys/event log output. (See docs for log levels)
|
||||||
|
wrapper.syslog.loglevel=NONE
|
||||||
|
|
||||||
|
#********************************************************************
|
||||||
|
# Wrapper Windows Properties
|
||||||
|
#********************************************************************
|
||||||
|
# Title to use when running as a console
|
||||||
|
wrapper.console.title=SonarQube
|
||||||
|
|
||||||
|
# Disallow start of multiple instances of an application at the same time on Windows
|
||||||
|
wrapper.single_invocation=true
|
||||||
|
|
||||||
|
#********************************************************************
|
||||||
|
# Wrapper Windows NT/2000/XP Service Properties
|
||||||
|
#********************************************************************
|
||||||
|
# WARNING - Do not modify any of these properties when an application
|
||||||
|
# using this configuration file has been installed as a service.
|
||||||
|
# Please uninstall the service before modifying this section. The
|
||||||
|
# service can then be reinstalled.
|
||||||
|
|
||||||
|
# Name of the service
|
||||||
|
wrapper.ntservice.name=SonarQube
|
||||||
|
|
||||||
|
# Display name of the service
|
||||||
|
wrapper.ntservice.displayname=SonarQube
|
||||||
|
|
||||||
|
# Description of the service
|
||||||
|
wrapper.ntservice.description=SonarQube
|
||||||
|
|
||||||
|
# Service dependencies. Add dependencies as needed starting from 1
|
||||||
|
wrapper.ntservice.dependency.1=
|
||||||
|
|
||||||
|
# Mode in which the service is installed. AUTO_START or DEMAND_START
|
||||||
|
wrapper.ntservice.starttype=AUTO_START
|
||||||
|
|
||||||
|
# Allow the service to interact with the desktop.
|
||||||
|
wrapper.ntservice.interactive=false
|
||||||
|
|
||||||
|
#********************************************************************
|
||||||
|
# Forking Properties
|
||||||
|
#********************************************************************
|
||||||
|
wrapper.disable_restarts=TRUE
|
||||||
|
wrapper.ping.timeout=0
|
||||||
|
wrapper.shutdown.timeout=0
|
||||||
|
wrapper.jvm_exit.timeout=0
|
||||||
1
src/homework/09-ci/9.3/mvn/.gitignore
vendored
Normal file
1
src/homework/09-ci/9.3/mvn/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/target/
|
||||||
27
src/homework/09-ci/9.3/mvn/pom.xml
Normal file
27
src/homework/09-ci/9.3/mvn/pom.xml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<project
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.netology.app</groupId>
|
||||||
|
<artifactId>simple-app</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>my-repo</id>
|
||||||
|
<name>maven-releases</name>
|
||||||
|
<url>http://localhost:8081/repository/maven-releases/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>netology</groupId>
|
||||||
|
<artifactId>java</artifactId>
|
||||||
|
<version>8_282</version>
|
||||||
|
<classifier>distrib</classifier>
|
||||||
|
<type>tar.gz</type>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
240
src/homework/09-ci/9.3/readme.md
Normal file
240
src/homework/09-ci/9.3/readme.md
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
Выполнение [домашнего задания](https://github.com/netology-code/mnt-homeworks/blob/MNT-13/09-ci-03-cicd/README.md)
|
||||||
|
по теме "9.3. CI\CD".
|
||||||
|
|
||||||
|
## Q/A
|
||||||
|
|
||||||
|
### Задание 1
|
||||||
|
|
||||||
|
> Подготовка к выполнению
|
||||||
|
> 1. Создаём 2 VM в yandex cloud со следующими параметрами: 2CPU 4RAM Centos7(остальное по минимальным требованиям)
|
||||||
|
> 2. Прописываем в [inventory](./infrastructure/inventory/hosts.yml) [playbook'a](./infrastructure/site.yml) созданные хосты
|
||||||
|
> 3. Добавляем в [files](./infrastructure/files/) файл со своим публичным ключом (id_rsa.pub). Если ключ называется иначе - найдите таску в плейбуке, которая использует id_rsa.pub имя и исправьте на своё
|
||||||
|
> 4. Запускаем playbook, ожидаем успешного завершения
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ansible-playbook -i inventory/hosts.yml site.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```text
|
||||||
|
<...>
|
||||||
|
PLAY RECAP *****************************************************************************************************************
|
||||||
|
nexus-01 : ok=17 changed=15 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
|
||||||
|
sonar-01 : ok=35 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||||||
|
```
|
||||||
|
|
||||||
|
> 5. Проверяем готовность Sonarqube через [браузер](http://localhost:9000)
|
||||||
|
> 6. Заходим под admin\admin, меняем пароль на свой
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 7. Проверяем готовность Nexus через [бразуер](http://localhost:8081)
|
||||||
|
> 8. Подключаемся под admin\admin123, меняем пароль, сохраняем анонимный доступ
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Задание 2
|
||||||
|
|
||||||
|
> Знакомство с SonarQube
|
||||||
|
|
||||||
|
> 1. Создаём новый проект, название произвольное
|
||||||
|
> 2. Скачиваем пакет sonar-scanner, который нам предлагает скачать сам sonarqube
|
||||||
|
|
||||||
|
Для скачивания пакета актуальной версии на текущий момент:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip -o sonar-scanner-cli-4.7.0.2747-linux.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
Затем нужно распаковать архив в любую директорию:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
unzip sonar-scanner-cli-4.7.0.2747-linux.zip -d ~/.local/share/
|
||||||
|
```
|
||||||
|
|
||||||
|
Внутри распакованной директории будет находиться директория `bin`, которую и нужно добавить в `$PATH`.
|
||||||
|
|
||||||
|
> 3. Делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ)
|
||||||
|
> 4. Проверяем `sonar-scanner --version`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sonar-scanner --version
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
INFO: Scanner configuration file: ~/.local/share/sonar-scanner/conf/sonar-scanner.properties
|
||||||
|
INFO: Project root configuration file: NONE
|
||||||
|
INFO: SonarScanner 4.7.0.2747
|
||||||
|
INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit)
|
||||||
|
INFO: Linux 5.10.102.1-microsoft-standard-WSL2 amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
> 5. Запускаем анализатор против кода из директории [example](./example) с дополнительным ключом `-Dsonar.coverage.exclusions=fail.py`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sonar-scanner \
|
||||||
|
-Dsonar.projectKey=sao \
|
||||||
|
-Dsonar.sources=. \
|
||||||
|
-Dsonar.host.url=http://<sonar-01>:9000 \
|
||||||
|
-Dsonar.login=<token> \
|
||||||
|
-Dsonar.coverage.exclusions=fail.py
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
<...>
|
||||||
|
INFO: ------------------------------------------------------------------------
|
||||||
|
INFO: EXECUTION SUCCESS
|
||||||
|
INFO: ------------------------------------------------------------------------
|
||||||
|
INFO: Total time: 34.848s
|
||||||
|
INFO: Final Memory: 8M/37M
|
||||||
|
INFO: ------------------------------------------------------------------------
|
||||||
|
```
|
||||||
|
|
||||||
|
> 6. Смотрим результат в интерфейсе
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 7. Исправляем ошибки, которые он выявил(включая warnings)
|
||||||
|
|
||||||
|
Исправляем функцию, чтобы она выглядела следующим образом:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def increment(index):
|
||||||
|
newIndex = index+1
|
||||||
|
return newIndex
|
||||||
|
```
|
||||||
|
|
||||||
|
И убираем из функции `print_numb` конструкцию `pass`.
|
||||||
|
|
||||||
|
> 8. Запускаем анализатор повторно - проверяем, что QG пройдены успешно
|
||||||
|
> 9. Делаем скриншот успешного прохождения анализа, прикладываем к решению ДЗ
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Задание 3
|
||||||
|
|
||||||
|
> Знакомство с Nexus
|
||||||
|
> 1. В репозиторий `maven-releases` загружаем артефакт с GAV параметрами:
|
||||||
|
> 1. groupId: netology
|
||||||
|
> 2. artifactId: java
|
||||||
|
> 3. version: 8_282
|
||||||
|
> 4. classifier: distrib
|
||||||
|
> 5. type: tar.gz
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 2. В него же загружаем такой же артефакт, но с version: 8_102
|
||||||
|
> 3. Проверяем, что все файлы загрузились успешно
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 4. В ответе присылаем файл `maven-metadata.xml` для этого артефекта
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<metadata modelVersion="1.1.0">
|
||||||
|
<groupId>netology</groupId>
|
||||||
|
<artifactId>java</artifactId>
|
||||||
|
<versioning>
|
||||||
|
<latest>8_282</latest>
|
||||||
|
<release>8_282</release>
|
||||||
|
<versions>
|
||||||
|
<version>8_102</version>
|
||||||
|
<version>8_282</version>
|
||||||
|
</versions>
|
||||||
|
<lastUpdated>20220824033600</lastUpdated>
|
||||||
|
</versioning>
|
||||||
|
</metadata>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Задание 4
|
||||||
|
|
||||||
|
> Знакомство с Maven
|
||||||
|
>
|
||||||
|
> Подготовка к выполнению
|
||||||
|
> 1. Скачиваем дистрибутив с [maven](https://maven.apache.org/download.cgi)
|
||||||
|
> 2. Разархивируем, делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ)
|
||||||
|
|
||||||
|
Делать нужно по аналогии с `sonar-scanner` из [Задания 2](#задание-2)
|
||||||
|
|
||||||
|
> 3. Удаляем из `apache-maven-<version>/conf/settings.xml` упоминание о правиле, отвергающем http соединение( раздел `mirrors->id`: `my-repository-http-blocker`)
|
||||||
|
> 4. Проверяем `mvn --version`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mvn --version
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
|
||||||
|
Maven home: ~/downloads/apache-maven-3.8.6
|
||||||
|
Java version: 11.0.16, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
|
||||||
|
Default locale: en, platform encoding: UTF-8
|
||||||
|
OS name: "linux", version: "5.10.102.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"
|
||||||
|
```
|
||||||
|
|
||||||
|
> 5. Забираем директорию [mvn](./mvn) с pom
|
||||||
|
|
||||||
|
> Основная часть
|
||||||
|
> 1. Меняем в `pom.xml` блок с зависимостями под наш артефакт из первого пункта задания для Nexus (java с версией 8_282)
|
||||||
|
> 2. Запускаем команду `mvn package` в директории с `pom.xml`, ожидаем успешного окончания
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mvn package
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
[INFO] Building jar: ./mvn/target/simple-app-1.0-SNAPSHOT.jar
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] BUILD SUCCESS
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] Total time: 29.857 s
|
||||||
|
[INFO] Finished at: 2022-08-24T10:51:41+07:00
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
```
|
||||||
|
|
||||||
|
> 3. Проверяем директорию `~/.m2/repository/`, находим наш артефакт
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ls -la ~/.m2/repository/netology/java/8_282
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
total 24
|
||||||
|
drwxr-xr-x 2 dannc dannc 4096 Aug 24 10:51 .
|
||||||
|
drwxr-xr-x 3 dannc dannc 4096 Aug 24 10:51 ..
|
||||||
|
-rw-r--r-- 1 dannc dannc 176 Aug 24 10:51 _remote.repositories
|
||||||
|
-rw-r--r-- 1 dannc dannc 258 Aug 24 10:51 java-8_282-distrib.tar.gz
|
||||||
|
-rw-r--r-- 1 dannc dannc 40 Aug 24 10:51 java-8_282-distrib.tar.gz.sha1
|
||||||
|
-rw-r--r-- 1 dannc dannc 397 Aug 24 10:51 java-8_282.pom.lastUpdated
|
||||||
|
```
|
||||||
|
|
||||||
|
> 4. В ответе присылаем исправленный файл `pom.xml`
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<project
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.netology.app</groupId>
|
||||||
|
<artifactId>simple-app</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>my-repo</id>
|
||||||
|
<name>maven-releases</name>
|
||||||
|
<url>http://nexus-01:8081/repository/maven-releases/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>netology</groupId>
|
||||||
|
<artifactId>java</artifactId>
|
||||||
|
<version>8_282</version>
|
||||||
|
<classifier>distrib</classifier>
|
||||||
|
<type>tar.gz</type>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user