blob: 38f11361d897d69f430b0068eab0459b2ac8b2b0 [file] [log] [blame]
(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{176:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return o})),a.d(t,"toc",(function(){return c})),a.d(t,"default",(function(){return p}));var n=a(3),r=a(7),i=(a(0),a(194)),s={title:"How to Release"},o={unversionedId:"devDocs/HowToRelease",id:"devDocs/HowToRelease",isDocsHomePage:!1,title:"How to Release",description:"\x3c!--",source:"@site/docs/devDocs/HowToRelease.md",slug:"/devDocs/HowToRelease",permalink:"/docs/next/devDocs/HowToRelease",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/devDocs/HowToRelease.md",version:"current",sidebar:"docs",previous:{title:"How to Run Frontend Integration Test",permalink:"/docs/next/devDocs/IntegrationTestE2E"},next:{title:"How to Verify",permalink:"/docs/next/devDocs/HowToVerify"}},c=[{value:"0. Preface",id:"0-preface",children:[]},{value:"1. Add GPG KEY",id:"1-add-gpg-key",children:[{value:"1.1 Install gpg",id:"11-install-gpg",children:[]},{value:"1.2 generate gpg Key",id:"12-generate-gpg-key",children:[]},{value:"1.3 Upload the generated key to the public server",id:"13-upload-the-generated-key-to-the-public-server",children:[]},{value:"1.4 Check whether the key is created successfully",id:"14-check-whether-the-key-is-created-successfully",children:[]},{value:"1.5 Add your gpg public key to the KEYS file",id:"15-add-your-gpg-public-key-to-the-keys-file",children:[]},{value:"1.6 Upload GPG public key to Github account",id:"16-upload-gpg-public-key-to-github-account",children:[]}]},{value:"2. Set maven settings",id:"2-set-maven-settings",children:[]},{value:"3. Compile and package",id:"3-compile-and-package",children:[{value:"3.1 Prepare a branch",id:"31-prepare-a-branch",children:[]},{value:"3.2 Create the tag",id:"32-create-the-tag",children:[]},{value:"3.3 Package the source code",id:"33-package-the-source-code",children:[]},{value:"3.4 Packaged binary package",id:"34-packaged-binary-package",children:[]},{value:"3.5 Sign the source package/binary package/sha512",id:"35-sign-the-source-packagebinary-packagesha512",children:[]},{value:"3.6 Check whether the generated signature/sha512 is correct",id:"36-check-whether-the-generated-signaturesha512-is-correct",children:[]}]},{value:"4. Prepare for Apache release",id:"4-prepare-for-apache-release",children:[{value:"4.1 Publish the jar package to the Apache Nexus repository",id:"41-publish-the-jar-package-to-the-apache-nexus-repository",children:[]},{value:"4.2 Upload the tag to git repository",id:"42-upload-the-tag-to-git-repository",children:[]},{value:"4.3 Upload the compiled file to dist",id:"43-upload-the-compiled-file-to-dist",children:[]},{value:"4.3.1 Checkout Submarine to a local directory",id:"431-checkout-submarine-to-a-local-directory",children:[]},{value:"4.3.2 Add the public key to the KEYS file and submit it to the SVN repository",id:"432-add-the-public-key-to-the-keys-file-and-submit-it-to-the-svn-repository",children:[]},{value:"4.4 Shut down the Apache Staging repository",id:"44-shut-down-the-apache-staging-repository",children:[]}]},{value:"5. Enter voting",id:"5-enter-voting",children:[{value:"Vote in the Submarine community",id:"vote-in-the-submarine-community",children:[]}]},{value:"6. Officially released",id:"6-officially-released",children:[{value:"6.1 Merge the changes from the release-${release_version} branch to the master branch",id:"61-merge-the-changes-from-the-release-release_version-branch-to-the-master-branch",children:[]},{value:"6.2 Release the version in the Apache Staging repository",id:"62-release-the-version-in-the-apache-staging-repository",children:[]},{value:"6.3 Update official website link",id:"63-update-official-website-link",children:[]},{value:"6.4. Send an email to<code>dev@submarine.apache.org</code>",id:"64-send-an-email-todevsubmarineapacheorg",children:[]}]}],l={toc:c};function p(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(n.a)({},l,a,{components:t,mdxType:"MDXLayout"}),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"This article mainly introduces how the Release Manager releases a specific version of the project according to the Apache process.")),Object(i.b)("h2",{id:"0-preface"},"0. Preface"),Object(i.b)("p",null,"Source Release is the focus of Apache\u2019s attention and it is also a required content for release. Binary Release is optional, Submarine can choose whether to release the binary package to the Apache warehouse or to the Maven central warehouse."),Object(i.b)("p",null,"Please refer to the following link to find more details about release guidelines:"),Object(i.b)("p",null,Object(i.b)("a",{parentName:"p",href:"https://cwiki.apache.org/confluence/display/SUBMARINE/How+to+release"},"How to Release"),Object(i.b)("br",{parentName:"p"}),"\n",Object(i.b)("a",{parentName:"p",href:"https://cwiki.apache.org/confluence/display/SUBMARINE/Submarine+Release+Guidelines"},"Submarine Release Guidelines")),Object(i.b)("h2",{id:"1-add-gpg-key"},"1. Add GPG KEY"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Main references in this chapter:",Object(i.b)("a",{parentName:"p",href:"https://infra.apache.org/openpgp.html"},"https://infra.apache.org/openpgp.html")," > ",Object(i.b)("strong",{parentName:"p"},"This chapter is only needed for the first release manager of the project."))),Object(i.b)("h3",{id:"11-install-gpg"},"1.1 Install gpg"),Object(i.b)("p",null,"Detailed installation documents can refer to ",Object(i.b)("a",{parentName:"p",href:"https://www.gnupg.org/download/index.html"},"tutorial"),", The environment configuration of Mac OS is as follows:"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"$ brew install gpg\n$ gpg --version #Check the version\uff0cshould be 2.x\n")),Object(i.b)("h3",{id:"12-generate-gpg-key"},"1.2 generate gpg Key"),Object(i.b)("h4",{id:"need-to-pay-attention-to-the-following-points\uff1a"},"Need to pay attention to the following points\uff1a"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"When entering the name, it is better to be consistent with the Full name registered in Apache"),Object(i.b)("li",{parentName:"ul"},"The mailbox used should be apache mailbox"),Object(i.b)("li",{parentName:"ul"},"It\u2019s better to use pinyin or English for the name, otherwise there will be garbled characters")),Object(i.b)("h4",{id:"follow-the-hint\uff0cgenerate-a-key"},"Follow the hint\uff0cgenerate a key"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ gpg --full-gen-key\ngpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nPlease select what kind of key you want:\n (1) RSA and RSA (default)\n (2) DSA and Elgamal\n (3) DSA (sign only)\n (4) RSA (sign only)\n (14) Existing key from card\nYour selection? 1 # enter 1 here\nRSA keys may be between 1024 and 4096 bits long.\nWhat keysize do you want? (2048) 4096 # enter 4096 here\nRequested keysize is 4096 bits\nPlease specify how long the key should be valid.\n 0 = key does not expire\n <n> = key expires in n days\n <n>w = key expires in n weeks\n <n>m = key expires in n months\n <n>y = key expires in n years\nKey is valid for? (0) 0 # enter 0 here\nKey does not expire at all\nIs this correct? (y/N) y # enter y here\n\nGnuPG needs to construct a user ID to identify your key.\n\nReal name: Guangxu Cheng # enter your name here\nEmail address: gxcheng@apache.org # enter your mailbox here\nComment: # enter some comment here (Optional)\nYou selected this USER-ID:\n \"Guangxu Cheng <gxcheng@apache.org>\"\n\nChange (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O #enter O here\nWe need to generate a lot of random bytes. It is a good idea to perform\nsome other action (type on the keyboard, move the mouse, utilize the\ndisks) during the prime generation; this gives the random number\ngenerator a better chance to gain enough entropy.\nWe need to generate a lot of random bytes. It is a good idea to perform\nsome other action (type on the keyboard, move the mouse, utilize the\ndisks) during the prime generation; this gives the random number\ngenerator a better chance to gain enough entropy.\n\n# A dialog box will pop up, asking you to enter the key for this gpg.\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Please enter this passphrase \u2502\n\u2502 \u2502\n\u2502 Passphrase: _______________________________ \u2502\n\u2502 \u2502\n\u2502 <OK> <Cancel> \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n# After entering the secret key, it will be created. And it will output the following information.\ngpg: key 2DD587E7B10F3B1F marked as ultimately trusted\ngpg: revocation certificate stored as '/Users/cheng/.gnupg/openpgp-revocs.d/41936314E25F402D5F7D73152DD587E7B10F3B1F.rev'\npublic and secret key created and signed.\n\npub rsa4096 2020-05-19 [SC]\n 41936314E25F402D5F7D73152DD587E7B10F3B1F\nuid Guangxu Cheng <gxcheng@apache.org>\nsub rsa4096 2020-05-19 [E]\n")),Object(i.b)("h3",{id:"13-upload-the-generated-key-to-the-public-server"},"1.3 Upload the generated key to the public server"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"\u279c ~ gpg --list-keys\n-------------------------------\npub rsa4096 2020-05-18 [SC]\n 5931F8CFD04B37A325E4465D8C0D31C4149B3A87\nuid [ultimate] Guangxu Cheng <gxcheng@apache.org>\nsub rsa4096 2020-05-18 [E]\n\n# Send public key to keyserver via key id\n$ gpg --keyserver pgpkeys.mit.edu --send-key <key id>\n# Among them, pgpkeys.mit.edu is a randomly selected keyserver, and the keyserver list is: https://sks-keyservers.net/status/, which is automatically synchronized with each other, you can choose any one.\n")),Object(i.b)("h3",{id:"14-check-whether-the-key-is-created-successfully"},"1.4 Check whether the key is created successfully"),Object(i.b)("p",null,"Through the following URL, use the email to check whether the upload is successful or not. It will take about a minute to find out. When searching, check the show full-key hashes under advance on ",Object(i.b)("a",{parentName:"p",href:"http://keys.gnupg.net"},"http://keys.gnupg.net"),"."),Object(i.b)("p",null,"The query results are as follows:"),Object(i.b)("h3",{id:"15-add-your-gpg-public-key-to-the-keys-file"},"1.5 Add your gpg public key to the KEYS file"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"SVN is required for this step")),Object(i.b)("p",null,"The svn library of the DEV branch is ",Object(i.b)("a",{parentName:"p",href:"https://dist.apache.org/repos/dist/dev/submarine"},"https://dist.apache.org/repos/dist/dev/submarine")),Object(i.b)("p",null,"The SVN library of the Release branch is ",Object(i.b)("a",{parentName:"p",href:"https://dist.apache.org/repos/dist/release/submarine"},"https://dist.apache.org/repos/dist/release/submarine")),Object(i.b)("h4",{id:"151-add-the-public-key-to-keys-in-the-dev-branch-to-release-the-rc-version"},"1.5.1 Add the public key to KEYS in the dev branch to release the RC version"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},'\u279c ~ svn co https://dist.apache.org/repos/dist/dev/submarine /tmp/submarine-dist-dev\n# This step is relatively slow, and all versions will be copied. If the network is disconnected, use svn cleanup to delete the lock and re-execute it, and the transfer will be resumed.\n\u279c ~ cd submarine-dist-dev\n\u279c submarine-dist-dev ~ (gpg --list-sigs YOUR_NAME@apache.org && gpg --export --armor YOUR_NAME@apache.org) >> KEYS # Append the KEY you generated to the file KEYS, it is best to check if it is correct after appending.\n\u279c submarine-dist-dev ~ svn add . # If there is a KEYS file before, it is not needed.\n\u279c submarine-dist-dev ~ svn ci -m "add gpg key for YOUR_NAME" # Next, you will be asked to enter a username and password, just use your apache username and password.\n')),Object(i.b)("h4",{id:"152-add-the-public-key-to-keys-in-the-release-branch-to-release-the-official-version"},"1.5.2 Add the public key to KEYS in the release branch to release the official version"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},'\u279c ~ svn co https://dist.apache.org/repos/dist/release/submarine /tmp/submarine-dist-release\n\u279c ~ cd submarine-dist-release\n\u279c submarine-dist-release ~ (gpg --list-sigs YOUR_NAME@apache.org && gpg --export --armor YOUR_NAME@apache.org) >> KEYS # Append the KEY you generated to the file KEYS, it is best to check if it is correct after appending.\n\u279c submarine-dist-release ~ svn add . # If there is a KEYS file before, it is not needed.\n\u279c submarine-dist-release ~ svn ci -m "add gpg key for YOUR_NAME" # Next, you will be asked to enter a username and password, just use your apache username and password.\n')),Object(i.b)("h3",{id:"16-upload-gpg-public-key-to-github-account"},"1.6 Upload GPG public key to Github account"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to ",Object(i.b)("a",{parentName:"li",href:"https://github.com/settings/keys"},"https://github.com/settings/keys")," and add GPG KEYS."),Object(i.b)("li",{parentName:"ol"},'If you find "unverified" is written after the key after adding it, remember to bind the mailbox used in the GPG key to your github account (',Object(i.b)("a",{parentName:"li",href:"https://github.com/settings/emails"},"https://github.com/settings/emails"),").")),Object(i.b)("h2",{id:"2-set-maven-settings"},"2. Set maven settings"),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Skip if it has already been set")),Object(i.b)("p",null,"In the maven configuration file ~/.m2/settings.xml, add the following ",Object(i.b)("inlineCode",{parentName:"p"},"<server>")," item"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'<?xml version="1.0" encoding="UTF-8"?>\n<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <servers>\n \x3c!-- Apache Repo Settings --\x3e\n <server>\n <id>apache.snapshots.https</id>\n <username>{user-id}</username>\n <password>{user-pass}</password>\n </server>\n <server>\n <id>apache.releases.https</id>\n <username>{user-id}</username>\n <password>{user-pass}</password>\n </server>\n </servers>\n<profiles>\n <profile>\n <id>apache-release</id>\n <properties>\n <gpg.keyname>Your KEYID</gpg.keyname>\x3c!-- Your GPG Keyname here --\x3e\n \x3c!-- Use an agent: Prevents being asked for the password during the build --\x3e\n <gpg.useagent>true</gpg.useagent>\n <gpg.passphrase>Your password of the private key</gpg.passphrase>\n </properties>\n </profile>\n</profiles>\n</settings>\n')),Object(i.b)("h2",{id:"3-compile-and-package"},"3. Compile and package"),Object(i.b)("h3",{id:"31-prepare-a-branch"},"3.1 Prepare a branch"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("p",{parentName:"li"},"Pull the new branch from the main branch as a release branch, release-${release_version}")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("p",{parentName:"li"},"Update ",Object(i.b)("inlineCode",{parentName:"p"},"CHANGES.md"))),Object(i.b)("li",{parentName:"ul"},Object(i.b)("p",{parentName:"li"},"Check whether the code is normal, including successful compilation, all unit tests, successful RAT check, etc."),Object(i.b)("pre",{parentName:"li"},Object(i.b)("code",{parentName:"pre",className:"language-shell"},"# build check\n$ mvn clean package -Dmaven.javadoc.skip=true\n# RAT check\n$ mvn apache-rat:check\n"))),Object(i.b)("li",{parentName:"ul"},Object(i.b)("p",{parentName:"li"},"Change the version number"))),Object(i.b)("h3",{id:"32-create-the-tag"},"3.2 Create the tag"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Before creating the tag, make sure that the code has been checked for errors, including: successful compilation, all unit tests, and successful RAT checks, etc.")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Create a tag with signature")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},'$ git_tag=${release_version}-${rc_version}\n$ git tag -s $git_tag -m "Tagging the ${release_version} first Releae Candidate (Candidates start at zero)"\n# If a error happened like gpg: signing failed: secret key not available, set the private key first.\n$ git config user.signingkey ${KEY_ID}\n')),Object(i.b)("h3",{id:"33-package-the-source-code"},"3.3 Package the source code"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"After the tag is successfully created, the tag source code should be packaged into a tar package.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},'mkdir /tmp/apache-submarine-${release_version}-${rc_version}\ngit archive --format=tar.gz --output="/tmp/apache-submarine-${release_version}-${rc_version}/apache-submarine-${release_version}-src.tar.gz" --prefix="apache-submarine-${release_version}/" $git_tag\n')),Object(i.b)("h3",{id:"34-packaged-binary-package"},"3.4 Packaged binary package"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Compile the source code packaged in the previous step")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"cd /tmp/apache-submarine-${release_version}-${rc_version} # Enter the source package directory.\ntar xzvf apache-submarine-${release_version}-src.tar.gz # Unzip the source package.\ncd apache-submarine-${release_version} # Enter the source directory.\nmvn compile clean install package -DskipTests # Compile.\ncp ./submarine-distribution/target/apache-submarine-${release_version}-bin.tar.gz /tmp/apache-submarine-${release_version}-${rc_version}/ # Copy the binary package to the source package directory to facilitate signing the package in the next step.\n")),Object(i.b)("h3",{id:"35-sign-the-source-packagebinary-packagesha512"},"3.5 Sign the source package/binary package/sha512"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"for i in *.tar.gz; do echo $i; gpg --print-md SHA512 $i > $i.sha512 ; done # Calculate SHA512\nfor i in *.tar.gz; do echo $i; gpg --armor --output $i.asc --detach-sig $i ; done # Calculate the signature\n")),Object(i.b)("h3",{id:"36-check-whether-the-generated-signaturesha512-is-correct"},"3.6 Check whether the generated signature/sha512 is correct"),Object(i.b)("p",null,"For example, verify that the signature is correct as follows:"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"for i in *.tar.gz; do echo $i; gpg --verify $i.asc $i ; done\n")),Object(i.b)("h2",{id:"4-prepare-for-apache-release"},"4. Prepare for Apache release"),Object(i.b)("h3",{id:"41-publish-the-jar-package-to-the-apache-nexus-repository"},"4.1 Publish the jar package to the Apache Nexus repository"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"cd /tmp/apache-submarine-${release_version}-${rc_version} # Enter the source package directory\ntar xzvf apache-submarine-${release_version}-src.tar.gz # Unzip the source package\ncd apache-submarine-${release_version}\nmvn -DskipTests deploy -Papache-release -Dmaven.javadoc.skip=true # Start upload\n")),Object(i.b)("h3",{id:"42-upload-the-tag-to-git-repository"},"4.2 Upload the tag to git repository"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"git push origin ${release_version}-${rc_version}\n")),Object(i.b)("h3",{id:"43-upload-the-compiled-file-to-dist"},"4.3 Upload the compiled file to dist"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"This step requires the use of SVN, the svn library of the DEV branch is ",Object(i.b)("a",{parentName:"p",href:"https://dist.apache.org/repos/dist/dev/submarine"},"https://dist.apache.org/repos/dist/dev/submarine"))),Object(i.b)("h3",{id:"431-checkout-submarine-to-a-local-directory"},"4.3.1 Checkout Submarine to a local directory"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},"# This step may be slow, and all versions will be tested. If the network is broken, use svn cleanup to delete the lock and re-execute it, and the upload will be resumed.\nsvn co https://dist.apache.org/repos/dist/dev/submarine /tmp/submarine-dist-dev\n")),Object(i.b)("h3",{id:"432-add-the-public-key-to-the-keys-file-and-submit-it-to-the-svn-repository"},"4.3.2 Add the public key to the KEYS file and submit it to the SVN repository"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-shell"},'cd /tmp/submarine-dist-dev\nmkdir ${release_version}-${rc_version} # Create version directory\n# Copy the source code package and signed package here.\ncp /tmp/apache-submarine-${release_version}-${rc_version}/*tar.gz* ${release_version}-${rc_version}/\nsvn status # Check svn status.\nsvn add ${release_version}-${rc_version} # Add to svn version.\nsvn status # Check svn status.\nsvn commit -m "prepare for ${release_version} ${rc_version}" # Submit to svn remote server.\n')),Object(i.b)("h3",{id:"44-shut-down-the-apache-staging-repository"},"4.4 Shut down the Apache Staging repository"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please make sure all artifacts are fine.")),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("strong",{parentName:"li"},"Log in")," ",Object(i.b)("a",{parentName:"li",href:"http://repository.apache.org"},"http://repository.apache.org")," , with Apache account"),Object(i.b)("li",{parentName:"ol"},"Click on Staging repositories on the left."),Object(i.b)("li",{parentName:"ol"},"Search for Submarine keywords and select the repository you uploaded recently."),Object(i.b)("li",{parentName:"ol"},"Click the Close button above, and a series of checks will be performed during this process."),Object(i.b)("li",{parentName:"ol"},"After the check is passed, a link will appear on the Summary tab below. Please save this link and put it in the next voting email.\nThe link should look like: ",Object(i.b)("inlineCode",{parentName:"li"},"https://repository.apache.org/content/repositories/orgapachesubmarine-xxxx"))),Object(i.b)("p",null,"WARN: Please note that clicking Close may fail, please check the reason for the failure and deal with it."),Object(i.b)("h2",{id:"5-enter-voting"},"5. Enter voting"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"To vote in the Submarine community, send an email to:",Object(i.b)("inlineCode",{parentName:"p"},"dev@submarine.apache.org"))),Object(i.b)("h3",{id:"vote-in-the-submarine-community"},"Vote in the Submarine community"),Object(i.b)("h4",{id:"voting-template"},"Voting template"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"},"Title\uff1a[VOTE] Submarine-${release_version}-${rc_version} is ready for a vote!\n\nContent\uff1a\n\nHi folks,\n\nThanks to everyone's help on this release.\n\nI've created a release candidate (${rc_version}) for submarine ${release_version}. The\nhighlighted features are as follows:\n\n1. AAA\n2. BBB\n3. CCC\n\nThe mini-submarine image is here:\n\ndocker pull apache/submarine:mini-${release_version}-${rc_version}\n\n\nThe RC tag in git is here:\n\nhttps://github.com/apache/submarine/releases/tag/release-${release_version}-${rc_version}\n\nThe RC release artifacts are available at:\n\nhttp://home.apache.org/~pingsutw/submarine-${release_version}-${rc_version}\n\n\nThe Maven staging repository is here:\n\nhttps://repository.apache.org/content/repositories/orgapachesubmarine-1030\n\nMy public key is here:\n\nhttps://dist.apache.org/repos/dist/release/submarine/KEYS\n\n\n*This vote will run for 7 days, ending on DDDD/EE/FF at 11:59 pm PST.*\n\n\nFor the testing, I have verified the\n\n1. Build from source, Install Submarine on minikube\n\n2. Workbench UI (Experiment / Notebook / Template / Environment)\n\n3. Experiment / Notebook / Template / Environment REST API\n\n\nMy +1 to start. Thanks!\n\nBR,\nXXX\n\n")),Object(i.b)("h4",{id:"announce-voting-results-template"},"Announce voting results template"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"},"Title\uff1a[RESULT][VOTE] Release Apache Submarine ${release_version} ${rc_version}\n\nContent\uff1a\n\nHello Apache Submarine PMC and Community,\n The vote closes now as 72hr have passed. The vote PASSES with\n xx (+1 non-binding) votes from the PMC,\n xx (+1 non-binding) vote from the rest of the developer community,\n and no further 0 or -1 votes.\n\n The vote thread:{vote_mail_address}\n\nThank you for your support.\nYour Submarine Release Manager\n")),Object(i.b)("h2",{id:"6-officially-released"},"6. Officially released"),Object(i.b)("h3",{id:"61-merge-the-changes-from-the-release-release_version-branch-to-the-master-branch"},"6.1 Merge the changes from the release-${release_version} branch to the master branch"),Object(i.b)("h3",{id:"62-release-the-version-in-the-apache-staging-repository"},"6.2 Release the version in the Apache Staging repository"),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please make sure all artifacts are fine.")),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Log in to ",Object(i.b)("a",{parentName:"li",href:"http://repository.apache.org"},"http://repository.apache.org")," with your Apache account."),Object(i.b)("li",{parentName:"ol"},"Click on Staging repositories on the left."),Object(i.b)("li",{parentName:"ol"},"Search for Submarine keywords, select your recently uploaded repository, the repository specified in the voting email."),Object(i.b)("li",{parentName:"ol"},"Click the ",Object(i.b)("inlineCode",{parentName:"li"},"Release")," button above, and a series of checks will be carried out during this process.\n",Object(i.b)("strong",{parentName:"li"},"It usually takes 24 hours to wait for the repository to synchronize to other data sources"))),Object(i.b)("h3",{id:"63-update-official-website-link"},"6.3 Update official website link"),Object(i.b)("h3",{id:"64-send-an-email-todevsubmarineapacheorg"},"6.4. Send an email to",Object(i.b)("inlineCode",{parentName:"h3"},"dev@submarine.apache.org")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Please make sure that the repository in 6.4 has been successfully released, generally the email is sent 24 hours after 6.4")),Object(i.b)("p",null,"Announce release email template:"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"},"Title\uff1a [ANNOUNCE] Apache Submarine ${release_version} release!\nContent\uff1a\nHi folks, It's a great honor for me to announce that the Apache Submarine Community\nhas released Apache Submarine ${release_version}!\nThe highlighted features are:\n1. AAA\n2. BBB\n3. CCC\n\nTons of thanks to our contributors and community!\nLet's keep fighting! *Apache Submarine ${release_version} released*:\nhttps://submarine.apache.org/docs/next/releases/submarine-release-${release_version}\n\nBR,\nXXXX\n")))}p.isMDXComponent=!0},194:function(e,t,a){"use strict";a.d(t,"a",(function(){return h})),a.d(t,"b",(function(){return d}));var n=a(0),r=a.n(n);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function c(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=r.a.createContext({}),p=function(e){var t=r.a.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},h=function(e){var t=p(e.components);return r.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),h=p(a),u=n,d=h["".concat(s,".").concat(u)]||h[u]||b[u]||i;return a?r.a.createElement(d,o(o({ref:t},l),{},{components:a})):r.a.createElement(d,o({ref:t},l))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,s=new Array(i);s[0]=u;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o.mdxType="string"==typeof e?e:n,s[1]=o;for(var l=2;l<i;l++)s[l]=a[l];return r.a.createElement.apply(null,s)}return r.a.createElement.apply(null,a)}u.displayName="MDXCreateElement"}}]);