{"id":365317,"date":"2024-05-21T02:35:35","date_gmt":"2024-05-21T02:35:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=365317"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:35:35","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=365317","title":{"rendered":"<span>AgileOps: Jira-\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>Intro<\/h3>\n<p>\u0411\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u044f \u0441\u0432\u043e\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438, Jira \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u043e\u043f\u0440\u0435\u043a\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0444\u0442\u0430.<\/p>\n<p>\u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u0445 Dev \u0438 Ops \u2013 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Cost Center (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043e\u0445\u043e\u0434\u044b \u043d\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 Agile \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d (stakeholders).<\/p>\n<p>\u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 JiraOps \u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u0435\u0435 IssueTrackingOps \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c GitOps.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u043f\u043e\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u043c, DEV, OPS, SEC, QA \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f Jira, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<hr\/>\n<h3>Jira Server<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Jira Data Center \u2013 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441 \u0442\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Jira.<br \/> \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c docker-compose.yml:<\/p>\n<pre><code>version: '3.7'  services:   node:     image: atlassian\/jira-software:latest     ports:      - 9099:8080     volumes:       - .\/jira-home-node1:\/var\/atlassian\/application-data\/jira:Z     ulimits:       nproc: 65535       nofile:         soft: 65535         hard: 65535    database:     image: postgres:10.5-alpine     volumes:       - .\/postgresql-data:\/var\/lib\/postgresql\/data:Z       - .\/postgre-db-init.sql:\/docker-entrypoint-initdb.d\/postgre-db-init.sql:Z     ports:      - 5432:5432     environment:       POSTGRES_PASSWORD: 1234 <\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Jira Server:<\/p>\n<pre><code>docker-compose up -d <\/code><\/pre>\n<p>Jira UI \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 http:\/\/&lt;IP_ADDRESS>:9099<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043a\u043b\u0438\u043a\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0432\u0438\u0437\u0430\u0440\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/3db\/3a4\/2d7\/3db3a42d7c8e5439afbf74a504432e05.jpg\" alt=\"jira_setup\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3db\/3a4\/2d7\/3db3a42d7c8e5439afbf74a504432e05.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>jira_setup<\/figcaption><\/div>\n<\/figure>\n<hr\/>\n<h3>CLI<\/h3>\n<p>\u0423 Jira \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 API \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f Python \u0438 Jira.<br \/> \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 CI\/CD \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c go-jira (<a href=\"https:\/\/github.com\/go-jira\/jira\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/go-jira\/jira<\/a>), \u0430 \u0434\u043b\u044f BI \u0438 ad-hoc \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 Python \u0438 SQL.<\/p>\n<p>Go-jira \u044d\u0442\u043e \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API Jira \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0432 CI\/CD \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Go-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2013 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c jira issues \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 OpenJDK:<br \/> main.go:<\/p>\n<pre><code class=\"go\">package main  import ( \"fmt\" \"github.com\/andygrunwald\/go-jira\" )  func main() { jiraClient, _ := jira.NewClient(nil, \"https:\/\/bugs.openjdk.org\")  jql := \"project = JDK and status = Open ORDER BY updated ASC\"  issues, resp, err := jiraClient.Issue.Search(jql, nil) if err != nil { fmt.Println(err) panic(resp.StatusCode) }  for _, issue := range issues { fmt.Printf(\"%s: %+v\\n\", issue.Key, issue.Fields.Summary) } } <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c issues \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 OpenJDK:<\/p>\n<pre><code>go run main.go | head -10  JDK-4158929: 8 bit Dithering problem in SwingSet HTML Text tab. JDK-4184200: Color profiles for screen device should be used when available. JDK-4199882: splotchy highlight at 24 bit True Color JDK-4345973: Add set\/get methods for boolean datatype in ParameterBlock JDK-4148927: Input method highlighting needs to handle highlight segments JDK-4102920: 12x: Multi-font caching scheme inadequate for non-Latin text JDK-4387892: swing components show all black @ 16-bit depth (VNC on Linux) JDK-4398379: java.awt.image.DataBufferShort constructor should verify size of array JDK-4398381: java.awt.image.DataBufferShort should check for negative size JDK-4396157: Merlin: Consonant RA Rule R2 doesn't hold true with Lucida font <\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u044f CLI \u0441 Jira \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 Git:<\/p>\n<pre><code>jira mine  +--------+------------+-------+----------+--------+----------+--------------+--------------+ | Issue  |  Summary   | Type  | Priority | Status |   Age    |   Reporter   |   Assignee   | +--------+------------+-------+----------+--------+----------+--------------+--------------+ | JIRA-1 | Jira-1     | Story | Medium   | To Do  | an hour  | Anton Krylov | Anton Krylov | | JIRA-2 | Demo Issue | Bug   | Medium   | To Do  | a minute | Anton Krylov | Anton Krylov | +--------+------------+-------+----------+--------+----------+--------------+--------------+ <\/code><\/pre>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f Jira:<\/p>\n<pre><code>mkdir ~\/.jira.d  cat &lt;&lt;EOM >~\/.jira.d\/config.yml endpoint: https:\/\/jira.mycompany.com EOM <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>config.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">config:   stop: true password-source: stdin endpoint: http:\/\/&lt;IP>:9099 user: &lt;user> login: &lt;login>  project: JIRA  queries:   todo: >-     resolution = unresolved {{if .project}}AND project = '{{.project}}'{{end}} AND status = 'To Do'  custom-commands:   - name: env     help: print the JIRA environment variables available to custom commands     script: |-       env | sort | grep JIRA   - name: print-project     help: print the name of the configured project     script: \"echo $JIRA_PROJECT\"   - name: jira-path     help: print the path the jira command that is running this alias     script: |-       echo {{jira}}   - name: mine     help: display issues assigned to me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND assignee=currentuser() ORDER BY status, issue\"   - name: mine-created     help: display issues created by me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND creator=currentuser() ORDER BY created\"   - name: watching     help: display issues watched by me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND watcher=currentuser() ORDER BY created\"     script: |-       if [ -n \"$JIRA_PROJECT\" ]; then           # if `project: ...` configured just list the issues for current project           {{jira}} list --template table --query \"resolution = unresolved and assignee=currentuser() and project = $JIRA_PROJECT ORDER BY priority asc, created\"       else           # otherwise list issues for all project           {{jira}} list --template table --query \"resolution = unresolved and assignee=currentuser() ORDER BY priority asc, created\"       fi   - name: sprint     help: display issues for active sprint     script: |-       if [ -n \"$JIRA_PROJECT\" ]; then           # if `project: ...` configured just list the issues for current project           {{jira}} list --template table --query \"sprint in openSprints() and type != epic and resolution = unresolved and project=$JIRA_PROJECT ORDER BY rank asc, created\"       else           # otherwise list issues for all project           {{jira}} list --template table --query \"sprint in openSprints() and type != epic and resolution = unresolved ORDER BY rank asc, created\"       fi <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u0444\u0438\u0433\u0435 <code>password-source: stdin<\/code> \u0442\u043e \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f jira \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>export JIRA_PASSWORD='&lt;PASSWORD>\\n' echo $JIRA_PASSWORD| jira ls <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 <code>password-source: pass<\/code> \u0442\u043e jira \u00ab\u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u00bb \u0435\u0433\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>jira mine \u044d\u0442\u043e <code>custom-command<\/code> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 jira issues \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<br \/> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 api \u0438 jql \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 jira.<\/p>\n<pre><code class=\"yaml\">  - name: mine     help: display issues assigned to me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND assignee=currentuser() ORDER BY status, issue\" <\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043a issues \u0438\u0437 Bash:<\/p>\n<pre><code>jira attach create JIRA-1 exec.zip  OK 10000 http:\/\/109.207.172.67:9099\/secure\/attachment\/10000\/exec.zip <\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c Bash-\u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code>for i in exec1.zip exec2.zip exec3.zip exec4.zip; do jira attach create JIRA-1 $i; done  OK 10003 http:\/\/109.207.172.67:9099\/secure\/attachment\/10003\/exec1.zip OK 10004 http:\/\/109.207.172.67:9099\/secure\/attachment\/10004\/exec2.zip OK 10005 http:\/\/109.207.172.67:9099\/secure\/attachment\/10005\/exec3.zip OK 10006 http:\/\/109.207.172.67:9099\/secure\/attachment\/10006\/exec4.zip <\/code><\/pre>\n<p>\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code>jira attach list JIRA-1  +-------+-----------+---------+--------------+-----------+ |  id   | filename  |  bytes  |     user     |  created  | +-------+-----------+---------+--------------+-----------+ | 10000 | exec.zip  | 4209783 | Anton Krylov | 5 minutes | | 10001 | exec.zip  | 4209783 | Anton Krylov | 3 minutes | | 10002 | exec.zip  | 4209783 | Anton Krylov | 3 minutes | | 10003 | exec1.zip | 4209783 | Anton Krylov | a minute  | | 10004 | exec2.zip | 4209783 | Anton Krylov | a minute  | | 10005 | exec3.zip | 4209783 | Anton Krylov | a minute  | | 10006 | exec4.zip | 4209783 | Anton Krylov | a minute  | +--- <\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u0438\u043f\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubernetes.<\/p>\n<p>\u0412\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<pre><code>make -f mkcerts.mk root-ca  generating root-key.pem generating root-cert.csr generating root-cert.pem Certificate request self-signature ok subject=O=Istio, CN=Root CA <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0418\u0411:<\/p>\n<pre><code>jira attach create JIRA-1 kube_certs.tar  OK 10007 http:\/\/109.207.172.67:9099\/secure\/attachment\/10007\/kube_certs.tar <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/7c0\/cbb\/b3a\/7c0cbbb3a8fa0a7a6937198899da81c5.jpg\" alt=\"kube-certs\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7c0\/cbb\/b3a\/7c0cbbb3a8fa0a7a6937198899da81c5.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>kube-certs<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c SSH-\u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0434\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u043b\u044e\u0447\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 Jira: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/168\/d35\/8e1\/168d358e1076c72ee60df3cdd5632423.jpg\" alt=\"ssh-key\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/168\/d35\/8e1\/168d358e1076c72ee60df3cdd5632423.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>ssh-key<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 YAML-\u0448\u0430\u0431\u043b\u043e\u043d, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 Git: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/6b4\/f2a\/48c\/6b4f2a48cbe5ea85df80cbd3b6d0c8bd.jpg\" alt=\"ssh-key-template\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6b4\/f2a\/48c\/6b4f2a48cbe5ea85df80cbd3b6d0c8bd.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>ssh-key-template<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0439 \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka:<\/p>\n<pre><code>bash genkeys.sh <\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code>tree . \u251c\u2500\u2500 broker-ca-signed.crt \u251c\u2500\u2500 broker.csr \u251c\u2500\u2500 broker_keystore_creds \u251c\u2500\u2500 broker_sslkey_creds \u251c\u2500\u2500 broker_truststore_creds \u251c\u2500\u2500 consumer-ca-signed.crt \u251c\u2500\u2500 consumer.csr \u251c\u2500\u2500 consumer_keystore_creds \u251c\u2500\u2500 consumer_sslkey_creds \u251c\u2500\u2500 consumer_truststore_creds \u251c\u2500\u2500 genkeys.sh \u251c\u2500\u2500 jcerts-kafka-ca-key.pem \u251c\u2500\u2500 jcerts-kafka-ca.pem \u251c\u2500\u2500 jcerts-kafka-ca.srl \u251c\u2500\u2500 kafka.broker.keystore.cer.pem \u251c\u2500\u2500 kafka.broker.keystore.jks \u251c\u2500\u2500 kafka.broker.keystore.key.pem \u251c\u2500\u2500 kafka.broker.keystore.p12 \u251c\u2500\u2500 kafka.broker.truststore.jks \u251c\u2500\u2500 kafka.consumer.keystore.cer.pem \u251c\u2500\u2500 kafka.consumer.keystore.jks \u251c\u2500\u2500 kafka.consumer.keystore.key.pem \u251c\u2500\u2500 kafka.consumer.keystore.p12 \u251c\u2500\u2500 kafka.consumer.truststore.jks \u251c\u2500\u2500 kafka.producer.keystore.cer.pem \u251c\u2500\u2500 kafka.producer.keystore.jks \u251c\u2500\u2500 kafka.producer.keystore.key.pem \u251c\u2500\u2500 kafka.producer.keystore.p12 \u251c\u2500\u2500 kafka.producer.truststore.jks \u251c\u2500\u2500 producer-ca-signed.crt \u251c\u2500\u2500 producer.csr \u251c\u2500\u2500 producer_keystore_creds \u251c\u2500\u2500 producer_sslkey_creds \u2514\u2500\u2500 producer_truststore_creds <\/code><\/pre>\n<p>\u0418 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043a \u0437\u0430\u0434\u0430\u0447\u0435:<\/p>\n<pre><code>find . -print0 | tar -cvf kafka_certs.tar --null -T -  jira attach create JIRA-2 kafka_certs.tar  OK 10100 http:\/\/109.207.172.67:9099\/secure\/attachment\/10100\/kafka_certs.tar <\/code><\/pre>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e-\u0431\u044b \u044d\u0442\u043e \u0432\u0441\u0435 \u00ab\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0432 Docker, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 Git \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 CI:<\/p>\n<p>Dockerfile:<\/p>\n<pre><code>ARG JIRA_PROJECT ENV JIRA_PASSWORD=JIRA_PROJECT  RUN apt-get update &amp;&amp; apt-get -y install golang RUN go install github.com\/go-jira\/jira\/cmd\/jira@latest RUN ln -s ~\/go\/bin\/jira \/usr\/local\/bin\/jira COPY config.yml ~\/.jira.d\/config.yml  COPY gencerts.sh gencerts.sh RUN bash gencerts.sh RUN jira attach create INFRA kafka_certs.tar <\/code><\/pre>\n<p>\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 Git \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c\u044e CI:<\/p>\n<pre><code>docker build . --build-arg='JIRA_PROJECT=INFRA' <\/code><\/pre>\n<hr\/>\n<h3>GUI<\/h3>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e GUI \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f Jira.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u0432 \u0441\u0442\u0430\u0442\u0443\u0441 \u00abDeprecated\u00bb, \u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Jira:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/95e\/9ac\/344\/95e9ac344b719ab34c02e2bac8a8d2c4.jpg\" alt=\"GUI1\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/95e\/9ac\/344\/95e9ac344b719ab34c02e2bac8a8d2c4.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>GUI1<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/f05\/9ef\/df4\/f059efdf4b046f437ff6aa74c17211bf.jpg\" alt=\"GUI2\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f05\/9ef\/df4\/f059efdf4b046f437ff6aa74c17211bf.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>GUI2<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/p>\n<ul>\n<li>\n<p>\u0411\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0443\u0442\u044c \u043a Web-UI Jira.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443, \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>End<\/h3>\n<p>PS. \u0415\u0441\u043b\u0438 \u043d\u0430\u0431\u0435\u0440\u0435\u0442\u0441\u044f 50 \u043b\u0430\u0439\u043a\u043e\u0432, \u0442\u043e \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0432\u0442\u043e\u0440\u0443\u044e, \u0447\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 BI \u0434\u043b\u044f Jira, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0445\u043b\u043e\u043f\u043e\u0442 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0430 Groovy.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/786444\/\"> https:\/\/habr.com\/ru\/articles\/786444\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>Intro<\/h3>\n<p>\u0411\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u044f \u0441\u0432\u043e\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438, Jira \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u043e\u043f\u0440\u0435\u043a\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0444\u0442\u0430.<\/p>\n<p>\u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u0445 Dev \u0438 Ops \u2013 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Cost Center (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043e\u0445\u043e\u0434\u044b \u043d\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 Agile \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d (stakeholders).<\/p>\n<p>\u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 JiraOps \u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u0435\u0435 IssueTrackingOps \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c GitOps.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u043f\u043e\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u043c, DEV, OPS, SEC, QA \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f Jira, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<hr\/>\n<h3>Jira Server<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Jira Data Center \u2013 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441 \u0442\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Jira.<br \/> \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c docker-compose.yml:<\/p>\n<pre><code>version: '3.7'  services:   node:     image: atlassian\/jira-software:latest     ports:      - 9099:8080     volumes:       - .\/jira-home-node1:\/var\/atlassian\/application-data\/jira:Z     ulimits:       nproc: 65535       nofile:         soft: 65535         hard: 65535    database:     image: postgres:10.5-alpine     volumes:       - .\/postgresql-data:\/var\/lib\/postgresql\/data:Z       - .\/postgre-db-init.sql:\/docker-entrypoint-initdb.d\/postgre-db-init.sql:Z     ports:      - 5432:5432     environment:       POSTGRES_PASSWORD: 1234 <\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Jira Server:<\/p>\n<pre><code>docker-compose up -d <\/code><\/pre>\n<p>Jira UI \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 http:\/\/&lt;IP_ADDRESS>:9099<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043a\u043b\u0438\u043a\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0432\u0438\u0437\u0430\u0440\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"\">\n<div><figcaption>jira_setup<\/figcaption><\/div>\n<\/figure>\n<hr\/>\n<h3>CLI<\/h3>\n<p>\u0423 Jira \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 API \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f Python \u0438 Jira.<br \/> \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 CI\/CD \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c go-jira (<a href=\"https:\/\/github.com\/go-jira\/jira\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/go-jira\/jira<\/a>), \u0430 \u0434\u043b\u044f BI \u0438 ad-hoc \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 Python \u0438 SQL.<\/p>\n<p>Go-jira \u044d\u0442\u043e \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API Jira \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0432 CI\/CD \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Go-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2013 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c jira issues \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 OpenJDK:<br \/> main.go:<\/p>\n<pre><code class=\"go\">package main  import ( \"fmt\" \"github.com\/andygrunwald\/go-jira\" )  func main() { jiraClient, _ := jira.NewClient(nil, \"https:\/\/bugs.openjdk.org\")  jql := \"project = JDK and status = Open ORDER BY updated ASC\"  issues, resp, err := jiraClient.Issue.Search(jql, nil) if err != nil { fmt.Println(err) panic(resp.StatusCode) }  for _, issue := range issues { fmt.Printf(\"%s: %+v\\n\", issue.Key, issue.Fields.Summary) } } <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c issues \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 OpenJDK:<\/p>\n<pre><code>go run main.go | head -10  JDK-4158929: 8 bit Dithering problem in SwingSet HTML Text tab. JDK-4184200: Color profiles for screen device should be used when available. JDK-4199882: splotchy highlight at 24 bit True Color JDK-4345973: Add set\/get methods for boolean datatype in ParameterBlock JDK-4148927: Input method highlighting needs to handle highlight segments JDK-4102920: 12x: Multi-font caching scheme inadequate for non-Latin text JDK-4387892: swing components show all black @ 16-bit depth (VNC on Linux) JDK-4398379: java.awt.image.DataBufferShort constructor should verify size of array JDK-4398381: java.awt.image.DataBufferShort should check for negative size JDK-4396157: Merlin: Consonant RA Rule R2 doesn't hold true with Lucida font <\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u044f CLI \u0441 Jira \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 Git:<\/p>\n<pre><code>jira mine  +--------+------------+-------+----------+--------+----------+--------------+--------------+ | Issue  |  Summary   | Type  | Priority | Status |   Age    |   Reporter   |   Assignee   | +--------+------------+-------+----------+--------+----------+--------------+--------------+ | JIRA-1 | Jira-1     | Story | Medium   | To Do  | an hour  | Anton Krylov | Anton Krylov | | JIRA-2 | Demo Issue | Bug   | Medium   | To Do  | a minute | Anton Krylov | Anton Krylov | +--------+------------+-------+----------+--------+----------+--------------+--------------+ <\/code><\/pre>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f Jira:<\/p>\n<pre><code>mkdir ~\/.jira.d  cat &lt;&lt;EOM >~\/.jira.d\/config.yml endpoint: https:\/\/jira.mycompany.com EOM <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>config.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">config:   stop: true password-source: stdin endpoint: http:\/\/&lt;IP>:9099 user: &lt;user> login: &lt;login>  project: JIRA  queries:   todo: >-     resolution = unresolved {{if .project}}AND project = '{{.project}}'{{end}} AND status = 'To Do'  custom-commands:   - name: env     help: print the JIRA environment variables available to custom commands     script: |-       env | sort | grep JIRA   - name: print-project     help: print the name of the configured project     script: \"echo $JIRA_PROJECT\"   - name: jira-path     help: print the path the jira command that is running this alias     script: |-       echo {{jira}}   - name: mine     help: display issues assigned to me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND assignee=currentuser() ORDER BY status, issue\"   - name: mine-created     help: display issues created by me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND creator=currentuser() ORDER BY created\"   - name: watching     help: display issues watched by me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND watcher=currentuser() ORDER BY created\"     script: |-       if [ -n \"$JIRA_PROJECT\" ]; then           # if `project: ...` configured just list the issues for current project           {{jira}} list --template table --query \"resolution = unresolved and assignee=currentuser() and project = $JIRA_PROJECT ORDER BY priority asc, created\"       else           # otherwise list issues for all project           {{jira}} list --template table --query \"resolution = unresolved and assignee=currentuser() ORDER BY priority asc, created\"       fi   - name: sprint     help: display issues for active sprint     script: |-       if [ -n \"$JIRA_PROJECT\" ]; then           # if `project: ...` configured just list the issues for current project           {{jira}} list --template table --query \"sprint in openSprints() and type != epic and resolution = unresolved and project=$JIRA_PROJECT ORDER BY rank asc, created\"       else           # otherwise list issues for all project           {{jira}} list --template table --query \"sprint in openSprints() and type != epic and resolution = unresolved ORDER BY rank asc, created\"       fi <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u0444\u0438\u0433\u0435 <code>password-source: stdin<\/code> \u0442\u043e \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f jira \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>export JIRA_PASSWORD='&lt;PASSWORD>\\n' echo $JIRA_PASSWORD| jira ls <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 <code>password-source: pass<\/code> \u0442\u043e jira \u00ab\u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u00bb \u0435\u0433\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>jira mine \u044d\u0442\u043e <code>custom-command<\/code> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 jira issues \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<br \/> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 api \u0438 jql \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 jira.<\/p>\n<pre><code class=\"yaml\">  - name: mine     help: display issues assigned to me     script: |-       {{jira}} list --template table --query \"resolution = unresolved AND project=$JIRA_PROJECT AND assignee=currentuser() ORDER BY status, issue\" <\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043a issues \u0438\u0437 Bash:<\/p>\n<pre><code>jira attach create JIRA-1 exec.zip  OK 10000 http:\/\/109.207.172.67:9099\/secure\/attachment\/10000\/exec.zip <\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c Bash-\u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code>for i in exec1.zip exec2.zip exec3.zip exec4.zip; do jira attach create JIRA-1 $i; done  OK 10003 http:\/\/109.207.172.67:9099\/secure\/attachment\/10003\/exec1.zip OK 10004 http:\/\/109.207.172.67:9099\/secure\/attachment\/10004\/exec2.zip OK 10005 http:\/\/109.207.172.67:9099\/secure\/attachment\/10005\/exec3.zip OK 10006 http:\/\/109.207.172.67:9099\/secure\/attachment\/10006\/exec4.zip <\/code><\/pre>\n<p>\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code>jira attach list JIRA-1  +-------+-----------+---------+--------------+-----------+ |  id   | filename  |  bytes  |     user     |  created  | +-------+-----------+---------+--------------+-----------+ | 10000 | exec.zip  | 4209783 | Anton Krylov | 5 minutes | | 10001 | exec.zip  | 4209783 | Anton Krylov | 3 minutes | | 10002 | exec.zip  | 4209783 | Anton Krylov | 3 minutes | | 10003 | exec1.zip | 4209783 | Anton Krylov | a minute  | | 10004 | exec2.zip | 4209783 | Anton Krylov | a minute  | | 10005 | exec3.zip | 4209783 | Anton Krylov | a minute  | | 10006 | exec4.zip | 4209783 | Anton Krylov | a minute  | +--- <\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u0438\u043f\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubernetes.<\/p>\n<p>\u0412\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<pre><code>make -f mkcerts.mk root-ca  generating root-key.pem generating root-cert.csr generating root-cert.pem Certificate request self-signature ok subject=O=Istio, CN=Root CA <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0418\u0411:<\/p>\n<pre><code>jira attach create JIRA-1 kube_certs.tar  OK 10007 http:\/\/109.207.172.67:9099\/secure\/attachment\/10007\/kube_certs.tar <\/code><\/pre>\n<figure class=\"\">\n<div><figcaption>kube-certs<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c SSH-\u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0434\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u043b\u044e\u0447\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 Jira: <\/p>\n<figure class=\"\">\n<div><figcaption>ssh-key<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 YAML-\u0448\u0430\u0431\u043b\u043e\u043d, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 Git: <\/p>\n<figure class=\"\">\n<div><figcaption>ssh-key-template<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0439 \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka:<\/p>\n<pre><code>bash genkeys.sh <\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code>tree . \u251c\u2500\u2500 broker-ca-signed.crt \u251c\u2500\u2500 broker.csr \u251c\u2500\u2500 broker_keystore_creds \u251c\u2500\u2500 broker_sslkey_creds \u251c\u2500\u2500 broker_truststore_creds \u251c\u2500\u2500 consumer-ca-signed.crt \u251c\u2500\u2500 consumer.csr \u251c\u2500\u2500 consumer_keystore_creds \u251c\u2500\u2500 consumer_sslkey_creds \u251c\u2500\u2500 consumer_truststore_creds \u251c\u2500\u2500 genkeys.sh \u251c\u2500\u2500 jcerts-kafka-ca-key.pem \u251c\u2500\u2500 jcerts-kafka-ca.pem \u251c\u2500\u2500 jcerts-kafka-ca.srl \u251c\u2500\u2500 kafka.broker.keystore.cer.pem \u251c\u2500\u2500 kafka.broker.keystore.jks \u251c\u2500\u2500 kafka.broker.keystore.key.pem \u251c\u2500\u2500 kafka.broker.keystore.p12 \u251c\u2500\u2500 kafka.broker.truststore.jks<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-365317","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365317"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365317\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}