{"id":242,"date":"2018-12-03T10:38:00","date_gmt":"2018-12-03T10:38:00","guid":{"rendered":""},"modified":"2019-07-03T13:08:00","modified_gmt":"2019-07-03T13:08:00","slug":"gitlab-ci-with-nexus","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2018\/12\/03\/gitlab-ci-with-nexus\/","title":{"rendered":"Gitlab-CI with Nexus"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align:left;\">\n<div dir=\"ltr\" style=\"text-align:left;\">\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><a class=\"hoverZoomLink\" href=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/9efd0-blog.png\" style=\"margin-left:1em;margin-right:1em;\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" class=\"hoverZoomLink\" height=\"227\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/9efd0-blog.png?w=300\" width=\"640\"><\/a><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<p>Recently I was asked to set up a CI- Pipeline for a Spring based application.<br \/>\nI said &#8220;piece of cake&#8221;, as I have already worked on jenkins pipeline, and knew about maven so that won&#8217;t be a problem. But there was a hitch, &#8220;<i>pipeline of Gitlab CI<\/i>&#8220;. I said &#8220;<i>no problem, I&#8217;ll learn about it<\/i>&#8221; with a Ninja Spirit.<br \/>\nSo for starters what is gitlab-ci pipeline. For those who have already work on Jenkins and maven, they know about the CI workflow of&nbsp; Building a code , testing the code, packaging, and deploy it using maven. You can add other goals too, depending upon the requirement.<br \/>\nThe CI process in GitLab CI is defined within a file in the code repository itself using a YAML configuration syntax.<br \/>\nThe work is then dispatched to machines called runners, which are easy to set up and can be provisioned on many different operating systems. When configuring runners, you can choose between different executors like Docker, shell, VirtualBox, or Kubernetes to determine how the tasks are carried out.<\/p>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<p><b>What we are going to do?<\/b><br \/>\nWe will be establishing a CI\/CD pipeline using gitlab-ci and deploying artifacts to NEXUS Repository.<\/p>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><a class=\"hoverZoomLink\" href=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/1d0d6-final.png\" style=\"margin-left:1em;margin-right:1em;\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" class=\"hoverZoomLink\" height=\"78\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/1d0d6-final.png?w=300\" width=\"640\"><\/a><\/div>\n<p>Resources Used:<\/p>\n<ol style=\"text-align:left;\">\n<li>Gitlab server, I&#8217;m using <a href=\"https:\/\/gitlab.com\/\" target=\"_blank\" rel=\"noopener\">gitlab<\/a> to host my code.<b>&nbsp; <\/b>&nbsp;<\/li>\n<li>Runner server, It could be vagrant or an ec2 instance.<b>&nbsp;<\/b><\/li>\n<li>Nexus Server, It could be vagrant or an ec2 instance.\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<p>&nbsp;Before going further, let&#8217;s get aware of few terminologies.&nbsp;<\/li>\n<\/ol>\n<ul style=\"text-align:left;\">\n<li>Artifacts: Objects created by a build process, Usually project jars, library jar. These can include use cases, class diagrams, requirements, and design documents.<\/li>\n<li>Maven Repository(NEXUS): A repository is a directory where all the project jars, library jar,  plugins or any other project specific artifacts are stored and can be  used by Maven easily, here we are going to use NEXUS as a central Repository.<\/li>\n<li>CI: A software development practice in which you build and test software every time a developer pushes code to the application, and it happens several times a day.<\/li>\n<li>Gitlab-runner: GitLab Runner is the open source project that is used to run your jobs and send the results back to GitLab. It is used in conjunction with GitLab CI, the open-source continuous integration service included with GitLab that coordinates the jobs.<\/li>\n<li>.gitlab-ci.yml: The YAML file defines a set of jobs with constraints stating when they should be run. You can specify an unlimited number of jobs which are defined as top-level elements with an arbitrary name and always have to contain at least the script clause. Whenever you push a commit, a pipeline will be triggered with respect to that commit.<\/li>\n<\/ul>\n<h4 style=\"text-align:left;\">Strategy to Setup Pipeline<\/h4>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><\/div>\n<div class=\"separator\" style=\"clear:both;text-align:center;\"><a class=\"hoverZoomLink\" href=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/01469-strategy.png\" style=\"margin-left:1em;margin-right:1em;\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" class=\"hoverZoomLink\" height=\"280\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2018\/12\/01469-strategy.png?w=300\" width=\"640\"><\/a><\/div>\n<h4 style=\"text-align:left;\"><b>Step-1:&nbsp; Setting up GitLab Repository.<\/b>&nbsp;<\/h4>\n<div style=\"text-align:left;\">I&#8217;m using a Spring based code Spring3Hibernate, with a directory structure like below.<\/div>\n<div style=\"text-align:left;\">\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    cd spring3hibernateapp\n$    ls\n     pom.xml pom.xml~ src<\/span><\/pre>\n<p># Now lets start pushing this code to gitlab<\/p>\n<\/div>\n<div style=\"text-align:left;\">\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    git remote -v\n     origin git@gitlab.com:\/spring3hibernateapp.git (fetch)\n     origin git@gitlab.com:\/spring3hibernateapp.git (push)<\/span><\/pre>\n<\/div>\n<div style=\"text-align:left;\"># Adding the code to the working directory<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    git add -A<\/span><\/pre>\n<\/div>\n<div style=\"text-align:left;\"># Committing the code<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    git commit -m \"[Master][Add] Adding the code \"<\/span><\/pre>\n<\/div>\n<div style=\"text-align:left;\"># Pushing it to gitlab<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    git push origin master<\/span><\/pre>\n<\/div>\n<h4 style=\"text-align:left;\"><b>Step-2:&nbsp; Install GitLab Runner manually on GNU\/Linux<\/b><\/h4>\n<div style=\"text-align:left;\"><span style=\"font-weight:normal;\"># Simply download one of the binaries for your system:<\/span><\/div>\n<h4 style=\"text-align:left;\"><\/h4>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    sudo wget -O \/usr\/local\/bin\/gitlab-runner https:\/\/gitlab-runner-downloads.s3.amazonaws.com\/latest\/binaries\/gitlab-runner-linux-386<\/span><\/pre>\n<p># Give it permissions to execute:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    sudo chmod +x \/usr\/local\/bin\/gitlab-runner<\/span><code style=\"color:black;word-wrap:normal;\"><span>&nbsp;<\/span><\/code><\/pre>\n<p># Optionally, if you want to use Docker, install Docker with:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    curl -sSL https:\/\/get.docker.com\/ | sh<\/span><code style=\"color:black;word-wrap:normal;\"><span>&nbsp;<\/span><\/code><\/pre>\n<p># Create a GitLab CI user:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell \/bin\/bash<\/span><code style=\"color:black;word-wrap:normal;\"><span>&nbsp;<\/span><\/code><\/pre>\n<p># Install and run as service:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    sudo gitlab-runner install --user=gitlab-runner --working-directory=\/home\/gitlab-runner\n$    sudo gitlab-runner start<\/span><\/pre>\n<p><b>Step-3: Registering a Runner<\/b><\/p>\n<div style=\"text-align:left;\">To get the runner configuration you need to move to gitlab &gt; spring3hibernateapp &gt; CI\/CD setting &gt; Runners<\/div>\n<div style=\"text-align:left;\">And get the registration token for runners.<\/div>\n<div style=\"text-align:left;\"><b><\/b><\/div>\n<p># Run the following command:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$     sudo gitlab-runner register\n       Runtime platform                                    arch=amd64 os=linux pid=1742 revision=3afdaba6 version=11.5.0\n       Running in system-mode.                            <\/span><code style=\"color:black;word-wrap:normal;\"><span>&nbsp;<\/span><\/code><\/pre>\n<p># Please enter the gitlab-ci coordinator URL (e.g. https:\/\/gitlab.com\/):<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">https:\/\/gitlab.com\/<\/span><\/pre>\n<p># Please enter the gitlab-ci token for this runner:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">****8kmMfx_RMr****<\/span><\/pre>\n<p># Please enter the gitlab-ci description for this runner:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">[gitlab-runner]: spring3hibernate<\/span><\/pre>\n<p># Please enter the gitlab-ci tags for this runner (comma separated):<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">build\n       Registering runner... succeeded                     runner=ZP3TrPCd<\/span><\/pre>\n<p># Please enter the executor: docker, docker-ssh, shell, ssh, virtualbox, docker+machine, parallels, docker-ssh+machine, kubernetes:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">docker<\/span><\/pre>\n<p># Please enter the default Docker image (e.g. ruby:2.1):<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">maven       \n       Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!<\/span><\/pre>\n<p># You can also create systemd service in \/etc\/systemd\/system\/gitlab-runner.service.<\/p>\n<pre><span style=\"color:#d73a49;\">[Unit]\nDescription=GitLab Runner\nAfter=syslog.target network.target\nConditionFileIsExecutable=\/usr\/local\/bin\/gitlab-runner\n\n[Service]\nStartLimitInterval=5\nStartLimitBurst=10\nExecStart=\/usr\/local\/bin\/gitlab-runner \"run\" \"--working-directory\" \"\/home\/gitlab-runner\" \"--config\" \"\/etc\/gitlab-runner\/config.toml\" \"--service\" \"gitlab-runner\" \"--syslog\" \"--user\" \"gitlab-runner\"\nRestart=always\nRestartSec=120\n\n[Install]\nWantedBy=multi-user.target<\/span><\/pre>\n<p><b>Step-4: Setting up Nexus Repository<\/b><br \/>\nYou can setup a repository installing the open source version of Nexus you need to visit Nexus OSS and download the TGZ version or the ZIP version.<br \/>\nBut to keep it simple, I used docker container for that.<br \/>\n# Install docker<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    curl -sSL https:\/\/get.docker.com\/ | sh<\/span><\/pre>\n<p># Launch a NEXUS container and bind the port<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    docker run -d -p 8081:8081 --name nexus sonatype\/nexus:oss<\/span><\/pre>\n<p>You can access your nexus now on http:\/\/:8081\/nexus.<br \/>\nAnd login as admin with password admin123.<\/p>\n<h4 style=\"text-align:left;\"><b>Step-5: <\/b>Configure the NEXUS deployment<\/h4>\n<p>Clone your code and enter the repository<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    cd spring3hibernateapp\/<\/span><\/pre>\n<p># Create a folder called <code class=\"highlighter-rouge\">.m2<\/code> in the root of your repository<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    mkdir .m2<\/span><\/pre>\n<p># Create a file called <code class=\"highlighter-rouge\">settings.xml<\/code> in the <code class=\"highlighter-rouge\">.m2<\/code> folder<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">$    touch .m2\/settings.xml<\/span><\/pre>\n<p># Copy the following content in settings.xml<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">&lt;settings xsi:schemaLocation=\"http:\/\/maven.apache.org\/SETTINGS\/1.1.0 http:\/\/maven.apache.org\/xsd\/settings-1.1.0.xsd\"\n    xmlns=\"http:\/\/maven.apache.org\/SETTINGS\/1.1.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"&gt;\n  \n    \n      central\n      ${env.NEXUS_REPO_USER}\n      ${env.NEXUS_REPO_PASS}\n    \n    \n      snapshots\n      ${env.NEXUS_REPO_USER}\n      ${env.NEXUS_REPO_PASS}\n    \n  \n<\/span><\/pre>\n<p>&nbsp;Username and password will be replaced by the correct values using variables.<br \/>\n# Updating Repository path in pom.xml<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">\n     central\n     Central\n     ${env.NEXUS_REPO_URL}central\/\n   \n \n          snapshots\n          Snapshots\n          ${env.NEXUS_REPO_URL}snapshots\/\n        <\/span><\/pre>\n<h3 style=\"text-align:left;\">Step-6: Configure GitLab CI\/CD for simple maven deployment.<\/h3>\n<div style=\"text-align:left;\">GitLab CI\/CD uses a file in the root of the repo, named, <code class=\"highlighter-rouge\">.gitlab-ci.yml<\/code>, to read the definitions for jobs that will be executed by the configured GitLab Runners.<\/div>\n<div style=\"text-align:left;\">First of all, remember to set up variables for your deployment. Navigate to your project\u2019s <b>Settings &gt; CI\/CD &gt; Variables<\/b> page and add the following ones (replace them with your current values, of course):<\/div>\n<ul style=\"text-align:left;\">\n<li>NEXUS_REPO_URL: http:\/\/:8081\/nexus\/content\/repositories\/&nbsp;<\/li>\n<li>NEXUS_REPO_USER: admin<\/li>\n<li>NEXUS_REPO_PASS: admin123<\/li>\n<\/ul>\n<p>Now it\u2019s time to define jobs in <code class=\"highlighter-rouge\">.gitlab-ci.yml<\/code> and push it to the repo:<\/p>\n<pre><span class=\"pl-k\" style=\"box-sizing:border-box;color:#d73a49;\">image: maven\n\nvariables:\n  MAVEN_CLI_OPTS: \"-s .m2\/settings.xml --batch-mode\"\n  MAVEN_OPTS: \"-Dmaven.repo.local=.m2\/repository\"\n\ncache:\n  paths:\n    - .m2\/repository\/\n    - target\/\n\nstages:\n  - build\n  - test\n  - package \n  - deploy\n\ncodebuild:\n  tags:\n    - build      \n  stage: build\n  script: \n    - mvn compile\n\ncodetest:\n  tags:\n    - build\n  stage: test\n  script:\n    - mvn $MAVEN_CLI_OPTS test\n    - echo \"The code has been tested\"\n\nCodepackage:\n  tags:\n    - build\n  stage: package\n  script:\n    - mvn $MAVEN_CLI_OPTS package -Dmaven.test.skip=true\n    - echo \"Packaging the code\"\n  artifacts:\n    paths:\n      - target\/*.war\n  only:\n    - master  \n\nCodedeploy:\n  tags:\n    - build\n  stage: deploy\n  script:\n    - mvn $MAVEN_CLI_OPTS deploy -Dmaven.test.skip=true\n    - echo \"installing the package in local repository\"\n  only:\n    - master<\/span><\/pre>\n<p>Now add the changes, commit them and push them to the remote repository on gitlab. A pipeline will be triggered with respect to your commit. And if everything goes well our mission will be accomplished.<br \/>\n<b>Note<\/b>: You might get some issues with maven plugins, which will need to managed in pom.xml, depending upon the environment.<br \/>\nIn this blog, we covered the basic steps to use a Nexus Maven repository to automatically publish and consume artifacts.<\/p>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;cursor:pointer;display:none;left:158px;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;pointer-events:none;position:absolute;top:287px;z-index:2147483647;\"><\/div>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;cursor:pointer;display:none;left:0;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;pointer-events:none;position:absolute;top:855px;z-index:2147483647;\"><\/div>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;display:none;left:475px;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;position:absolute;top:204px;z-index:2147483647;\"><\/div>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;cursor:pointer;display:none;left:0;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;pointer-events:none;position:absolute;top:1539px;z-index:2147483647;\"><\/div>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;display:none;left:355px;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;position:absolute;top:917px;z-index:2147483647;\"><\/div>\n<\/div>\n<div id=\"hzImg\" style=\"background-color:white;border-radius:3px;border:1px solid rgb(255,255,255);box-shadow:rgba(0,0,0,0.33) 3px 3px 9px 5px;cursor:pointer;display:none;left:16px;line-height:0;margin:0;opacity:1;overflow:hidden;padding:2px;pointer-events:none;position:absolute;top:0;z-index:2147483647;\"><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Recently I was asked to set up a CI- Pipeline for a Spring based application. I said &#8220;piece of cake&#8221;, as I have already worked on jenkins pipeline, and knew about maven so that won&#8217;t be a problem. But there was a hitch, &#8220;pipeline of Gitlab CI&#8220;. I said &#8220;no problem, I&#8217;ll learn about it&#8221; &hellip; <a href=\"https:\/\/opstree.com\/blog\/2018\/12\/03\/gitlab-ci-with-nexus\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Gitlab-CI with Nexus&#8221;<\/span><\/a><\/p>\n","protected":false},"author":159458168,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[1],"tags":[27998418,16668644,163615,768739308,281597904,523978272,47862,22008],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-3U","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/242"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/159458168"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":2,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions"}],"predecessor-version":[{"id":680,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions\/680"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}