作者:微信小助手
<section> <section style="display: inline-block;"> <img data-ratio="0.4876847290640394" src="/upload/ab14bbc01b375895aa11b42936822b54.jpg" data-type="jpeg" data-w="1015"> </section> </section> <p> <ne-clipboard data="%7B%22type%22%3A%22fragment%22%2C%22name%22%3A%22%23fragment%22%2C%22children%22%3A%5B%7B%22type%22%3A%22element%22%2C%22id%22%3A%22xh4zZ%22%2C%22name%22%3A%22h1%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u97929273%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%221%E3%80%81%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%B5%81%E6%B0%B4%E7%BA%BF%E9%A1%B9%E7%9B%AE%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22udadbc489%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u608f5f59%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688569713172-f2d0f4a5-7d6f-4dd9-8501-df82b7629496.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1320%2C%22height%22%3A756%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A109076%2C%22width%22%3A1056%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22ua2a8d858-f5c6-4f9c-b895-12430dc4083%22%2C%22clientId%22%3A%22udb903c88-cbf3-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A38%2C%22y%22%3A37%2C%22width%22%3A195%2C%22height%22%3A27%2C%22text%22%3A%22%E8%BE%93%E5%85%A5%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%E5%90%8D%E7%A7%B0%22%7D%2C%7B%22x%22%3A50%2C%22y%22%3A127%2C%22width%22%3A177%2C%22height%22%3A19%2C%22text%22%3A%22DEVOPS-PIPELINE-TEST%22%7D%2C%7B%22x%22%3A40%2C%22y%22%3A168%2C%22width%22%3A69%2C%22height%22%3A17%2C%22text%22%3A%22%3E%E5%BF%85%E5%A1%AB%E9%A1%B9%22%7D%2C%7B%22x%22%3A110%2C%22y%22%3A246%2C%22width%22%3A263%2C%22height%22%3A25%2C%22text%22%3A%22%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%E7%9A%84%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%22%7D%2C%7B%22x%22%3A109%2C%22y%22%3A280%2C%22width%22%3A882%2C%22height%22%3A24%2C%22text%22%3A%22%E8%BF%99%E6%98%AFJENKINS%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8A%9F%E8%83%BD%2CJENKINS%E5%B0%86%E4%BC%9A%E7%BB%93%E5%90%88%E4%BB%BB%E4%BD%95%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F%E6%9D%A5%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F%E6%9D%A5%E6%9E%84%E5%BB%BA%E4%BD%A0%E7%9A%84%E9%A1%B9%E7%9B%AE%2C%E7%94%9A%E8%87%B3%E5%8F%AF%E4%BB%A5%E6%9E%84%E5%BB%BA%E8%BD%AF%E4%BB%B6%E4%BB%A5%E5%A4%96%E7%9A%84%E7%B3%BB%E7%BB%9F.%22%7D%2C%7B%22x%22%3A112%2C%22y%22%3A339%2C%22width%22%3A62%2C%22height%22%3A22%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%22%7D%2C%7B%22x%22%3A110%2C%22y%22%3A374%2C%22width%22%3A1053%2C%22height%22%3A22%2C%22text%22%3A%22%E7%B2%BE%E5%BF%83%E5%9C%B0%E7%BB%84%E7%BB%87%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E9%95%BF%E6%9C%9F%E8%BF%90%E8%A1%8C%E5%9C%A8%E5%A4%9A%E4%B8%AA%E8%8A%82%E7%82%B9%E4%B8%8A%E7%9A%84%E4%BB%BB%E5%8A%A1.%E9%80%82%E7%94%A8%E4%BA%8E%E6%9E%84%E5%BB%BA%E6%B5%81%E6%B0%B4%E9%95%9C(%E9%87%8D%E5%8A%A0%E6%AD%A3%E5%BC%8F%E5%9C%B0%E5%BA%94%E5%BD%93%E7%A7%B0%E4%B8%BA%E5%B7%A5%E4%BD%9C%E6%B5%81)%2C%E5%A2%9E%E5%8A%A0%E6%88%96%E8%80%85%E7%BB%84%E7%BB%87%E5%BB%BA%E4%BB%A5%E9%87%87%E7%94%A8%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%22%7D%2C%7B%22x%22%3A111%2C%22y%22%3A402%2C%22width%22%3A93%2C%22height%22%3A19%2C%22text%22%3A%22%E7%9A%84%E4%BB%BB%E5%8A%A1%E7%B1%BB%E5%9E%8B.%22%7D%2C%7B%22x%22%3A112%2C%22y%22%3A458%2C%22width%22%3A181%2C%22height%22%3A22%2C%22text%22%3A%22%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%A4%9A%E9%85%8D%E7%BD%AE%E9%A1%B9%E7%9B%AE%22%7D%2C%7B%22x%22%3A111%2C%22y%22%3A492%2C%22width%22%3A421%2C%22height%22%3A21%2C%22text%22%3A%22%E9%80%82%E7%94%A8%E4%BA%8E%E5%A4%9A%E9%85%8D%E7%BD%AE%E9%A1%B9%E7%9B%AE%2C%E4%BE%8B%E5%A6%82%E5%A4%9A%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95%2C%E5%B9%B3%E5%8F%B0%E6%8C%87%E5%AE%9A%E6%9E%84%E5%BB%BA%2C%E7%AD%89%E7%AD%89.%22%7D%2C%7B%22x%22%3A114%2C%22y%22%3A550%2C%22width%22%3A93%2C%22height%22%3A22%2C%22text%22%3A%22%7B0%5D%E6%96%87%E4%BB%B6%E5%A4%B9%22%7D%2C%7B%22x%22%3A111%2C%22y%22%3A579%2C%22width%22%3A639%2C%22height%22%3A28%2C%22text%22%3A%22CREATES%20A%20SET%20OF%20MULTIBRANCH%20PROJECT%20SUBFOLDERS%20BY%20SCANNING%20FOR%20REPOSITORIES.%22%7D%2C%7B%22x%22%3A112%2C%22y%22%3A641%2C%22width%22%3A122%2C%22height%22%3A22%2C%22text%22%3A%22%E5%A4%9A%E5%88%86%E6%94%AF%E6%B5%81%E6%B0%B4%E7%BA%BF%22%7D%2C%7B%22x%22%3A199%2C%22y%22%3A677%2C%22width%22%3A326%2C%22height%22%3A20%2C%22text%22%3A%22CM%E4%BB%93%E5%BA%93%E4%B8%AD%E6%A3%80%E6%B5%8B%E5%88%B0%E7%9A%84%E5%88%86%E6%94%AF%E5%88%9B%E5%BB%BA%E4%B8%80%E7%B3%BB%E5%88%97%E6%B5%81%E6%B0%B4%E7%BA%BF.%22%7D%2C%7B%22x%22%3A91%2C%22y%22%3A716%2C%22width%22%3A35%2C%22height%22%3A20%2C%22text%22%3A%22%E7%A1%AE%E5%AE%9A%22%7D%5D%2C%22search%22%3A%22%E8%BE%93%E5%85%A5%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%E5%90%8D%E7%A7%B0%20DEVOPS-PIPELINE-TEST%20%3E%E5%BF%85%E5%A1%AB%E9%A1%B9%20%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%E7%9A%84%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%20%E8%BF%99%E6%98%AFJENKINS%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8A%9F%E8%83%BD%2CJENKINS%E5%B0%86%E4%BC%9A%E7%BB%93%E5%90%88%E4%BB%BB%E4%BD%95%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F%E6%9D%A5%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F%E6%9D%A5%E6%9E%84%E5%BB%BA%E4%BD%A0%E7%9A%84%E9%A1%B9%E7%9B%AE%2C%E7%94%9A%E8%87%B3%E5%8F%AF%E4%BB%A5%E6%9E%84%E5%BB%BA%E8%BD%AF%E4%BB%B6%E4%BB%A5%E5%A4%96%E7%9A%84%E7%B3%BB%E7%BB%9F.%20%E6%B5%81%E6%B0%B4%E7%BA%BF%20%E7%B2%BE%E5%BF%83%E5%9C%B0%E7%BB%84%E7%BB%87%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E9%95%BF%E6%9C%9F%E8%BF%90%E8%A1%8C%E5%9C%A8%E5%A4%9A%E4%B8%AA%E8%8A%82%E7%82%B9%E4%B8%8A%E7%9A%84%E4%BB%BB%E5%8A%A1.%E9%80%82%E7%94%A8%E4%BA%8E%E6%9E%84%E5%BB%BA%E6%B5%81%E6%B0%B4%E9%95%9C(%E9%87%8D%E5%8A%A0%E6%AD%A3%E5%BC%8F%E5%9C%B0%E5%BA%94%E5%BD%93%E7%A7%B0%E4%B8%BA%E5%B7%A5%E4%BD%9C%E6%B5%81)%2C%E5%A2%9E%E5%8A%A0%E6%88%96%E8%80%85%E7%BB%84%E7%BB%87%E5%BB%BA%E4%BB%A5%E9%87%87%E7%94%A8%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%20%E7%9A%84%E4%BB%BB%E5%8A%A1%E7%B1%BB%E5%9E%8B.%20%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%A4%9A%E9%85%8D%E7%BD%AE%E9%A1%B9%E7%9B%AE%20%E9%80%82%E7%94%A8%E4%BA%8E%E5%A4%9A%E9%85%8D%E7%BD%AE%E9%A1%B9%E7%9B%AE%2C%E4%BE%8B%E5%A6%82%E5%A4%9A%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95%2C%E5%B9%B3%E5%8F%B0%E6%8C%87%E5%AE%9A%E6%9E%84%E5%BB%BA%2C%E7%AD%89%E7%AD%89.%20%7B0%5D%E6%96%87%E4%BB%B6%E5%A4%B9%20CREATES%20A%20SET%20OF%20MULTIBRANCH%20PROJECT%20SUBFOLDERS%20BY%20SCANNING%20FOR%20REPOSITORIES.%20%E5%A4%9A%E5%88%86%E6%94%AF%E6%B5%81%E6%B0%B4%E7%BA%BF%20CM%E4%BB%93%E5%BA%93%E4%B8%AD%E6%A3%80%E6%B5%8B%E5%88%B0%E7%9A%84%E5%88%86%E6%94%AF%E5%88%9B%E5%BB%BA%E4%B8%80%E7%B3%BB%E5%88%97%E6%B5%81%E6%B0%B4%E7%BA%BF.%20%E7%A1%AE%E5%AE%9A%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23f59762%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uc6294b48%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u8fd989cc%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E8%BF%9B%E5%85%A5%E9%85%8D%E7%BD%AE%E6%9C%80%E4%B8%8B%E6%96%B9%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%89%E6%8B%A9Hello%20World%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84demo%E4%BD%93%E9%AA%8C%E3%80%82%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u2a723587%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u71ba7323%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688569850526-647a1920-a7f8-4d66-941d-b53933c6ad9f.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1540%2C%22height%22%3A781%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A56940%2C%22width%22%3A1232%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22u02cc3e8a-0289-494c-8fbf-e699744fa6a%22%2C%22clientId%22%3A%22udb903c88-cbf3-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A90%2C%22y%22%3A12%2C%22width%22%3A70%2C%22height%22%3A24%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%22%7D%2C%7B%22x%22%3A89%2C%22y%22%3A81%2C%22width%22%3A40%2C%22height%22%3A20%2C%22text%22%3A%22%E5%AE%9A%E4%B9%89%22%7D%2C%7B%22x%22%3A104%2C%22y%22%3A132%2C%22width%22%3A122%2C%22height%22%3A23%2C%22text%22%3A%22PIPELINE%20SCRIPT%22%7D%2C%7B%22x%22%3A129%2C%22y%22%3A205%2C%22width%22%3A44%2C%22height%22%3A21%2C%22text%22%3A%22%E8%84%9A%E6%9C%AC%22%7D%2C%7B%22x%22%3A185%2C%22y%22%3A247%2C%22width%22%3A92%2C%22height%22%3A16%2C%22text%22%3A%22PIPELINE%22%7D%2C%7B%22x%22%3A1141%2C%22y%22%3A249%2C%22width%22%3A107%2C%22height%22%3A19%2C%22text%22%3A%22HELLOWORLD%22%7D%2C%7B%22x%22%3A230%2C%22y%22%3A267%2C%22width%22%3A74%2C%22height%22%3A13%2C%22text%22%3A%22AGENT%20ANY%22%7D%2C%7B%22x%22%3A1141%2C%22y%22%3A274%2C%22width%22%3A169%2C%22height%22%3A16%2C%22text%22%3A%22TRY%20SAMPLE%20PINELINE%22%7D%2C%7B%22x%22%3A158%2C%22y%22%3A292%2C%22width%22%3A26%2C%22height%22%3A170%2C%22text%22%3A%2234567890ML%22%7D%2C%7B%22x%22%3A1141%2C%22y%22%3A298%2C%22width%22%3A107%2C%22height%22%3A17%2C%22text%22%3A%22HELLO%20WORLD%22%7D%2C%7B%22x%22%3A230%2C%22y%22%3A302%2C%22width%22%3A64%2C%22height%22%3A14%2C%22text%22%3A%22STAGES%22%7D%2C%7B%22x%22%3A262%2C%22y%22%3A319%2C%22width%22%3A134%2C%22height%22%3A17%2C%22text%22%3A%22STAGE('HELLO)%7B%22%7D%2C%7B%22x%22%3A1143%2C%22y%22%3A324%2C%22width%22%3A146%2C%22height%22%3A17%2C%22text%22%3A%22GITHUB%2BMAVEN%22%7D%2C%7B%22x%22%3A292%2C%22y%22%3A338%2C%22width%22%3A64%2C%22height%22%3A14%2C%22text%22%3A%22STEPS%22%7D%2C%7B%22x%22%3A1144%2C%22y%22%3A346%2C%22width%22%3A145%2C%22height%22%3A19%2C%22text%22%3A%22SCRIPTEDPIPELINE%22%7D%2C%7B%22x%22%3A324%2C%22y%22%3A354%2C%22width%22%3A152%2C%22height%22%3A16%2C%22text%22%3A%22ECHO%20HELLO%20WORLD'%22%7D%2C%7B%22x%22%3A171%2C%22y%22%3A594%2C%22width%22%3A174%2C%22height%22%3A25%2C%22text%22%3A%22%E4%BD%BF%E7%94%A8GROOVY%E6%B2%99%E7%9B%92%3F%22%7D%2C%7B%22x%22%3A131%2C%22y%22%3A667%2C%22width%22%3A92%2C%22height%22%3A22%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%22%7D%2C%7B%22x%22%3A263%2C%22y%22%3A745%2C%22width%22%3A36%2C%22height%22%3A18%2C%22text%22%3A%22%E5%BA%94%E7%94%A8%22%7D%2C%7B%22x%22%3A132%2C%22y%22%3A745%2C%22width%22%3A33%2C%22height%22%3A17%2C%22text%22%3A%22%E4%BF%9D%E5%AD%98%22%7D%5D%2C%22search%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%20%E5%AE%9A%E4%B9%89%20PIPELINE%20SCRIPT%20%E8%84%9A%E6%9C%AC%20PIPELINE%20HELLOWORLD%20AGENT%20ANY%20TRY%20SAMPLE%20PINELINE%2034567890ML%20HELLO%20WORLD%20STAGES%20STAGE('HELLO)%7B%20GITHUB%2BMAVEN%20STEPS%20SCRIPTEDPIPELINE%20ECHO%20HELLO%20WORLD'%20%E4%BD%BF%E7%94%A8GROOVY%E6%B2%99%E7%9B%92%3F%20%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%20%E5%BA%94%E7%94%A8%20%E4%BF%9D%E5%AD%98%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fdfcfb%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22Er7xJ%22%2C%22name%22%3A%22h1%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u992eb432%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222%E3%80%81%E7%BC%96%E5%86%99%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22Gnocw%22%2C%22name%22%3A%22h2%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22uf46f5cd2%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.1%E3%80%81%E7%BC%96%E5%86%99%E6%95%B4%E4%BD%93%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ue83efdb5%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22udfb96c9d%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E6%95%B4%E4%BD%93%E4%BB%96%E8%84%9A%E6%9C%AC%E6%A0%BC%E5%BC%8F%E5%A6%82%E4%B8%8B%EF%BC%8C%E6%88%91%E4%BB%AC%E5%8F%AA%E8%A6%81%E5%9C%A8%E5%AF%B9%E5%BA%94%E7%9A%84%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u704b1a37%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22SNenO%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22%2F%2F%E6%89%80%E6%9C%89%E7%9A%84%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4%E9%83%BD%E6%94%BE%E5%9C%A8pipeline%E4%B8%AD%5Cnpipeline%20%7B%5Cn%20%20%20%20%2F%2F%E6%8C%87%E5%AE%9A%E4%BB%BB%E5%8A%A1%E5%9C%A8%E5%93%AA%E4%B8%AA%E9%9B%86%E7%BE%A4%E8%8A%82%E7%82%B9%E4%B8%AD%E6%89%A7%E8%A1%8C%5Cn%20%20%20%20agent%20any%5Cn%5Ct%5Cn%20%20%20%20%2F%2F%E5%A3%B0%E6%98%8E%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%8C%E6%96%B9%E4%BE%BF%E5%90%8E%E9%9D%A2%E4%BD%BF%E7%94%A8%5Cn%20%20%20%20environment%20%7B%5Cn%20%20%20%20%20%20%20%20key%20%3D%20'value'%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20stages%20%7B%5Cn%20%20%20%20%20%20%20%20stage('%E6%8B%89%E5%8F%96git%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E6%8B%89%E5%8F%96git%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20stage('%E9%80%9A%E8%BF%87maven%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E9%80%9A%E8%BF%87maven%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20stage('%E9%80%9A%E8%BF%87SonarQube%E5%81%9A%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E6%A3%80%E6%B5%8B')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E9%80%9A%E8%BF%87SonarQube%E5%81%9A%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E6%A3%80%E6%B5%8B%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20stage('%E9%80%9A%E8%BF%87Docker%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E9%80%9A%E8%BF%87Docker%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20stage('%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0Harbor%E4%BB%93%E5%BA%93')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0Harbor%E4%BB%93%E5%BA%93%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20stage('%E9%80%9A%E8%BF%87Publish%20Over%20SSH%E9%80%9A%E7%9F%A5%E7%9B%AE%E6%A0%87%E6%9C%8D%E5%8A%A1%E5%99%A8')%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20steps%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20'%E9%80%9A%E8%BF%87Publish%20Over%20SSH%E9%80%9A%E7%9F%A5%E7%9B%AE%E6%A0%87%E6%9C%8D%E5%8A%A1%E5%99%A8%20ok'%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%7D%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22HSPdM%22%2C%22name%22%3A%22h2%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ub32ad2ad%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.2%E3%80%81%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u4c94863f%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u19d54239%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E7%82%B9%E5%87%BB%E2%80%9C%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%E2%80%9D%E9%93%BE%E6%8E%A5%E8%BF%9B%E5%8E%BB%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u9daaa182%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u7f3e8238%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688571700383-eb472700-c70c-492a-bc5d-f0547a7af020.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1371%2C%22height%22%3A712%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A44887%2C%22width%22%3A1096.8%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22u61e1a648-a7d4-476e-9cb3-9f0cebb9cca%22%2C%22clientId%22%3A%22u98bb8987-139a-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A43%2C%22y%22%3A5%2C%22width%22%3A71%2C%22height%22%3A26%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%22%7D%2C%7B%22x%22%3A45%2C%22y%22%3A74%2C%22width%22%3A40%2C%22height%22%3A21%2C%22text%22%3A%22%E5%AE%9A%E4%B9%89%22%7D%2C%7B%22x%22%3A58%2C%22y%22%3A126%2C%22width%22%3A121%2C%22height%22%3A22%2C%22text%22%3A%22PIPELINE%20SCRIPT%22%7D%2C%7B%22x%22%3A85%2C%22y%22%3A200%2C%22width%22%3A41%2C%22height%22%3A20%2C%22text%22%3A%22%E8%84%9A%E6%9C%AC%22%7D%2C%7B%22x%22%3A150%2C%22y%22%3A239%2C%22width%22%3A265%2C%22height%22%3A19%2C%22text%22%3A%22%2F%2F%E6%89%80%E6%9C%89%E7%9A%84%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4%E9%83%BD%E6%94%BE%E5%9C%A8PIPELINE%E4%B8%AD%22%7D%2C%7B%22x%22%3A120%2C%22y%22%3A259%2C%22width%22%3A145%2C%22height%22%3A18%2C%22text%22%3A%222*PIPELINE%7B%22%7D%2C%7B%22x%22%3A114%2C%22y%22%3A265%2C%22width%22%3A18%2C%22height%22%3A260%2C%22text%22%3A%22123456780MNHUNNR%22%7D%2C%7B%22x%22%3A184%2C%22y%22%3A275%2C%22width%22%3A247%2C%22height%22%3A21%2C%22text%22%3A%221%2F%E6%8C%87%E5%AE%9A%E4%BB%BB%E5%8A%A1%E5%9C%A8%E5%93%AA%E4%B8%AA%E9%9B%86%E7%BE%A4%E8%8A%82%E7%82%B9%E4%B8%AD%E6%89%A7%E8%A1%8C%22%7D%2C%7B%22x%22%3A186%2C%22y%22%3A298%2C%22width%22%3A69%2C%22height%22%3A14%2C%22text%22%3A%22AGENT%20ANY%22%7D%2C%7B%22x%22%3A184%2C%22y%22%3A331%2C%22width%22%3A231%2C%22height%22%3A16%2C%22text%22%3A%22%2F%2F%E5%A3%B0%E6%98%8E%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%2C%E6%96%B9%E4%BE%BF%E5%90%8E%E9%9D%A2%E4%BD%BF%E7%94%A8%22%7D%2C%7B%22x%22%3A182%2C%22y%22%3A351%2C%22width%22%3A116%2C%22height%22%3A13%2C%22text%22%3A%22ENVIRONMENT%EF%BF%A5%22%7D%2C%7B%22x%22%3A213%2C%22y%22%3A368%2C%22width%22%3A111%2C%22height%22%3A14%2C%22text%22%3A%22KEY%20'VALUE'%22%7D%2C%7B%22x%22%3A183%2C%22y%22%3A422%2C%22width%22%3A62%2C%22height%22%3A14%2C%22text%22%3A%22STAGES%22%7D%2C%7B%22x%22%3A216%2C%22y%22%3A438%2C%22width%22%3A198%2C%22height%22%3A16%2C%22text%22%3A%22STAGE(%60%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81)%22%7D%2C%7B%22x%22%3A248%2C%22y%22%3A459%2C%22width%22%3A57%2C%22height%22%3A14%2C%22text%22%3A%22STEPS%22%7D%2C%7B%22x%22%3A281%2C%22y%22%3A472%2C%22width%22%3A208%2C%22height%22%3A20%2C%22text%22%3A%22ECHO'%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%20OK'%22%7D%2C%7B%22x%22%3A217%2C%22y%22%3A529%2C%22width%22%3A236%2C%22height%22%3A19%2C%22text%22%3A%22STAGE(%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE)%22%7D%2C%7B%22x%22%3A128%2C%22y%22%3A591%2C%22width%22%3A152%2C%22height%22%3A21%2C%22text%22%3A%22%E4%BD%BF%E7%94%A8GROOVY%E6%B2%99%E7%9B%92%22%7D%2C%7B%22x%22%3A86%2C%22y%22%3A662%2C%22width%22%3A90%2C%22height%22%3A19%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%22%7D%5D%2C%22search%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%20%E5%AE%9A%E4%B9%89%20PIPELINE%20SCRIPT%20%E8%84%9A%E6%9C%AC%20%2F%2F%E6%89%80%E6%9C%89%E7%9A%84%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4%E9%83%BD%E6%94%BE%E5%9C%A8PIPELINE%E4%B8%AD%202*PIPELINE%7B%20123456780MNHUNNR%201%2F%E6%8C%87%E5%AE%9A%E4%BB%BB%E5%8A%A1%E5%9C%A8%E5%93%AA%E4%B8%AA%E9%9B%86%E7%BE%A4%E8%8A%82%E7%82%B9%E4%B8%AD%E6%89%A7%E8%A1%8C%20AGENT%20ANY%20%2F%2F%E5%A3%B0%E6%98%8E%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%2C%E6%96%B9%E4%BE%BF%E5%90%8E%E9%9D%A2%E4%BD%BF%E7%94%A8%20ENVIRONMENT%EF%BF%A5%20KEY%20'VALUE'%20STAGES%20STAGE(%60%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81)%20STEPS%20ECHO'%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%20OK'%20STAGE(%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE)%20%E4%BD%BF%E7%94%A8GROOVY%E6%B2%99%E7%9B%92%20%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fefdfd%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uab0843f4%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ued9f6ba7%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E9%87%8C%E8%BE%B9%E6%9C%89%E5%BE%88%E5%A4%9A%E5%AE%9E%E4%BE%8B%E6%AD%A5%E9%AA%A4%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E5%85%B7%E4%BD%93%E7%9A%84%E9%9C%80%E6%B1%82%E9%80%89%E9%A1%B9%E7%94%9F%E6%88%90%EF%BC%8C%E6%AF%94%E5%A6%82%E6%88%91%E4%BB%AC%E8%A6%81%E7%94%9F%E6%88%90%E4%B8%80%E6%AE%B5git%E6%8B%89%E5%8F%96%E4%BB%A3%E7%A0%81%E7%9A%84%E8%84%9A%E6%9C%AC%EF%BC%8C%E9%80%89%E6%8B%A9%E5%A6%82%E4%B8%8B%E5%9B%BE%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ud0060316%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22ufa099e04%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688571778878-68ed5d03-c29f-4247-b769-acedef3c1610.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1501%2C%22height%22%3A711%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A72601%2C%22width%22%3A1200.8%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22ub1897d96-e2e4-45ae-91ee-1e5f4c1e4f5%22%2C%22clientId%22%3A%22u98bb8987-139a-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A55%2C%22y%22%3A24%2C%22width%22%3A49%2C%22height%22%3A23%2C%22text%22%3A%22%E6%AD%A5%E9%AA%A4%22%7D%2C%7B%22x%22%3A56%2C%22y%22%3A92%2C%22width%22%3A73%2C%22height%22%3A21%2C%22text%22%3A%22%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A145%2C%22width%22%3A212%2C%22height%22%3A19%2C%22text%22%3A%22ARCHIVEARTIFACTS%3A%E5%BD%92%E6%A1%A3%E6%88%90%E5%93%81%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A181%2C%22width%22%3A218%2C%22height%22%3A19%2C%22text%22%3A%22ARCHIVEARTIFACTS%3A%E5%BD%92%E6%A1%A3%E6%88%90%E5%93%81%22%7D%2C%7B%22x%22%3A69%2C%22y%22%3A205%2C%22width%22%3A226%2C%22height%22%3A18%2C%22text%22%3A%22BAT%3AWINDOWS%20BATCH%20SCRIPT%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A227%2C%22width%22%3A151%2C%22height%22%3A21%2C%22text%22%3A%22BUILD%3ABUILD%20AJOB%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A254%2C%22width%22%3A451%2C%22height%22%3A18%2C%22text%22%3A%22CATCHERROR%3ACATCH%20ERROR%20AND%20SET%20BUILD%20RESULT%20TO%20FAILURE%22%7D%2C%7B%22x%22%3A70%2C%22y%22%3A279%2C%22width%22%3A359%2C%22height%22%3A17%2C%22text%22%3A%22CHECKOUT%3ACHECK%20OUT%20FROM%20VERSION%20CONTROL%22%7D%2C%7B%22x%22%3A69%2C%22y%22%3A302%2C%22width%22%3A405%2C%22height%22%3A19%2C%22text%22%3A%22CLEANWS%3ADELETE%20WORKSPACE%20WHEN%20BUILD%20IS%20DONE%22%7D%2C%7B%22x%22%3A69%2C%22y%22%3A325%2C%22width%22%3A604%2C%22height%22%3A20%2C%22text%22%3A%22DELETEDIR%3A%20RECURSIVELY%20DELETE%20THE%20CURRENT%20DIRECTORY%20FROM%20THE%20WORKSPACE%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A349%2C%22width%22%3A252%2C%22height%22%3A20%2C%22text%22%3A%22DIR%3ACHANGE%20CURRENT%20DIRECTORY%22%7D%2C%7B%22x%22%3A68%2C%22y%22%3A374%2C%22width%22%3A174%2C%22height%22%3A17%2C%22text%22%3A%22ECHO%3APRINT%20MESSAGE%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A398%2C%22width%22%3A220%2C%22height%22%3A18%2C%22text%22%3A%22EMAILEXT%3AEXTENDED%20EMAIL%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A421%2C%22width%22%3A397%2C%22height%22%3A21%2C%22text%22%3A%22EMAILEXTRECIPIENTS%3AEXTENDED%20EMAIL%20RECIPIENTS%22%7D%2C%7B%22x%22%3A68%2C%22y%22%3A447%2C%22width%22%3A156%2C%22height%22%3A18%2C%22text%22%3A%22ERROR%3AERROR%20SIGNAL%22%7D%2C%7B%22x%22%3A68%2C%22y%22%3A468%2C%22width%22%3A354%2C%22height%22%3A21%2C%22text%22%3A%22FILEEXISTS%3AVERIFY%20IF%20FILE%20EXISTS%20IN%20WORKSPACE%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A494%2C%22width%22%3A367%2C%22height%22%3A19%2C%22text%22%3A%22FINDBUILDSCANS%3AFIND%20PUBLISHED%20BUILD%20SCANS%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A516%2C%22width%22%3A304%2C%22height%22%3A20%2C%22text%22%3A%22FINGERPRINT%3A%E8%AE%B0%E5%BD%95%E6%96%87%E4%BB%B6%E7%9A%84%E6%8C%87%E7%BA%B9%E7%94%A8%E4%BA%8E%E8%BF%BD%E8%B8%AA%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A540%2C%22width%22%3A74%2C%22height%22%3A21%2C%22text%22%3A%22GIT%3AGIT%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A562%2C%22width%22%3A185%2C%22height%22%3A25%2C%22text%22%3A%22INPUT%3A%E7%AD%89%E5%BE%85%E4%BA%A4%E4%BA%92%E5%BC%8F%E8%BE%93%E5%85%A5%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A586%2C%22width%22%3A389%2C%22height%22%3A23%2C%22text%22%3A%22ISUNIX%3ACHECKS%20IF%20RUNNING%20ON%20A%20UNIX-LIKE%20NODE%22%7D%2C%7B%22x%22%3A65%2C%22y%22%3A613%2C%22width%22%3A358%2C%22height%22%3A20%2C%22text%22%3A%22JUNIT%3AARCHIVE%20JUNIT-FORMATTED%20TEST%20RESULTS%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A637%2C%22width%22%3A273%2C%22height%22%3A21%2C%22text%22%3A%22LIBRARY%3ALOAD%20A%20LIBRARY%20ON%20THE%20FLY%22%7D%5D%2C%22search%22%3A%22%E6%AD%A5%E9%AA%A4%20%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4%20ARCHIVEARTIFACTS%3A%E5%BD%92%E6%A1%A3%E6%88%90%E5%93%81%20ARCHIVEARTIFACTS%3A%E5%BD%92%E6%A1%A3%E6%88%90%E5%93%81%20BAT%3AWINDOWS%20BATCH%20SCRIPT%20BUILD%3ABUILD%20AJOB%20CATCHERROR%3ACATCH%20ERROR%20AND%20SET%20BUILD%20RESULT%20TO%20FAILURE%20CHECKOUT%3ACHECK%20OUT%20FROM%20VERSION%20CONTROL%20CLEANWS%3ADELETE%20WORKSPACE%20WHEN%20BUILD%20IS%20DONE%20DELETEDIR%3A%20RECURSIVELY%20DELETE%20THE%20CURRENT%20DIRECTORY%20FROM%20THE%20WORKSPACE%20DIR%3ACHANGE%20CURRENT%20DIRECTORY%20ECHO%3APRINT%20MESSAGE%20EMAILEXT%3AEXTENDED%20EMAIL%20EMAILEXTRECIPIENTS%3AEXTENDED%20EMAIL%20RECIPIENTS%20ERROR%3AERROR%20SIGNAL%20FILEEXISTS%3AVERIFY%20IF%20FILE%20EXISTS%20IN%20WORKSPACE%20FINDBUILDSCANS%3AFIND%20PUBLISHED%20BUILD%20SCANS%20FINGERPRINT%3A%E8%AE%B0%E5%BD%95%E6%96%87%E4%BB%B6%E7%9A%84%E6%8C%87%E7%BA%B9%E7%94%A8%E4%BA%8E%E8%BF%BD%E8%B8%AA%20GIT%3AGIT%20INPUT%3A%E7%AD%89%E5%BE%85%E4%BA%A4%E4%BA%92%E5%BC%8F%E8%BE%93%E5%85%A5%20ISUNIX%3ACHECKS%20IF%20RUNNING%20ON%20A%20UNIX-LIKE%20NODE%20JUNIT%3AARCHIVE%20JUNIT-FORMATTED%20TEST%20RESULTS%20LIBRARY%3ALOAD%20A%20LIBRARY%20ON%20THE%20FLY%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fbfaf9%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u2e9b19df%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ucdd61ede%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E7%BA%BF%E4%B8%8B%E7%9B%B8%E5%85%B3%E7%9A%84git%E4%BF%A1%E6%81%AF%E5%90%8E%EF%BC%8C%E7%9B%B4%E6%8E%A5%E7%82%B9%E5%87%BB%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%E5%8D%B3%E5%8F%AF%E3%80%82%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u72bcd70b%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u5a1a6c9e%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688572031010-16234c09-5b58-47dc-8c0d-44a176681b05.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1489%2C%22height%22%3A396%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A22055%2C%22width%22%3A1191.2%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22ud176abbd-e3b3-4e3d-a486-ecfc0adc71f%22%2C%22clientId%22%3A%22u98bb8987-139a-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A131%2C%22y%22%3A23%2C%22width%22%3A190%2C%22height%22%3A22%2C%22text%22%3A%22INCLUDE%20IN%20POLLING%3F%22%7D%2C%7B%22x%22%3A132%2C%22y%22%3A93%2C%22width%22%3A199%2C%22height%22%3A21%2C%22text%22%3A%22INCLUDE%20IN%20CHANGELOG%3F%22%7D%2C%7B%22x%22%3A78%2C%22y%22%3A171%2C%22width%22%3A110%2C%22height%22%3A17%2C%22text%22%3A%22%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%2C%22search%22%3A%22INCLUDE%20IN%20POLLING%3F%20INCLUDE%20IN%20CHANGELOG%3F%20%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fefcfa%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22cMTkF%22%2C%22name%22%3A%22h2%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ue2f8e029%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.3%E3%80%81%E5%B0%86%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%E6%94%BE%E5%88%B0git%E4%B8%8A%E7%AE%A1%E7%90%86%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ub4dcf1be%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ub22eb066%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E4%B8%BA%E4%BA%86%E6%96%B9%E4%BE%BF%E7%BB%B4%E6%8A%A4%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%EF%BC%8C%E6%88%91%E4%BB%AC%E8%BF%98%E5%8F%AF%E4%BB%A5%E5%B0%86%E8%84%9A%E6%9C%AC%E6%94%BE%E5%88%B0git%E4%B8%8A%EF%BC%8C%E9%9C%80%E8%A6%81%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%A0%B9%E7%9B%AE%E5%BD%95%E5%A2%9E%E5%8A%A0Jenkinsfile%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B0%86%E5%AF%B9%E5%BA%94%E7%9A%84%E8%84%9A%E6%9C%AC%E6%94%BE%E5%88%B0%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E5%8D%B3%E5%8F%AF%E3%80%82%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ue1b4d4ed%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22ub26e3067%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688601950322-ac1da030-d3dc-4c1f-a36b-25855bfd4f87.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1346%2C%22height%22%3A748%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A41742%2C%22width%22%3A1076.8%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22uf7724fbc-eb1d-4965-bb83-71c4cf74be2%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A27%2C%22y%22%3A13%2C%22width%22%3A71%2C%22height%22%3A25%2C%22text%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%22%7D%2C%7B%22x%22%3A27%2C%22y%22%3A81%2C%22width%22%3A40%2C%22height%22%3A19%2C%22text%22%3A%22%E5%AE%9A%E4%B9%89%22%7D%2C%7B%22x%22%3A38%2C%22y%22%3A131%2C%22width%22%3A215%2C%22height%22%3A21%2C%22text%22%3A%22PIPELINE%20SCRIPT%20FROM%20SCM%22%7D%2C%7B%22x%22%3A70%2C%22y%22%3A206%2C%22width%22%3A43%2C%22height%22%3A19%2C%22text%22%3A%22SCM%22%7D%2C%7B%22x%22%3A81%2C%22y%22%3A259%2C%22width%22%3A27%2C%22height%22%3A17%2C%22text%22%3A%22GIT%22%7D%2C%7B%22x%22%3A109%2C%22y%22%3A331%2C%22width%22%3A107%2C%22height%22%3A21%2C%22text%22%3A%22REPOSITORIES%22%7D%2C%7B%22x%22%3A131%2C%22y%22%3A399%2C%22width%22%3A132%2C%22height%22%3A21%2C%22text%22%3A%22REPOSITORY%20URL%22%7D%2C%7B%22x%22%3A142%2C%22y%22%3A448%2C%22width%22%3A406%2C%22height%22%3A25%2C%22text%22%3A%22HTTP%3A%2F%2F192.168.88.125%3A8929%2FROOT%2FDEVOPS-TEST.GIT%22%7D%2C%7B%22x%22%3A241%2C%22y%22%3A524%2C%22width%22%3A17%2C%22height%22%3A20%2C%22text%22%3A%22%3F%22%7D%2C%7B%22x%22%3A133%2C%22y%22%3A526%2C%22width%22%3A95%2C%22height%22%3A19%2C%22text%22%3A%22CREDENTIALS%22%7D%2C%7B%22x%22%3A151%2C%22y%22%3A577%2C%22width%22%3A38%2C%22height%22%3A20%2C%22text%22%3A%22%E6%97%A0%22%7D%2C%7B%22x%22%3A68%2C%22y%22%3A709%2C%22width%22%3A35%2C%22height%22%3A20%2C%22text%22%3A%22%E4%BF%9D%E5%AD%98%22%7D%2C%7B%22x%22%3A201%2C%22y%22%3A711%2C%22width%22%3A35%2C%22height%22%3A17%2C%22text%22%3A%22%E5%BA%94%E7%94%A8%22%7D%5D%2C%22search%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%20%E5%AE%9A%E4%B9%89%20PIPELINE%20SCRIPT%20FROM%20SCM%20SCM%20GIT%20REPOSITORIES%20REPOSITORY%20URL%20HTTP%3A%2F%2F192.168.88.125%3A8929%2FROOT%2FDEVOPS-TEST.GIT%20%3F%20CREDENTIALS%20%E6%97%A0%20%E4%BF%9D%E5%AD%98%20%E5%BA%94%E7%94%A8%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fefaf8%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22XKpzV%22%2C%22name%22%3A%22h2%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u561b1d77%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4%E3%80%81%E5%88%B6%E4%BD%9C%E5%AE%8C%E6%95%B4%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22jrXru%22%2C%22name%22%3A%22h3%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u79b5dada%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4.1%E3%80%81%E6%8B%89%E5%8F%96git%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u379a7f2e%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ua336d8cd%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E9%80%9A%E8%BF%87%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u4f084c6b%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%7D%2C%22data%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95-%3E%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4-%3E%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u6bfeeb8a%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%2C%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22checkout%3A%20Check%20out%20from%20version%20control%3E%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22udfed2b69%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u90c9431e%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22%E7%94%9F%E6%88%90%E7%9A%84%E8%84%9A%E6%9C%AC%E5%A6%82%E4%B8%8B%EF%BC%8C%E5%85%B6%E4%B8%AD%24tag%E4%B8%BA%E4%B8%8A%E6%96%87%E5%AE%9A%E4%B9%89%E7%9A%84%E6%A0%87%E7%AD%BE%E5%90%8D%E7%A7%B0%3A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u6ed2a440%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22JIGdC%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22checkout%20scmGit(branches%3A%20%5B%5Bname%3A%20'%24tag'%5D%5D%2C%20extensions%3A%20%5B%5D%2C%20userRemoteConfigs%3A%20%5B%5Burl%3A%20'http%3A%2F%2F192.168.88.125%3A8929%2Froot%2Fdevops-test.git'%5D%5D)%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uf52e3e59%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ufb6e9064%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E5%B0%86%E5%85%B6%E7%B2%98%E8%B4%B4%E5%88%B0Jenkinsfile%E6%96%87%E4%BB%B6%E4%B8%AD%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uedc82dbf%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22ufecec94a%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688604999699-d30bba0d-413f-4e9e-9671-5a3a5b150f05.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1373%2C%22height%22%3A221%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A24032%2C%22width%22%3A1098.4%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22ube6462f8-bc06-4dbb-85ea-8527148fde6%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A4%2C%22y%22%3A4%2C%22width%22%3A237%2C%22height%22%3A25%2C%22text%22%3A%22STAGE('%E6%8B%89%E5%8F%96%E4%BB%A3%E7%A0%81')%22%7D%2C%7B%22x%22%3A62%2C%22y%22%3A38%2C%22width%22%3A71%2C%22height%22%3A18%2C%22text%22%3A%22STEPS%22%7D%2C%7B%22x%22%3A177%2C%22y%22%3A57%2C%22width%22%3A327%2C%22height%22%3A28%2C%22text%22%3A%22%E5%BC%80%E5%A7%8B%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%22%7D%2C%7B%22x%22%3A118%2C%22y%22%3A62%2C%22width%22%3A87%2C%22height%22%3A22%2C%22text%22%3A%22ECHO%20LI%22%7D%2C%7B%22x%22%3A157%2C%22y%22%3A86%2C%22width%22%3A1150%2C%22height%22%3A24%2C%22text%22%3A%22ECKOUT%20SCNGIT(BRANCHES%3A%20%5B%5BNAME%3A%20ISTAG'LL%2C%20EXTENSIONS%3A%20%5BL%2C%20USERREMOTECONFIGS%3A%20%5B%5B%5B%5B%5BURL%3B%22%7D%2C%7B%22x%22%3A118%2C%22y%22%3A92%2C%22width%22%3A48%2C%22height%22%3A17%2C%22text%22%3A%22CHEQ%22%7D%2C%7B%22x%22%3A130%2C%22y%22%3A116%2C%22width%22%3A702%2C%22height%22%3A24%2C%22text%22%3A%22(HTTP%3A%2F%2F192.168.88.125%3A8929%2FROOT%2FDEVOPS-TEST.GIT'11)%22%7D%2C%7B%22x%22%3A192%2C%22y%22%3A140%2C%22width%22%3A358%2C%22height%22%3A23%2C%22text%22%3A%22%E5%BC%80%E5%A7%8B%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%E5%AE%8C%E6%AF%95.%22%7D%2C%7B%22x%22%3A119%2C%22y%22%3A145%2C%22width%22%3A53%2C%22height%22%3A17%2C%22text%22%3A%22ECHO%22%7D%2C%7B%22x%22%3A61%2C%22y%22%3A170%2C%22width%22%3A15%2C%22height%22%3A23%2C%22text%22%3A%22%E4%BA%86%22%7D%5D%2C%22search%22%3A%22STAGE('%E6%8B%89%E5%8F%96%E4%BB%A3%E7%A0%81')%20STEPS%20%E5%BC%80%E5%A7%8B%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%20ECHO%20LI%20ECKOUT%20SCNGIT(BRANCHES%3A%20%5B%5BNAME%3A%20ISTAG'LL%2C%20EXTENSIONS%3A%20%5BL%2C%20USERREMOTECONFIGS%3A%20%5B%5B%5B%5B%5BURL%3B%20CHEQ%20(HTTP%3A%2F%2F192.168.88.125%3A8929%2FROOT%2FDEVOPS-TEST.GIT'11)%20%E5%BC%80%E5%A7%8B%E6%8B%89%E5%8F%96GIT%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%E5%AE%8C%E6%AF%95.%20ECHO%20%E4%BA%86%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fbf9f8%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22JBDdv%22%2C%22name%22%3A%22h3%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u5f9e7721%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4.2%E3%80%81%E9%80%9A%E8%BF%87maven%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u5e110e05%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u48369135%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E9%80%9A%E8%BF%87%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u487c647b%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%7D%2C%22data%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95-%3E%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4-%3E%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u619ef007%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%2C%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22sh%3A%20Shell%20Script%3E%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u9b795289%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u2cf16092%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22%E5%85%B6%E4%B8%ADSell%20Script%E8%BE%93%E5%85%A5%E4%BB%A5%E4%B8%8B%E6%89%93%E5%8C%85%E5%8E%9F%E5%A7%8B%E8%84%9A%E6%9C%AC%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u68fe14b8%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22JrJ14%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22%2Fvar%2Fjenkins_home%2Fmaven%2Fbin%2Fmvn%20clean%20package%20-DskipTests%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uc6874513%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ua379c823%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22%E7%94%9F%E6%88%90%E7%9A%84%E8%84%9A%E6%9C%AC%E5%A6%82%E4%B8%8B%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uddd0247b%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u3b188091%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688605871951-bc038a53-f387-470c-9c4a-b5861220ad0f.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1426%2C%22height%22%3A762%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A30076%2C%22width%22%3A1140.8%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22uc8afe2d7-70a2-4d70-8e9e-38064e927ea%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A25%2C%22y%22%3A4%2C%22width%22%3A48%2C%22height%22%3A24%2C%22text%22%3A%22%E6%AD%A5%E9%AA%A4%22%7D%2C%7B%22x%22%3A25%2C%22y%22%3A74%2C%22width%22%3A73%2C%22height%22%3A20%2C%22text%22%3A%22%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4%22%7D%2C%7B%22x%22%3A36%2C%22y%22%3A125%2C%22width%22%3A126%2C%22height%22%3A21%2C%22text%22%3A%22SH%3ASHELL%20SCRIPT%22%7D%2C%7B%22x%22%3A66%2C%22y%22%3A202%2C%22width%22%3A23%2C%22height%22%3A17%2C%22text%22%3A%22SH%22%7D%2C%7B%22x%22%3A67%2C%22y%22%3A277%2C%22width%22%3A119%2C%22height%22%3A22%2C%22text%22%3A%22SHELL%20SCRIPT%3F%22%7D%2C%7B%22x%22%3A78%2C%22y%22%3A324%2C%22width%22%3A527%2C%22height%22%3A27%2C%22text%22%3A%22%2FVAR%2FJENKINS_HOME%2FMAVEN%2FBIN%2FMVN%20CLEAN%20PACKAGE-DSKIPTESTS%22%7D%2C%7B%22x%22%3A82%2C%22y%22%3A499%2C%22width%22%3A37%2C%22height%22%3A19%2C%22text%22%3A%22%E9%AB%98%E7%BA%A7%22%7D%2C%7B%22x%22%3A52%2C%22y%22%3A580%2C%22width%22%3A108%2C%22height%22%3A18%2C%22text%22%3A%22%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%2C%7B%22x%22%3A38%2C%22y%22%3A631%2C%22width%22%3A555%2C%22height%22%3A25%2C%22text%22%3A%22SH'%2FVAR%2FJENKINS%20HOME%2FMAVEN%2FBIN%2FBIN%2FMVN%20CLEAN%20PACKAGE%20-DSKIPTESTS%5C%22%22%7D%5D%2C%22search%22%3A%22%E6%AD%A5%E9%AA%A4%20%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4%20SH%3ASHELL%20SCRIPT%20SH%20SHELL%20SCRIPT%3F%20%2FVAR%2FJENKINS_HOME%2FMAVEN%2FBIN%2FMVN%20CLEAN%20PACKAGE-DSKIPTESTS%20%E9%AB%98%E7%BA%A7%20%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%20SH'%2FVAR%2FJENKINS%20HOME%2FMAVEN%2FBIN%2FBIN%2FMVN%20CLEAN%20PACKAGE%20-DSKIPTESTS%5C%22%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fefcfb%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uaace90eb%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u8a67f4b5%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E7%94%9F%E6%88%90%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%E5%A6%82%E4%B8%8B%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ufab18b59%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22yx2nz%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22sh%20'%2Fvar%2Fjenkins_home%2Fmaven%2Fbin%2Fmvn%20clean%20package%20-DskipTests'%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uaec13e9d%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ufe2ae6e6%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E5%B0%86%E5%85%B6%E7%B2%98%E8%B4%B4%E5%88%B0Jenkinsfile%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AF%B9%E5%BA%94%E7%9A%84%E6%AD%A5%E9%AA%A4%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u74c98407%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22u171b4871%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688606098514-77c7299b-2dd3-48ce-bd9d-e6041455152d.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1210%2C%22height%22%3A202%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A18950%2C%22width%22%3A968%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22uf0ae1aa3-538c-4f60-be14-d80e16ed78b%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A34%2C%22y%22%3A11%2C%22width%22%3A267%2C%22height%22%3A25%2C%22text%22%3A%22STAGE((%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE)%22%7D%2C%7B%22x%22%3A91%2C%22y%22%3A43%2C%22width%22%3A98%2C%22height%22%3A19%2C%22text%22%3A%22STEPS%20I%22%7D%2C%7B%22x%22%3A151%2C%22y%22%3A65%2C%22width%22%3A406%2C%22height%22%3A28%2C%22text%22%3A%22ECHO%20%E5%BC%80%E5%A7%8B%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE...........................................%22%7D%2C%7B%22x%22%3A848%2C%22y%22%3A95%2C%22width%22%3A160%2C%22height%22%3A19%2C%22text%22%3A%22-DSKIPTESTS%22%7D%2C%7B%22x%22%3A145%2C%22y%22%3A97%2C%22width%22%3A691%2C%22height%22%3A20%2C%22text%22%3A%22SH%20'%2FVAR%2FJENKINS%20HOME%2FMAVEN%2FBIN%2FMVN%20CLEAN%20PACKAGE%22%7D%2C%7B%22x%22%3A145%2C%22y%22%3A120%2C%22width%22%3A387%2C%22height%22%3A23%2C%22text%22%3A%22ECHO%20%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%AE%8C%E6%AF%95%22%7D%5D%2C%22search%22%3A%22STAGE((%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE)%20STEPS%20I%20ECHO%20%E5%BC%80%E5%A7%8B%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE...........................................%20-DSKIPTESTS%20SH%20'%2FVAR%2FJENKINS%20HOME%2FMAVEN%2FBIN%2FMVN%20CLEAN%20PACKAGE%20ECHO%20%E9%80%9A%E8%BF%87MAVEN%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%AE%8C%E6%AF%95%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fbfaf9%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22afi9J%22%2C%22name%22%3A%22h3%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u9b20c4b2%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4.3%E3%80%81%E9%80%9A%E8%BF%87Docker%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u10319690%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u6d7a494d%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E5%90%8C%E7%90%86%EF%BC%8C%E5%8E%9F%E5%A7%8B%E8%84%9A%E6%9C%AC%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u8dc309b6%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22fA2Kx%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22mv%20.%2Ftarget%2F*.jar%20.%2Fdocker%2F%5Cndocker%20build%20-t%20%24%7BJOB_NAME%7D%3A%24%7Btag%7D%20.%2Fdocker%2F%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uc379e72b%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u4fb40df8%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E7%94%9F%E6%88%90%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%E5%A6%82%E4%B8%8B%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u56792f12%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22oo3G0%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22sh%20'''mv%20.%2Ftarget%2F*.jar%20.%2Fdocker%2F%5Cndocker%20build%20-t%20%24%7BJOB_NAME%7D%3A%24%7Btag%7D%20.%2Fdocker%2F'''%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ud9f22ce9%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22uc1cfd1c2%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688606790762-291ea514-d2de-4521-9db3-435899332db1.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1044%2C%22height%22%3A229%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A22534%2C%22width%22%3A835.2%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22u9fab5676-e0e1-4362-a546-e777cd2ce5d%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A6%2C%22y%22%3A8%2C%22width%22%3A241%2C%22height%22%3A27%2C%22text%22%3A%22STAGE('%E5%88%B6%E4%BD%9C%E9%95%9C%E5%83%8F)%22%7D%2C%7B%22x%22%3A64%2C%22y%22%3A41%2C%22width%22%3A95%2C%22height%22%3A18%2C%22text%22%3A%22STEPS%20F%22%7D%2C%7B%22x%22%3A193%2C%22y%22%3A62%2C%22width%22%3A389%2C%22height%22%3A24%2C%22text%22%3A%22%E9%80%9A%E8%BF%87DOCKER%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%22%7D%2C%7B%22x%22%3A120%2C%22y%22%3A67%2C%22width%22%3A55%2C%22height%22%3A17%2C%22text%22%3A%22ECHO%22%7D%2C%7B%22x%22%3A174%2C%22y%22%3A89%2C%22width%22%3A410%2C%22height%22%3A25%2C%22text%22%3A%22LI'MV%20.%2FTARGET%2F*.JAR%20.%2FDOCKER%2F%22%7D%2C%7B%22x%22%3A121%2C%22y%22%3A94%2C%22width%22%3A27%2C%22height%22%3A16%2C%22text%22%3A%22SH%22%7D%2C%7B%22x%22%3A121%2C%22y%22%3A112%2C%22width%22%3A655%2C%22height%22%3A35%2C%22text%22%3A%22DOCKER%20BUILD%20-T%20%24%5BJOB%20NAME%5D%3A%24%5BTAG)%20.%2FDOCKER%2F'IT%22%7D%2C%7B%22x%22%3A121%2C%22y%22%3A141%2C%22width%22%3A482%2C%22height%22%3A25%2C%22text%22%3A%22ECHO'%E9%80%9A%E8%BF%87DOCKER%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%E5%AE%8C%E6%AF%95%22%7D%5D%2C%22search%22%3A%22STAGE('%E5%88%B6%E4%BD%9C%E9%95%9C%E5%83%8F)%20STEPS%20F%20%E9%80%9A%E8%BF%87DOCKER%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%20ECHO%20LI'MV%20.%2FTARGET%2F*.JAR%20.%2FDOCKER%2F%20SH%20DOCKER%20BUILD%20-T%20%24%5BJOB%20NAME%5D%3A%24%5BTAG)%20.%2FDOCKER%2F'IT%20ECHO'%E9%80%9A%E8%BF%87DOCKER%E5%88%B6%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89%E9%95%9C%E5%83%8F%E5%AE%8C%E6%AF%95%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23fbfaf8%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22h38ki%22%2C%22name%22%3A%22h3%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u9ae39e9d%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4.4%E3%80%81%E6%8E%A8%E9%80%81%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E5%88%B0Harbor%E4%BB%93%E5%BA%93%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ucc7b7fed%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u0e6fc78b%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E5%90%8C%E7%90%86%EF%BC%8C%E5%8E%9F%E5%A7%8B%E8%84%9A%E6%9C%AC%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ub2859f63%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22ciJMQ%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22docker%20login%20-u%20%24%7BharborUser%7D%20-p%20%24%7BharborPassword%7D%20%24%7BharborAddress%7D%5Cndocker%20tag%20%24%7BJOB_NAME%7D%3A%24%7Btag%7D%20%24%7BharborAddress%7D%2F%24%7BharborRepo%7D%2F%24%7BJOB_NAME%7D%3A%24%7Btag%7D%5Cndocker%20push%20%24%7BharborAddress%7D%2F%24%7BharborRepo%7D%2F%24%7BJOB_NAME%7D%3A%24%7Btag%7D%5Cndocker%20image%20prune%20-f%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ub4191cbf%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u3e7de775%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E5%85%B6%E4%B8%AD%EF%BC%8C%24%7BharborUser%7D%20%E3%80%81%24%7BharborPassword%7D%E3%80%81%24%7BharborAddress%7D%E3%80%81%24%7BharborRepo%7D%E4%B8%BAJenkinsfile%E5%A4%B4%E9%83%A8%E5%A3%B0%E6%98%8E%E7%9A%84%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%8C%E5%8D%B3Harbor%E7%9A%84%E4%BF%A1%E6%81%AF%E3%80%82%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u9e60df4a%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22uded8529e%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E7%94%9F%E6%88%90%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%E5%A6%82%E4%B8%8B%EF%BC%9A%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22uff3bc6e8%22%2C%22name%22%3A%22hole%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22iP74r%22%2C%22name%22%3A%22codeblock%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22mode%22%3A%22shell%22%2C%22code%22%3A%22sh%20'''docker%20login%20-u%20%24%7BharborUser%7D%20-p%20%24%7BharborPassword%7D%20%24%7BharborAddress%7D%5Cndocker%20tag%20%24%7BJOB_NAME%7D%3A%24%7Btag%7D%20%24%7BharborAddress%7D%2F%24%7BharborRepo%7D%2F%24%7BJOB_NAME%7D%3A%24%7Btag%7D%5Cndocker%20push%20%24%7BharborAddress%7D%2F%24%7BharborRepo%7D%2F%24%7BJOB_NAME%7D%3A%24%7Btag%7D%5Cndocker%20image%20prune%20-f'''%22%2C%22autoWrap%22%3Afalse%2C%22lineNumbers%22%3Atrue%2C%22heightLimit%22%3Atrue%2C%22collapsed%22%3Afalse%2C%22hideToolbar%22%3Afalse%2C%22name%22%3A%22%22%2C%22tabSize%22%3Anull%2C%22indentWithTab%22%3Afalse%2C%22lightLines%22%3A%5B%5D%2C%22foldLines%22%3A%5B%5D%2C%22theme%22%3A%22Github%20Light%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22block%22%7D%2C%22cardType%22%3A%22block%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22u2c284509%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22udc1dfd32%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688627568103-206cda98-6d7e-4a3b-bdda-148f29821aa2.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1271%2C%22height%22%3A248%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A31121%2C%22width%22%3A1016.8%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22u22edce07-280f-42c8-9f92-9bbde84a766%22%2C%22clientId%22%3A%22uab39175f-99c6-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A3%2C%22y%22%3A3%2C%22width%22%3A247%2C%22height%22%3A25%2C%22text%22%3A%22STAGE(%20%E6%8E%A8%E9%80%81%E9%95%9C%E5%83%8F)%22%7D%2C%7B%22x%22%3A62%2C%22y%22%3A35%2C%22width%22%3A87%2C%22height%22%3A20%2C%22text%22%3A%22STEPS%22%7D%2C%7B%22x%22%3A195%2C%22y%22%3A54%2C%22width%22%3A440%2C%22height%22%3A26%2C%22text%22%3A%22'%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0HARBOR%E4%BB%93%E5%BA%93%22%7D%2C%7B%22x%22%3A117%2C%22y%22%3A61%2C%22width%22%3A56%2C%22height%22%3A18%2C%22text%22%3A%22ECHO%22%7D%2C%7B%22x%22%3A198%2C%22y%22%3A85%2C%22width%22%3A939%2C%22height%22%3A23%2C%22text%22%3A%22'DOCKER%20LOGIN%20-U%20S(HARBORUSER!%20-P%20%24%5BHARBORPASSWORD%5D%20S%5BHARBORADDRESS!%22%7D%2C%7B%22x%22%3A116%2C%22y%22%3A84%2C%22width%22%3A71%2C%22height%22%3A23%2C%22text%22%3A%22SH%20U%22%7D%2C%7B%22x%22%3A116%2C%22y%22%3A113%2C%22width%22%3A957%2C%22height%22%3A23%2C%22text%22%3A%22DOCKER%20TAG%20%24(JOB%20NAME)%3AS(TAG)%20S(HARBORADDRESS!%2FSTHARBORREPO%7D%2FSIJOB%20NA%22%7D%2C%7B%22x%22%3A1038%2C%22y%22%3A113%2C%22width%22%3A182%2C%22height%22%3A25%2C%22text%22%3A%22B%20NAME%20J%3A%24%7BTAG%20)%22%7D%2C%7B%22x%22%3A116%2C%22y%22%3A140%2C%22width%22%3A881%2C%22height%22%3A22%2C%22text%22%3A%22DOCKER%20PUSH%20%24(HARBORADDRESS%7D%2FS%5BHARBORREPO)%2FS(JOB%20NAME%5D%3AS%5BTAG%5D'I''%22%7D%2C%7B%22x%22%3A192%2C%22y%22%3A164%2C%22width%22%3A463%2C%22height%22%3A26%2C%22text%22%3A%22%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0HARBOR%E4%BB%93%E5%BA%93%E5%AE%8C%E6%88%90%22%7D%2C%7B%22x%22%3A116%2C%22y%22%3A170%2C%22width%22%3A55%2C%22height%22%3A17%2C%22text%22%3A%22ECHO%22%7D%5D%2C%22search%22%3A%22STAGE(%20%E6%8E%A8%E9%80%81%E9%95%9C%E5%83%8F)%20STEPS%20'%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0HARBOR%E4%BB%93%E5%BA%93%20ECHO%20'DOCKER%20LOGIN%20-U%20S(HARBORUSER!%20-P%20%24%5BHARBORPASSWORD%5D%20S%5BHARBORADDRESS!%20SH%20U%20DOCKER%20TAG%20%24(JOB%20NAME)%3AS(TAG)%20S(HARBORADDRESS!%2FSTHARBORREPO%7D%2FSIJOB%20NA%20B%20NAME%20J%3A%24%7BTAG%20)%20DOCKER%20PUSH%20%24(HARBORADDRESS%7D%2FS%5BHARBORREPO)%2FS(JOB%20NAME%5D%3AS%5BTAG%5D'I''%20%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%8E%A8%E9%80%81%E5%88%B0HARBOR%E4%BB%93%E5%BA%93%E5%AE%8C%E6%88%90%20ECHO%22%2C%22crop%22%3A%5B0%2C0%2C1%2C1%5D%2C%22showTitle%22%3Afalse%2C%22title%22%3A%22%22%2C%22rotation%22%3A0%2C%22averageHue%22%3A%22%23faf9f8%22%2C%22__spacing%22%3A%22both%22%7D%2C%22cardType%22%3A%22inline%22%7D%2C%22cardType%22%3A%22inline%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22eaJWS%22%2C%22name%22%3A%22h3%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u647bb9e2%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%222.4.5%E3%80%81%E9%80%9A%E7%9F%A5%E7%9B%AE%E6%A0%87%E6%9C%8D%E5%8A%A1%E5%99%A8%20%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ue8871a41%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u68f6f85a%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E8%BF%99%E9%87%8C%E4%BD%BF%E7%94%A8Publish%20Over%20SSH%E9%80%9A%E7%9F%A5%E7%9B%AE%E6%A0%87%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%82%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22udc7f9869%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ub33eb499%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%7D%2C%22data%22%3A%22%E9%80%9A%E8%BF%87Jenkins%20%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22u4a157adc%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%7D%2C%22data%22%3A%22%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%AF%AD%E6%B3%95-%3E%E7%A4%BA%E4%BE%8B%E6%AD%A5%E9%AA%A4-%3E%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22ufc7dabc1%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%2C%22color%22%3A%22rgb(0%2C%200%2C%200)%22%7D%2C%22data%22%3A%22sshPublisher%3A%20Send%20build%20artifacts%20over%20SSH%22%7D%2C%7B%22type%22%3A%22text%22%2C%22id%22%3A%22uc5f79b84%22%2C%22name%22%3A%22%23text%22%2C%22attrs%22%3A%7B%22bold%22%3Atrue%2C%22color%22%3A%22rgb(32%2C%2033%2C%2036)%22%7D%2C%22data%22%3A%22%3E%E7%94%9F%E6%88%90%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%84%9A%E6%9C%AC%22%7D%5D%7D%2C%7B%22type%22%3A%22element%22%2C%22id%22%3A%22ua47e4fc4%22%2C%22name%22%3A%22p%22%2C%22attrs%22%3A%7B%7D%2C%22children%22%3A%5B%7B%22type%22%3A%22card%22%2C%22id%22%3A%22uc264ef91%22%2C%22name%22%3A%22image%22%2C%22attrs%22%3A%7B%22value%22%3A%7B%22src%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2023%2Fpng%2F619135%2F1688624364922-13aa3d69-e3a8-42d8-905f-efc60a406b08.png%22%2C%22original%22%3A%7B%22type%22%3A%22binary%22%2C%22from%22%3A%22paste%22%2C%22ratio%22%3A1.25%2C%22width%22%3A1227%2C%22height%22%3A528%7D%2C%22name%22%3A%22image.png%22%2C%22size%22%3A54547%2C%22width%22%3A981.6%2C%22status%22%3A%22done%22%2C%22style%22%3A%22none%22%2C%22taskId%22%3A%22ubee2639f-4d0c-4df4-9dbc-f4d48df81b7%22%2C%22clientId%22%3A%22u35064983-9549-4%22%2C%22linkExternal%22%3Atrue%2C%22ocr%22%3A%5B%7B%22x%22%3A8%2C%22y%22%3A7%2C%22width%22%3A178%2C%22height%22%3A22%2C%22text%22%3A%22NODE%3A%20ALLOCATE%20NODE%22%7D%2C%7B%22x%22%3A8%2C%22y%22%3A32%2C%22width%22%3A232%2C%22height%22%3A21%2C%22text%22%3A%22PARALLEL%3AEXECUTE%20IN%20PARALLEL%22%7D%2C%7B%22x%22%3A8%2C%22y%22%3A57%2C%22width%22%3A341%2C%22height%22%3A20%2C%22text%22%3A%22POWERSHELL%3A%20WINDOWS%20POWERSHELL%20SCRIPT%22%7D%2C%7B%22x%22%3A9%2C%22y%22%3A81%2C%
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;font-family: PingFangSC-regular, sans-serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;text-align: left;"> <h1 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 24px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">引言</span><span style="display: none;"></span></h1> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">背景:预算不足,项目终止。</p> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">计划:停止服务 </p> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">方案:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 15px;line-height: 1.8em;letter-spacing: 0em;"> 代码备份、流水线配置备份 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 15px;line-height: 1.8em;letter-spacing: 0em;"> 备份数据库、ngnix、redis、nacos等中间件相关配置文件。 <img class="rich_pages wxw-img" data-imgfileid="100014550" data-ratio="0.47129629629629627" src="/upload/0f62a0ee9683e6cc21d28ae85ee9c2ff.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;"> </section></li> </ul> <h1 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 24px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">I 文件备份</span><span style="display: none;"></span></h1> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014552" data-ratio="0.5481481481481482" src="/upload/2454a2585c31cff64a9dcc3fb6851a6b.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">1.1 数据库文件/证书</span><span style="display: none;"></span></h2> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014551" data-ratio="0.49444444444444446" src="/upload/58855898a1a4e4fe5edee0e2dfcd2693.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">可从宝塔面板下载证书、数据库等文件。<img class="rich_pages wxw-img" data-imgfileid="100014548" data-ratio="0.2712962962962963" src="/upload/bc4131f0fefc0a28ea0f0b1100d84070.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;"></p> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">1.2 redis</span><span style="display: none;"></span></h2> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">redis持久化操作</p> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 1、进入redis的配置文件目录</span><br><span style="color: #e6c07b;line-height: 26px;">cd</span> /mydata/redis/conf/<br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 2、猫一眼此时的配置文件内容,没错,是空的</span><br>cat redis.conf<br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 3、编辑该配置文件,设置数据持久化</span><br>vim redis.conf<br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 4、进入该文件的插入模式,将下面的代码复制进去</span><br>appendonly yes<br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 5、保存并退出【先按[Esc]键】</span><br>:wq<br><br><br></code></pre> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">redis.conf</p> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;">[root@iZbp1554676oowtsluc7nkZ conf]<span style="color: #5c6370;font-style: italic;line-height: 26px;"># cat redis.conf</span><br>requirepass 8888_prod<br>appendonly yes<br>appendfsync no<br>maxclients 1000 <br>timeout 300 <br>tcp-keepalive 60<br></code></pre> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">创建容器</p> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;">docker run -p 6379:6379 --name redis -e <span style="color: #98c379;line-height: 26px;">"TZ=Asia/Shanghai"</span> --restart=on-failure:3 -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -v /app/D/code/<span style="color: #e6c07b;line-height: 26px;">log</span>/redis.log:/app/D/code/<span style="color: #e6c07b;line-height: 26px;">log</span>/redis.log -d redis redis-server /etc/redis/redis.conf<br><br></code></pre> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;">docker run -it --name redis_6379 -p 6379:6379 -v /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/software/redis/6379/conf/redis.conf:/usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/etc/redis/redis.conf -v /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/software/redis/6379/data/:/data -v /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/software/redis/6379/<span style="color: #e6c07b;line-height: 26px;">log</span>/redis.log:/var/<span style="color: #e6c07b;line-height: 26px;">log</span>/redis.log -d redis:6.2.7 /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/etc/redis/redis.conf<br><br><br></code></pre> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014549" data-ratio="0.23333333333333334" src="/upload/35bcbd2b74f7ab7baa3e86dbf3f4b77e.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">HostConfig</p> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"> <span style="color: #98c379;line-height: 26px;">"HostConfig"</span>: {<br> <span style="color: #98c379;line-height: 26px;">"Binds"</span>: [<br> <span style="color: #98c379;line-height: 26px;">"/mydata/redis/data:/data"</span>,<br> <span style="color: #98c379;line-height: 26px;">"/mydata/redis/conf/redis.conf:/etc/redis/redis.conf"</span>,<br> <span style="color: #98c379;line-height: 26px;">"/app/D/code/log/redis.log:/app/D/code/log/redis.log"</span><br> ],<br> <span style="color: #98c379;line-height: 26px;">"PortBindings"</span>: {<br> <span style="color: #98c379;line-height: 26px;">"6379/tcp"</span>: [<br> {<br> <span style="color: #98c379;line-height: 26px;">"HostIp"</span>: <span style="color: #98c379;line-height: 26px;">""</span>,<br> <span style="color: #98c379;line-height: 26px;">"HostPort"</span>: <span style="color: #98c379;line-height: 26px;">"6379"</span><br> }<br> ]<br> },<br></code></pre> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">1.3 nacos</span><span style="display: none;"></span></h2> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;">docker pull zhusaidong/nacos-server-m1:2.0.3<br><br>docker run -d -p 8848:8848 --env MODE=standalone --name nacos zhusaidong/nacos-server-m1:2.0.3<br><br>docker run --env MODE=standalone --name nacos -d -p 8848:8848 --restart=always nacos/nacos-server:latest<br><br><br></code></pre> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">外接mysql,docker部署方式</p> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;">docker run --env NACOS_APPLICATION_PORT=8848 --env MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=xxx -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_USER=wcp -e MYSQL_SERVICE_PASSWORD=<span style="color: #98c379;line-height: 26px;">'hwWwR'</span> -e MYSQL_SERVICE_DB_NAME=nacos_config -v /mydata/nacos/conf/:/home/nacos/conf --name nacos -d -p 8848:8848 --restart=on-failure:3 nacos/nacos-server:latest<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#on-failure:3</span><br><br></code></pre> <p data-tool="mdnice编辑器" style="font-size: 15px;line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">https://blog.csdn.net/z929118967/article/details/132918836</p> <h1 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 24px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">II JAVA流水线备份</span><span style="display: none;"></span></h1> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014556" data-ratio="0.2814814814814815" src="/upload/9a7da9bf7e2f4241d9b2631d3b61ae91.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">2.1 java构建</span><span style="display: none;"></span></h2> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014557" data-ratio="0.9611231101511879" src="/upload/8dd1d2a77c3cd15c4781d10f55fa44e8.png" data-type="png" data-w="926" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">2.2 镜像构建</span><span style="display: none;"></span></h2> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014553" data-ratio="0.7383966244725738" src="/upload/5a2d70fa44a2fc5696082ab22f832f73.png" data-type="png" data-w="948" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">2.3 docker 部署</span><span style="display: none;"></span></h2> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;">#部署脚本会在部署组的每台机器上执行。一个典型Docker部署脚本如下:</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#示例中使用的$image是您在脚本下方的变量处定义的变量(上游输出或自定义)</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#docker run $image</span><br><span style="color: #e6c07b;line-height: 26px;">echo</span> <span style="color: #d19a66;line-height: 26px;">$DOCKER_PASSWORD</span> | docker login --username <span style="color: #d19a66;line-height: 26px;">$DOCKER_USERNAME</span> --password-stdin registry.cn-hangzhou.aliyuncs.com<br>docker stop web-api<br>docker rm web-api<br>docker run -v /nfs:/nfs --name web-api -d --net=host <span style="color: #d19a66;line-height: 26px;">$image</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># docker run --name -d --net=host $image</span><br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># docker run --name web-api -d -p 7005:7005 $image</span><br><br>docker update web-api --restart=on-failure:3<br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># docker rmi $(docker images -qa)</span><br>docker rmi $(docker images -qa) 2>/dev/null<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#不打印错误输出,不换行后续没指令也会报错,但文件能写入成功。</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#如果想要不报错,在后面加上其他指令即可:</span><br><span style="color: #e6c07b;line-height: 26px;">echo</span> <span style="color: #98c379;line-height: 26px;">"执行完毕"</span><br></code></pre> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">2.4 子模块构建</span><span style="display: none;"></span></h2> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014555" data-ratio="0.47874720357941836" src="/upload/2e2eed3aac995dc6474a8ccd489d7233.png" data-type="png" data-w="894" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"># maven build default command</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip</span><br>mvn clean install org.apache.maven.plugins:maven-deploy-plugin:2.8:deploy -DskipTests<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># gradle build default command</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># ./gradlew build</span><br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># ant build default command</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># ant</span><br><br></code></pre> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">2.5 Dockerfile_prod</span><span style="display: none;"></span></h2> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"># FROM openjdk:8-jdk</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># FROM registry.cn-hangzhou.aliyuncs.com/dontony/public:openjdk-8-jdk-alpine-cn</span><br>FROM registry.cn-beijing.aliyuncs.com/hub-mirrors/openjdk:8-jdk-alpine<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 设置上海时区</span><br>ENV TZ=Asia/Shanghai<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 开放端口</span><br>EXPOSE 7005<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 指定工作目录</span><br>WORKDIR /app<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># 将当前目录下的jar包复制道镜像中的/app目录下</span><br>COPY target/web-api-1.0-SNAPSHOT.jar .<br><br>RUN chown 1001:0 -R /app && chmod 775 -R /app<br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;"># java启动jar包</span><br>ENTRYPOINT [<span style="color: #98c379;line-height: 26px;">"java"</span>,<span style="color: #98c379;line-height: 26px;">"-Djava.security.egd=file:/dev/./urandom"</span>,<span style="color: #98c379;line-height: 26px;">"-Dfile.encoding=UTF8"</span>,<span style="color: #98c379;line-height: 26px;">"-Dsun.jnu.encoding=UTF8"</span>,<span style="color: #98c379;line-height: 26px;">"-jar"</span>,<span style="color: #98c379;line-height: 26px;">"-Xms2048m"</span>,<span style="color: #98c379;line-height: 26px;">"-Xmx4096m"</span>,<span style="color: #98c379;line-height: 26px;">"web-api-1.0-SNAPSHOT.jar"</span>,<span style="color: #98c379;line-height: 26px;">"--spring.profiles.active=prod"</span>]<br></code></pre> <h1 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 24px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">III VUE项目流水线备份</span><span style="display: none;"></span></h1> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014554" data-ratio="0.38333333333333336" src="/upload/40feb6aa4b74af58eb50caa08768315f.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">3.1 Node.js 构建</span><span style="display: none;"></span></h2> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100014562" data-ratio="1.0962800875273524" src="/upload/895726abb3d1365c4cf116456d84ce82.png" data-type="png" data-w="914" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"># input your command here</span><br>cnpm install<br>cnpm run build:pro<br></code></pre> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">3.2 Dockerfile_prod</span><span style="display: none;"></span></h2> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;">## 使用 Node.js 18 作为基础镜像</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#FROM node:16.8</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">## 设置工作目录</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#WORKDIR /app</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#COPY . .</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">## 暴露容器的端口</span><br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#COPY package*.json ./</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">### 运行应用程序</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#CMD [ "npm", "run", "test" ]</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">### 运行命令</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">##CMD [ "npm", "run", "test" ]</span><br>FROM nginx<br>RUN rm /etc/nginx/conf.d/default.conf<br><br>ADD default_prod.conf /etc/nginx/conf.d/<br>COPY dist/ /usr/share/nginx/html/<br></code></pre> <h2 data-tool="mdnice编辑器" style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 251, 251);margin-top: 30px;margin-bottom: 15px;align-items: unset;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow: unset;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(255, 255, 255);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(33, 33, 34);line-height: 2.4em;letter-spacing: 0em;padding-left: 15px;padding-right: 30px;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px 0px 40px;align-items: unset;box-shadow: none;display: inline-block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;">3.3 docker部署</span><span style="display: none;"></span></h2> <pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/Xmnun9Io49QJcqib5MfkTFiaIUeK98YMQkcibgGia6CLY0yp68yCCEqOgELdraLIc1fTdpO4sCsKPahpyepHsPsO6eDB850A6BPM/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;">#部署脚本会在部署组的每台机器上执行。一个典型Docker部署脚本如下:</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#示例中使用的$image是您在脚本下方的变量处定义的变量(上游输出或自定义)</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#docker run $image</span><br><span style="color: #e6c07b;line-height: 26px;">echo</span> <span style="color: #d19a66;line-height: 26px;">$DOCKER_PASSWORD</span> | docker login --username <span style="color: #d19a66;line-height: 26px;">$DOCKER_USERNAME</span> --password-stdin registry.cn-hangzhou.aliyuncs.com<br>docker stop admin<br>docker rm admin <br>docker run --name admin -d -p 8006:8006 <span style="color: #d19a66;line-height: 26px;">$image</span><br>docker update admin --restart=on-failure:3<br>docker rmi $(docker images -qa) 2>/dev/null<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#不打印错误输出,不换行后续没指令也会报错,但文件能写入成功。</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">#如果想要不报错,在后面加上其他指令即可:</span><br><span style="color: #e6c07b;line-height: 26px;">echo</span> <span style="color: #98c379;line-height: 26px;">"执行完毕"</span><br><br><br></code></pre> </section> <p><br></p> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:じ☆ve宝贝
下面介绍两种方法,任选其一 01.更改组策略 按键盘Win+R,输入gpedit.msc打开组策略编辑器 展开到 计算机配置>管理模版>Windows 组件>边缘 UI  找到“允许轻扫边缘”,选择“已禁用”,保存  之后注销登录或重启电脑 02.更改注册表 按键盘Win+R,输入regedit打开注册表 定位到以下路径: ``` 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\EdgeUI ```  如果没有请在Windows下新建项,重命名为EdgeUI  在EdgeUI下新建DWORD(32位)值,名为AllowEdgeSwipe  将它改为0  之后注销登录或重启电脑
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;text-align: left;" data-mpa-powered-by="yiban.io"> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">1、问题背景</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">智慧门诊系统旨在从一定程度上解决患者面临的三长一短(挂号、看病、取药时间长,医生问诊时间短)的问题。实现“诊前、诊中、诊后”实时智能一体化,整合完善医院工作流程。围绕门诊看病的各个环节,让患者全程手机有提醒,让患者少排队、少跑腿、看病更简单,获得全流程的陪伴服务从而有效提升就医体验。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">系统通过接收医院第三方系统推送的门诊数据,再结合业务服务处理后主动推送到前端,从而实时的将数据同步给患者手机。之所以没有采用传统的前端轮训方案,主要是在当前业务场景下存在时效性不足,资源浪费等问题。但与此同时也有代价的,相比于Http的无状态通信,服务端主动推送是有状态协议的,客户端连接服务器时只和集群中一个节点连接,数据传输过程中也只与这一节点通信,在集群多台服务器环境下,我们就出现了服务端部分消息推送丢失的现象。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">当前架构图如下:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035640" data-ratio="0.7442129629629629" src="/upload/2ac205217d1951062871343c50bd2a96.png" data-type="png" data-w="864" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> <figcaption style="color: rgb(136, 136, 136);font-size: 14px;line-height: 1.5em;letter-spacing: 0em;text-align: center;margin-top: 5px;"> <br> </figcaption> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">2、问题分析和整体思路</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">客户端和服务端每次建立连接时候,会创建有状态的会话Session,服务器得保存维持连接的Session。客户端每次只能和集群服务器其中的一个服务器连接,后续也是和该服务器进行数据传输。因此集群的问题,应该考虑Session的问题,客户端成功连接服务器之后,其他服务器也知道客户端连接成功。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">可以使用Nginx负载均衡的ip hash算法,客户端每次都是请求同一个服务器,客户端的session都保存在该服务器上,而后续请求都是请求该服务器,都能获取到session,就不存在分布式session问题了。websocket相对http来说,可以由服务端主动推动消息给客户端,如果接收消息的服务端和发送消息消息的服务端不是同一个服务端,发送消息的服务端无法找到接收消息对应的session,即两个session不处于同一个服务端,也就无法推送消息。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">解决问题的方法是将所有消息的发送方和接收方都处于同一个服务器下,而消息发送方和接收方都是不确定的,显然是无法实现的。将消息的发送方和接收方都处于同一个服务器下才能发送消息,那么可以转换一下思路,可以将消息以消息广播的方式通知给所有的服务器,可以使用消息中间件发布订阅模式,消息脱离了服务器的限制,通过发送到中间件,再发送给订阅的服务器,类似广播一样,只要订阅了消息,都能接收到消息的通知。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">3、解决方案</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">WebSocket协议是基于TCP的一种新的网络协议,是一个应用层协议,是 HTML5 提供的一种在单个 TCP 连接上进行全双工通讯的协议,与 TCP 一样,客户端和服务器都可以随时向对方发送数据,而不用像 HTTP请求 - 应答”通信模式。于是,服务器就可以变得更加“主动”了。一旦后台有新的数据,就可以立即“推送”给客户端,不需要客户端轮询,“实时通信”的效率也就提高了。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">浏览器是一个“沙盒”环境,有很多的限制,不允许建立 TCP 连接收发数据,而WebSocket利用了 HTTP 本身的“协议升级”特性,“伪装”成 HTTP,这样就能绕过浏览器沙盒、与服务器直接建立“TCP 连接”,获得更多的自由。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">一个典型的 Websocket 握手请求如下:</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">1、客户端请求</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035637" data-ratio="0.22142857142857142" src="/upload/77112d472c6f7a1187c54c70b63e1d4a.png" data-type="png" data-w="700" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">2、服务器回应</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035636" data-ratio="0.17882689556509299" src="/upload/552a248458cb40df29d23d90676137b5.png" data-type="png" data-w="699" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">WebSocket是有状态的,无法像直接HTTP以集群方式实现负载均衡,长连接建立后即与服务端某个节点保持着会话,因此集群下想要得知会话属于哪个节点,有两种方案,一种是使用类似微服务的注册中心来维护全局的会话映射关系,一种是使用事件广播由各节点自行判断是否持有会话,两种方案对比如表所示。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035639" data-ratio="0.13222079589216945" src="/upload/979343102f74eb03a228029350c56443.png" data-type="png" data-w="779" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">综合考虑实现成本与集群规模,选择了轻量级的事件广播方案。实现广播可以选择基于RocketMQ的消息广播、基于Redis的Publish/Subscribe、基于服务的通知等方案,其优缺点对比如表所示。从实时性、实现难易等方面考虑,同时对于持久化高可靠级别并没有太高要求,最终选择了Redis。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035638" data-ratio="0.17541613316261204" src="/upload/a9e7f7fbf795ef390f508b5244602937.png" data-type="png" data-w="781" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">改造后架构图如下:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035641" data-ratio="0.8288431061806656" src="/upload/fac5fa62a4e0678090b8d93a7fbc6ac1.png" data-type="png" data-w="631" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">4、核心实现</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">基于spring boot建立websocket连接</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035643" data-ratio="0.6509259259259259" src="/upload/735e8373172183240fac516b7ad736d5.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">基于spring boot接收 websocket消息</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035645" data-ratio="0.6925925925925925" src="/upload/efaab05bc1f5c4cfdf5a0fd4fd808a3b.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">基于spring boot发布和订阅Redis消息</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035644" data-ratio="0.6648148148148149" src="/upload/71423c29ad3f8c120beb5edadf4767eb.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">vue前端websocket建立连接、心跳检测、发送消息、消息订阅等</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035642" data-ratio="0.5236742424242424" src="/upload/04ac32389b90cfba1f5ac0b3d65f7f09.png" data-type="png" data-w="1056" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035650" data-ratio="0.7251184834123223" src="/upload/3873fe4ec2d95e6e04f8fb11bb099531.png" data-type="png" data-w="1055" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035649" data-ratio="0.7251184834123223" src="/upload/3873fe4ec2d95e6e04f8fb11bb099531.png" data-type="png" data-w="1055" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">Nginx反向代理配置</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035646" data-ratio="0.12362301101591187" src="/upload/afa35bb83e0ad67d7d214e172b363321.png" data-type="png" data-w="817" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">5、性能测试</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">性能压测选择两台配置为2核16G的虚拟机,分别作为服务器和客户端。压测时选择为网关开放了5个端口,同时建立5个客户端,每个客户端使用一个服务端端口建立起2万连接,可以同时创建10万个连接。连接数与内存使用情况如图所示。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035648" data-ratio="0.45" src="/upload/c3b66516bb82f9b50d23734524c47378.png" data-type="png" data-w="640" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">给10万个长连接同时发送一条消息,采用单线程发送,服务器发送完成的平均耗时在<strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">10s</strong>左右,如图所示。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035647" data-ratio="0.203125" src="/upload/1b20ce9e5b722aaeac69cdef5cf2af8b.png" data-type="png" data-w="640" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">当前的性能指标已满足智慧门诊的实际业务场景,可支持未来的业务增长。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">6、产品效果</strong></p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100035652" data-ratio="1.1095617529880477" src="/upload/e20f5682badf0ac05d2d1954828491d6.png" data-type="png" data-w="1004" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> <figcaption style="color: rgb(136, 136, 136);font-size: 14px;line-height: 1.5em;letter-spacing: 0em;text-align: center;margin-top: 5px;"> <br> </figcaption> </figure> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(53, 179, 120);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">7、问题和展望</strong></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">当前WebSocket实现分散在在各个服务中,与业务系统强耦合,如果有其他业务需要集成WebSocket,面临着重复开发的窘境,浪费成本、效率低下。后续建议在网关中扩展统一集成管理websocket,能够具备以下特点:</p> <ol data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 集中实现长连接管理和推送能力。统一技术栈,将长连接作为基础能力沉淀,便于功能迭代和升级维护。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 与业务解耦。将业务逻辑与长连接通信分离,使业务系统不再关心通信细节,也避免了重复开发,浪费研发成本。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 使用简单。提供HTTP推送通道,方便各种开发语言的接入。业务系统只需要简单的调用,就可以实现数据推送,提升研发效率。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 分布式架构。实现多节点的集群,支持水平扩展应对业务增长带来的挑战;节点宕机不影响服务整体可用性,保证高可靠。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 多端消息同步。允许用户使用多个浏览器或标签页同时登陆在线,保证消息同步发送。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;"> 多维度监控与报警。自定义监控指标与现有微服务监控系统打通,出现问题时可及时报警,保证服务的稳定性。 </section></li> </ol> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-right: 10px;padding-left: 10px;outline: 0px;word-spacing: 0em;text-wrap: wrap;color: rgb(0, 0, 0);font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;font-size: 16px;letter-spacing: 0em;text-align: left;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(255, 255, 255);width: auto;line-height: 1.5em;word-break: break-word;visibility: visible;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(89, 89, 89);font-size: 15px;line-height: 1.8em;letter-spacing: 0.04em;text-indent: 0em;text-align: center;"><span style="outline: 0px;font-weight: bolder;letter-spacing: 0.6px;background-image: none;background-position: 0% 0%;background-size: auto;background-repeat: no-repeat;background-attachment: scroll;background-origin: padding-box;background-clip: border-box;color: rgb(53, 179, 120);width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">- End-</span></p> <blockquote data-tool="mdnice编辑器" style="margin-top: 20px;margin-bottom: 20px;padding: 10px 10px 10px 20px;outline: 0px;border-top: 3px none rgba(0, 0, 0, 0.4);border-right: 3px none rgba(0, 0, 0, 0.4);border-bottom: 3px none rgba(0, 0, 0, 0.4);border-left-color: rgb(53, 179, 120);color: var(--weui-FG-1);border-radius: 0px;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253);width: auto;height: auto;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;overflow: auto;"> <p style="padding-top: 8px;padding-bottom: 8px;outline: 0px;text-indent: 0em;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0.04em;">DailyMart是一个基于 DDD 和Spring Cloud Alibaba的微服务商城系统,采用SpringBoot3.x以及JDK17。旨在为开发者提供集成式的学习体验,并将其无缝地应用于实际项目中。该专栏包含领域驱动设计(DDD)、Spring Cloud Alibaba企业级开发实践、设计模式实际应用场景解析、分库分表战术及实用技巧等内容。如果你对这个系列感兴趣,可在本公众号回复关键词 <span style="outline: 0px;font-weight: bolder;color: rgb(53, 179, 120);background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0);width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">DDD</span> 获取完整文档以及相关源码。</p> </blockquote> </section> <p style="margin-bottom: 0px;outline: 0px;letter-spacing: 0.544px;text-wrap: wrap;font-size: 16px;color: rgb(53, 53, 53);word-spacing: 0.8px;font-family: system-ui, -apple-system, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;"><img class="rich_pages wxw-img __bg_gif" data-galleryid="" data-imgfileid="100036454" data-ratio="0.5763888888888888" src="/upload/4cd50efdfdecd1170e8197f7dc9c7847.png" data-type="gif" data-w="288" style="outline: 0px;border-style: none;color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: normal;visibility: visible !important;width: 287.969px !important;"></p> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.05) 0%, rgba(0, 0, 0, 0) 6.76%), linear-gradient(360deg, rgba(50, 0, 0, 0.05) 0%, rgba(249, 247, 252, 0) 9.46%);background-origin: padding-box;background-position: 0% 0%;background-repeat: repeat, repeat;background-size: 20px 20px, 20px 20px;width: auto;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;text-align: left;"> <h3 data-tool="mdnice编辑器" style=" margin-top: 30px;margin-bottom: 15px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;display: flex;flex-direction: unset;float: unset;height: auto;justify-content: center;line-height: 1.5em;overflow: unset; text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; "><span style="display: none;"></span><span style=" font-size: 17px;color: rgb(89, 89, 89);border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(222, 198, 251);line-height: 1.5em;letter-spacing: 0em;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none none solid;border-width: 1px 1px 2px;border-radius: 0px;box-shadow: none;display: inline;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset; text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; ">引言:</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">在当今的技术领域中,DevOps(开发运维)已经成为提高团队效率和软件交付速度的关键。在这个日益复杂的数字化世界中,企业需要不断寻求创新和优化,以便在竞争激烈的市场中立于不败之地。而 AnsibleUI 作为一个基于 Django、Ansible 和 Celery 构建的开源项目,为实现这一目标提供了强大的支持。</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">AnsibleUI 的出现,不仅仅是为了简化任务的异步处理,更是为了让运维团队能够更加高效地管理和部署软件系统。通过它,开发和运维团队可以实现更紧密的协作,加速软件开发周期,提高整体运维效率。本平台的魅力在于其简洁的界面和强大的功能,使得复杂的任务变得简单易行,让操作变得高效而愉悦。</p> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">介绍</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">AnsibleUI 是基于Django + Ansible + Celery 的Web平台,用以批量的任务异步处理</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">Gitee 地址:https://gitee.com/lwr_dgas/AnsibleUI</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">前后端分离 前端代码地址:https://gitee.com/lwr_dgas/AnsibleUI-Front</p> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">软件架构</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">软件架构说明</p> <ul data-tool="mdnice编辑器" style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> Ansible使用公私钥登录进行主机操作 </section></li> </ul> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002035" data-ratio="0.4910394265232975" src="/upload/aba6bcab2aff1b4671c6422dce26ad4a.png" data-type="png" data-w="1116" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h3 data-tool="mdnice编辑器" style=" margin-top: 30px;margin-bottom: 15px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;display: flex;flex-direction: unset;float: unset;height: auto;justify-content: center;line-height: 1.5em;overflow: unset; text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; "><span style="display: none;"></span><span style=" font-size: 17px;color: rgb(89, 89, 89);border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(222, 198, 251);line-height: 1.5em;letter-spacing: 0em;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none none solid;border-width: 1px 1px 2px;border-radius: 0px;box-shadow: none;display: inline;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset; text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; ">相关演示地址</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(145, 109, 213);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">该项目在实验楼上有开发教程,地址为 https://www.shiyanlou.com/courses/1380</strong>邀请码: 4IL5Tadc</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(145, 109, 213);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">Demo 地址:</strong> www.ansibleui.cn</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="color: rgb(145, 109, 213);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">前后端分离 Demo:</strong> http://front.ansibleui.cn</p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">账号密码:admin:12345678 , demo 未启动 Celery 进程,请勿添加任务</p> <h3 data-tool="mdnice编辑器" style=" margin-top: 30px;margin-bottom: 15px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;display: flex;flex-direction: unset;float: unset;height: auto;justify-content: center;line-height: 1.5em;overflow: unset; text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; "><span style="display: none;"></span><span style=" font-size: 17px;color: rgb(89, 89, 89);border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(222, 198, 251);line-height: 1.5em;letter-spacing: 0em;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none none solid;border-width: 1px 1px 2px;border-radius: 0px;box-shadow: none;display: inline;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset; text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; ">效果图展示</span><span style="display: none;"></span></h3> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002036" data-ratio="0.5883280757097792" src="/upload/798761d38d05559cc4b98b6ea9604a4d.png" data-type="png" data-w="1268" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002037" data-ratio="0.5353185595567868" src="/upload/a5c5d1d72ecbd01217263186985f590e.png" data-type="png" data-w="1444" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">安装教程</span><span style="display: none;"></span></h4> <ul data-tool="mdnice编辑器" style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> 为方便安装,请下载python包到files目录下,https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> Ansible使用私钥进行登录操作,私钥文件位置: <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">files/id_rsa</code>,或者在ansible.cfg中修改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> Docker集群部署,启动端口 10089 </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(0, 0, 0);" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> docker-compose build </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> docker-compose up </section></li> </ul> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> 手动部署 </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(0, 0, 0);" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 安装 Python 环境,开发环境版本为 Python 3.6.4 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 安装相关pagkage <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 配置相关参数 tools/config.py,包括redis、mysql,Ansible/settings.py 文件可修改 DATABASES 使用sqlite3 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 为数据库建表, <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">python3 manage.py makemigrations && python3 manage.py migrate</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 在代码目录下启动Celery, <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">celery -A myCelery worker -l info</code>,可参看myCelery.py文件尾注释部分 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 启动主服务, <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">python3 manage.py runserver 0.0.0.0:10089</code>。 </section></li> </ul> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> 服务启动 <pre style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;margin-top: 10px;margin-bottom: 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/VNDQtnw16icIHLTfAbY1ngMvJg0xeXbu4qPggKwTcWY80NH0CeaxasWIF5m3OwU6oQ4QOLztohmN0avcJl2dalU5xfqqqqJNE/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;color: rgb(171, 178, 191);width: auto;margin-left: 2px;margin-right: 2px;padding: 15px 4px 2px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);word-break: break-all;background: rgb(40, 44, 52);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;"> server {<br> listen 10086;<br> access_log logs/ansibleui.access.log;<br> error_log logs/ansibleui.error.log;<br> location / {<br> include uwsgi_params;<br> uwsgi_pass 127.0.0.1:9801;<br> }<br> location /static {<br> root /data/AnsibleUI/;<br> }<br> location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {<br> expires 30d;<br> }<br> }<br></code></pre> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(0, 0, 0);" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 启动celery,请设置 <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">export PYTHONOPTIMIZE=1</code>, 否则celery将无法调用ansible </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> Celery启动, <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">celery multi start 1 -A myCelery -l info -c4 --pidfile=tmp/celery_%n.pid -f logs/celery.log</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 主程序启动, <code style="background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">uwsgi --socket 127.0.0.1:9801 --module ansible_ui.wsgi --py-autoreload=1 --daemonize=logs/uwsgi.log</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);line-height: 1.8em;letter-spacing: 0em;"> 静态资源及代理,nginx最简配置 </section></li> </ul> </ul> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">配置项</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">tools/config.py ansible 远程连接用户 Redis 存放Celery MySQL</p> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">使用说明</span><span style="display: none;"></span></h4> <ol start="0" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;"> 需外部提供MySQL和Redis,参数在tools/config.py内修改 </section></li> </ol> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">UI</span><span style="display: none;"></span></h4> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002039" data-ratio="0.5982142857142857" src="/upload/df827d0bd2a5fb04118def1d44954d2b.png" data-type="png" data-w="1120" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <br data-tool="mdnice编辑器"> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002038" data-ratio="0.5250447227191414" src="/upload/f0e9f221266491c133e9b5eac87b347c.png" data-type="png" data-w="1118" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <br data-tool="mdnice编辑器"> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002042" data-ratio="0.6012658227848101" src="/upload/f80e1bebee99c4967ea243dcf7a197f2.png" data-type="png" data-w="1106" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <br data-tool="mdnice编辑器"> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100002041" data-ratio="0.28927911275415896" src="/upload/216f6ed6d421ed38315e559b4ba4de51.png" data-type="png" data-w="1082" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 8px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h3 data-tool="mdnice编辑器" style=" margin-top: 30px;margin-bottom: 15px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none;border-width: 1px;border-color: rgb(0, 0, 0);border-radius: 0px;box-shadow: none;display: flex;flex-direction: unset;float: unset;height: auto;justify-content: center;line-height: 1.5em;overflow: unset; text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; "><span style="display: none;"></span><span style=" font-size: 17px;color: rgb(89, 89, 89);border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(222, 198, 251);line-height: 1.5em;letter-spacing: 0em;align-items: unset;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;border-style: none none solid;border-width: 1px 1px 2px;border-radius: 0px;box-shadow: none;display: inline;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;overflow: unset; text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset; ">总结</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">在 DevOps 领域,AnsibleUI 的出现为运维工作带来了新的活力和可能性。它不仅仅是一个简单的工具,更是一个与时俱进的解决方案,致力于提升团队的协作效率和系统的稳定性。通过 AnsibleUI,我们可以更加轻松地管理和部署软件,从而释放出更多的时间和精力来应对日益复杂的业务需求。因此,让我们携手共进,借助 AnsibleUI 的力量,开创一个更加美好的运维未来!</p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;">最后,欢迎关注山猫,👇</p> <section class="mp_profile_iframe_wrp" style="margin-bottom: 0px;outline: 0px;color: rgb(0, 0, 0);font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;font-size: 16px;letter-spacing: normal;text-align: left;text-wrap: wrap;background-color: rgb(255, 255, 255);"> <mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-id="Mzg4NzY0MDEyNg==" data-headimg="http://mmbiz.qpic.cn/sz_mmbiz_png/WNZqL23rd3thIGhJZvNrVmNWNrsXSpheVvXcajQy6MJTqtEvtMI5aeiaOBJQERtXU06rXJZGaibTHBPjJ4NuMLGQ/300?wx_fmt=png&wxfrom=19" data-nickname="python学习之旅" data-alias="mcatlearnpy" data-signature="python web开发,常见开源工具的使用,毕业设计以及自媒体相关内容" data-from="2" data-is_biz_ban="0" data-origin_num="68" data-isban="0" data-biz_account_status="0" data-index="0"></mp-common-profile> </section> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;">相关开源项目:</p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485680&idx=1&sn=f62eb0cc09916e13f7160705fd000e99&chksm=cf8611a1f8f198b75273df5a1c32886c4c3a194351f876adef88c6b56538ea3cb26e77c55701&scene=21#wechat_redirect" textvalue="开源管理系统:FuAdmin 框架全面解析" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" style="text-decoration: underline;" data-linktype="2">开源管理系统:FuAdmin 框架全面解析</a><br></p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485666&idx=1&sn=9cad29027831e4439b401e0393eff368&chksm=cf8611b3f8f198a519ce5e7a09c87ccd40332229355ebc3f0b4e95fab5a1a77e2a8c1db563c0&scene=21#wechat_redirect" textvalue="盒木ERP社区版--开源ERP进销存管理系统" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="outline: 0px;color: var(--weui-LINK);text-decoration: underline;cursor: pointer;">盒木ERP社区版--开源ERP进销存管理系统</a><br style="outline: 0px;"></p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485626&idx=1&sn=89fea4b417409a67f134e0253b846195&chksm=cf8611ebf8f198fd4470374563a5e5e94119dde7ac54cc951398af77966434b9980d9599b8f0&scene=21#wechat_redirect" textvalue="Django-Vue-Admin:定制化后台管理系统" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="outline: 0px;color: var(--weui-LINK);text-decoration: underline;cursor: pointer;">Django-Vue-Admin:定制化后台管理系统</a><br style="outline: 0px;"></p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485603&idx=1&sn=6f347169ddf2007f592dd1a3f2259872&chksm=cf8611f2f8f198e4ba64575b0bcc08555718f03ff5adb702853799ec9d5fadae2f146f7faa15&scene=21#wechat_redirect" textvalue="Django-Vue-Lyadmin:低代码后台管理系统" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="outline: 0px;color: var(--weui-LINK);text-decoration: underline;cursor: pointer;">Django-Vue-Lyadmin:低代码后台管理系统</a><br style="outline: 0px;"></p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485523&idx=1&sn=e05dba61d2397f40bc56f78620768c18&chksm=cf861102f8f1981421cf3aa43b81d3da08ba8afcb9f400b2e5b7a6e2767e4dcb87fed2ee6367&scene=21#wechat_redirect" textvalue="Django_Admin_Vue:Django后台管理的利器" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="outline: 0px;color: var(--weui-LINK);text-decoration: underline;cursor: pointer;">Django_Admin_Vue:Django后台管理的利器</a></p> <p data-tool="mdnice编辑器" style="margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: Optima, "Microsoft YaHei", PingFangSC-regular, serif;text-align: left;text-indent: 0em;text-wrap: wrap;background-color: rgb(255, 255, 255);color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NzY0MDEyNg==&mid=2247485655&idx=1&sn=3650cd649ed4ce081fa5a8501e3ee99d&chksm=cf861186f8f198906b952dc9dbb7879e9f2fe05c4c6dd7c19c616e6f04c3abce34ea9fef617d&scene=21#wechat_redirect" textvalue="layui-vue 组件库的优势与应用" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="outline: 0px;color: var(--weui-LINK);text-decoration: underline;cursor: pointer;">layui-vue 组件库的优势与应用</a></p> <p data-tool="mdnice编辑器" style="color: rgb(89, 89, 89);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><br></p> </section> <p><br></p> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 22px;"></h2> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 22px;"><span style="display: none;line-height: 0px;"></span></h2> </section> </section> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 22px;">1. 背景</h2> <hr data-tool="mdnice编辑器" style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-right-width: medium;border-bottom-width: medium;border-left-width: medium;border-style: solid none none;border-color: black currentcolor currentcolor;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">8月30日,下午 15:50 左右,因阿里云 RDS 宿主机故障,我们部署在此宿主机上的一个核心订单库(<em>mysql.order_sharding</em><span style="cursor: pointer;"><span role="presentation" data-formula="^{[1]}" data-formula-type="inline-equation" style=""> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span></span>)因探活失败发生 HA 切换。随后,交易主链路上依赖该库的若干应用陆续出现了服务不可用问题,并又一次经历了漫长的恢复过程。之所以说是 “又一次”,是因为在过去这半年时间里,类似的问题已经不是第一次发生。 根据 NOC<span style="cursor: pointer;"><span role="presentation" data-formula="^{[2]}" data-formula-type="inline-equation" style=""> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span></span> 提供的本次事件时间线。</p> <section data-tool="mdnice编辑器" style="overflow-x: auto;"> <table> <thead> <tr style="border-width: 1px 0px 0px;border-style: solid none none;border-color: rgb(204, 204, 204) currentcolor currentcolor;background-color: white;"> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">时间</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">操作</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">耗时</th> </tr> </thead> <tbody style="border-width: 0px;border-style: none;border-color: currentcolor;"> <tr style="border-width: 1px 0px 0px;border-style: solid none none;border-color: rgb(204, 204, 204) currentcolor currentcolor;background-color: white;"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">15:51:03 - 15:51:48</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">数据库完成了 HA 切换</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;"><strong>38</strong>秒,符合预期</td> </tr> <tr style="border-width: 1px 0px 0px;border-style: solid none none;border-color: rgb(204, 204, 204) currentcolor currentcolor;background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">数据库恢复 - 15:55</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">交易应用恢复</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;"><strong>>3</strong> 分钟</td> </tr> </tbody> </table> </section> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">显然,超过<strong>3</strong>分钟的恢复时间,无疑在强烈的警告我们 —— 肯定在某个环节搞砸了。而同一问题重复出现,也让我们深感不安,或许下一次就要酿成大祸。为了弄清楚问题的根源,避免再次栽跟头,组织成立了一个<strong>特别调查小组</strong>,而我也奉命和交易的同学一起,将问题查个水落石出。</p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 22px;">2. 整理信息</h2> <hr data-tool="mdnice编辑器" style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-right-width: medium;border-bottom-width: medium;border-left-width: medium;border-style: solid none none;border-color: black currentcolor currentcolor;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">盲干肯定是不行的,得先确定排查的方向和重点。既然已经不是第一次发生这样的问题了,我决定先从当前已有的线索着手。截止目前,掌握的关键信息有:</p> <ol data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> HA 结束后,订单相关应用 CPU 负载飙高,且历次问题都具有类似特征(典型的是 bme-trade-order-svc <span style="cursor: pointer;"><span role="presentation" data-formula="^{[3]}" data-formula-type="inline-equation" style=""> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span></span>,由于这个应用比较底层,被众多上游应用依赖,且靠近出问题的数据库,后续的排查将重点围绕该应用展开); </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 结合此前历次故障,交易同学推测导致服务不可用的原因是:数据库故障期间,用户重试,创建了大量工作线程(Tomcat Thread)。数据库故障恢复后,为了调度数量庞大的工作线程,导致 CPU 负载持续飙高。最终 CPU 过载,无法继续处理请求,导致整个应用不可用。 </section></li> </ol> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">在我看来,第一条信息是一种 “观测事实”,事实本身暂时还没有太多可推敲的地方。而交易同学的推测,乍一听,似乎是说得通的。但稍微分析一下,我觉得其中的一些因果关系过于想当然了。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">2.1 重试一定会创建大量工作线程吗?</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">—— 这要看情况。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">但也许比较反直觉的是,这种情况其实并不多见。以<strong>常态化全链路压测</strong>为例,即便是请求量达到日常流量峰值的<strong>1.5</strong>倍时,工作线程的数量通常也不会有明显增长。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">这里我选取了最能反映压测流量变化的应用之一,以其线程监控指标(单机)为参考,如<strong>图1</strong>。从图中可见,在压测期间,工作线程数(Available Threads/tomcat_threads_current_threads)虽有略微上升,但其峰值仅为<strong>38</strong>,远低于我们设置的最大工作线程数(Max Threads/tomcat_threads_config_max_threads)<strong>200</strong>。我们知道,重试本质上等价于增加了流量,而<strong>图1</strong>的案例说明,简单的增加流量并不会造成工作线程数量的显著增长。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-height="412" data-imgfileid="100006426" data-ratio="0.44880174291938996" src="/upload/a3b70da4de40e9d594f84f0a0726173e.png" data-type="png" data-w="918" data-width="918" style="width: 371px;height: 167px;"></p> <p style="text-align: center;"><span style="font-size: 12px;">图1:压测状态下线程池波动(单机)</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">这主要是得益于<strong>线程池</strong>中工作线程的有效复用,如果一定要让工作线程数量飙升,就要破坏线程复用。最有可能的情况是,工作线程<strong>长时间</strong>在某个<strong>高频</strong>操作上陷入等待<span style="cursor: pointer;"><span role="presentation" data-formula="^{[4]}" data-formula-type="inline-equation" style=""> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span></span>。我将在后文中接着来讨论。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">2.2 线程多一定会导致 CPU 负载高,甚至过载吗?</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">—— 至少在当前这个问题的上下文中,我认为不太可能。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">首先,我们刚刚讨论过,想要在使用线程池的前提下产生大量的工作线程,则必须要让已经创建的线程长时间等待,阻止线程的复用。然而,通常处于等待状态的线程会释放其占用的 CPU 资源,因此 CPU 负载可能保持稳定甚至有所降低。其次,线程数量并不能无限扩增,最终会达到线程池最大工作线程数,而经过确认,<em>bme-trade-order-svc</em>配置的最大线程数也是<strong>200</strong>,这个值几乎被视为此类应用的最佳实践。所以对于在数据库故障恢复后调度这<strong>200</strong>个线程的 CPU 开销来说,算力配额应该绰绰有余,不太可能发生过载。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">结合前面的分析,现在让我来整理一下。基于已知的<strong>2</strong>个事实,我将排查的思路,拆解为表中的<strong>6</strong>个问题。</p> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <table data-ace-table-col-widths="111;111;138;123;123;123;127"> <colgroup> <col width="111"> <col width="111"> <col width="138"> <col width="123"> <col width="123"> <col width="123"> <col width="127"> </colgroup> <thead> <tr style="height: 39px;"> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="59"><p>The Facts</p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="50"><p>#1 Why?<span style="display: none;line-height: 0px;"></span><span style="display: none;line-height: 0px;"></span></p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;"><span style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 13.333333px;letter-spacing: normal;text-align: left;background-color: rgb(242, 243, 245);">#2 Why?</span></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="5"><span style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 13.333333px;letter-spacing: normal;text-align: left;background-color: rgb(242, 243, 245);">#3 Why?</span></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="52"><span style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 13.333333px;letter-spacing: normal;text-align: left;background-color: rgb(242, 243, 245);">#4 Why?</span></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="7"><p><span style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 13.333333px;letter-spacing: normal;text-align: left;background-color: rgb(242, 243, 245);">#5 Why?</span><span style="display: none;line-height: 0px;"></span></p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="50"><span style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 13.333333px;letter-spacing: normal;text-align: left;background-color: rgb(242, 243, 245);">#6 Why?</span></th> </tr> </thead> <tbody> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;background-color: rgb(242, 243, 245);" width="45"><p><strong>Tomcat 工作线程数量飙升</strong></p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="50"><p>线程数飙升是因为等待吗?</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;word-break: break-all;"> <ul start="1" class="list-paddingleft-1"> <li><p><strong>是</strong>:线程在等什么?</p></li> <li><p><strong>不是</strong>:飙升的原因是什么?</p></li> </ul><span data-lark-record-format="docx/record" style="caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);letter-spacing: normal;text-align: start;"></span></td> <td colspan="1" rowspan="2" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="5"><p>是因为工作线程飙升导致 CPU 负载高吗?</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="52"><p><strong>是</strong>:跳过</p></td> <td colspan="1" rowspan="2" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="7"><p>服务不可用是因为 CPU 负载飙高吗?</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="50"><p><strong>是</strong>:Solved</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;background-color: rgb(242, 243, 245);" width="45"><p><strong>CPU 负载高</strong></p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;word-break: break-all;" width="50"><p> -</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;word-break: break-all;"><p> -</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="5"><p><strong>不是</strong>:CPU 负载飙高的原因是什么?</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="52"><p><strong>不是</strong>:服务不可用的原因是什么?</p></td> </tr> </tbody> </table> <p><span data-lark-record-format="docx/record" style="letter-spacing: normal;text-align: start;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"></span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">接下来我将尝试寻找线索,逐个解答这六个问题,看能否揭示故障根因。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">Let's get started!</p> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <h2 data-tool="mdnice编辑器" style="margin: 0px;font-weight: bold;font-size: 22px;line-height: 1.6em;text-align: left;text-indent: 0em;"><span style="color: rgb(0, 0, 0);font-size: 22px;letter-spacing: normal;text-decoration: none;">3. 寻找线索,各个击破</span></h2> <hr data-tool="mdnice编辑器" style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-right-width: medium;border-bottom-width: medium;border-left-width: medium;border-style: solid none none;border-color: black currentcolor currentcolor;"> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><span style="font-size: 20px;font-weight: bold;letter-spacing: 0px;">3.1 线程数飙升是因为等待吗?</span><br></p> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">—— 是的。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">其实这个问题回答起来并不是太困难。不过在开始之前,有必要先来复习一下 Java 线程的<strong>6</strong>种状态。</p> </section> <table data-ace-table-col-widths="128;121;470;299"> <colgroup style="text-align: center;"> <col width="128"> <col width="121"> <col width="470"> <col width="299"> </colgroup> <thead> <tr style="height: 39px;"> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="177"><p>状态</p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;word-break: break-all;" width="195"><p>线程是否活跃?</p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;" width="101"><p>状态的含义</p></th> <th colspan="1" rowspan="1" style="border-top-width: 1px;border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;font-weight: 500;background-color: rgb(242, 243, 245);text-align: left;" width="490"><p>是否占用 CPU 资源?</p></th> </tr> </thead> <tbody> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="389"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">NEW</code></p> </section></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="426"><p><span style="color: rgb(216, 57, 49);background-color: rgb(251, 191, 188);"><strong><code>Inactive</code></strong></span></p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="101"><p>刚刚创建的线程处于新建状态</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="490"><p>No</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="274" height="225"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><span style="color: rgb(30, 107, 184);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 14px;background-color: rgba(27, 31, 35, 0.05);letter-spacing: 0px;text-align: left;"><span style="display: none;line-height: 0px;"></span>RUNNABLE</span><br></p> </section></td> <td colspan="1" rowspan="4" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="426"><p><span style="color: rgb(46, 161, 33);background-color: rgba(183, 237, 177, 0.8);"><strong><code>Active</code></strong></span></p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="101" height="225"><p>线程已经准备好运行,等待被调度或正在执行中</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="490" height="225"><p>Probably</p> <blockquote data-type="quote_container"> <p>该状态的本质是,线程具备了 获得 CPU 时间片的条件,但不一定占用 CPU 时间片。</p> <p>参<span style="letter-spacing: 0.034em;">考</span><strong><span style="letter-spacing: 0.034em;">图2</span></strong><span style="letter-spacing: 0.034em;">中</span><span style="color: rgb(30, 107, 184);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 14px;background-color: rgba(27, 31, 35, 0.05);letter-spacing: 0px;text-align: left;">RUNNABLE</span><span style="letter-spacing: 0.034em;">框出的部分</span></p> </blockquote></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;word-break: break-all;" width="389"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">BLOCKED</code></p> </section></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;word-break: break-all;" width="549"><p>线程等待获得某个<strong>监视器</strong>,该监视器锁正被另一个线程持有</p></td> <td colspan="1" rowspan="3" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;" width="87"><p>No</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;word-break: break-all;" width="389"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">WAITING</code></p> </section></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="549"><p>线程正在等待另一个线程完成某个操作</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;word-break: break-all;" width="284"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code></p> </section></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="549"><p>线程正在等待另一个线程在指定的时间内完成某个操作</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;word-break: break-all;" width="389"> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TERMINATED</code></p> </section></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="426"><p><span style="color: rgb(216, 57, 49);background-color: rgb(251, 191, 188);"><strong><code>Inactive</code></strong></span></p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: top;" width="101"><p>线程已完成运行</p></td> <td colspan="1" rowspan="1" style="border-color: rgb(222, 224, 227);font-size: 10pt;padding: 8px;vertical-align: middle;word-break: break-all;" width="490"><p>No</p></td> </tr> </tbody> </table> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px;letter-spacing: 0px;white-space: normal;color: black;padding-right: 15px;padding-left: 15px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;"> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">其中有<strong>3</strong>种状态表示 “等待”,分别是<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">BLOCKED</code>、<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">WAITING</code>和<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>。<strong>如图2</strong>:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">WAITING</code>和 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>状态表达的是线程 <strong style="color: black;">主动</strong>让出 <span style="cursor: pointer;"> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span> CPU 时间片,等另一个线程完成某个操作后通知自己 <span style="cursor: pointer;"> <svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewbox="0 -893.3 796.7 893.3" aria-hidden="true" style="vertical-align: 0px;width: 1.802ex;height: 2.021ex;"> <g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"> <g data-mml-node="math"> <g data-mml-node="msup"> <g data-mml-node="mi"></g> <g data-mml-node="TeXAtom" transform="translate(0, 363) scale(0.707)" data-mjx-texclass="ORD"> <g data-mml-node="mo"> <path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"></path> </g> <g data-mml-node="mn" transform="translate(278, 0)"> <path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z"></path> </g> <g data-mml-node="mo" transform="translate(778, 0)"> <path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"></path> </g> </g> </g> </g> </g> </svg></span>,再继续执行后续的逻辑。 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>仅仅是比 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">WAITING</code>多指定了一个超时时间; </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 而 BLOCKED 状态则是竞争监视器锁失败,被锁 “阻挡”, <strong style="color: black;">被迫</strong>等待; </section> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> <span style="display: none;line-height: 0px;"></span> </section> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);text-align: center;"> <img class="rich_pages wxw-img" data-height="446" data-imgfileid="100006427" data-ratio="0.5638432364096081" src="/upload/2146af0c3bc1d18328b6fda3b4238667.png" data-type="png" data-w="791" data-width="791" style="color: black;letter-spacing: 0px;width: 316px;height: 178px;"> </section></li> </ul> <p style="text-align: center;"><span style="font-size: 12px;">图2:Java Thread Lifecycle</span></p> <p><span style="letter-spacing: 0px;">让我们带着这些知识,再来翻阅 bme-trade-order-svc 应用的监控。如</span><strong style="letter-spacing: 0px;">图3</strong><span style="letter-spacing: 0px;">,通过 Tomcat 线程池监控曲线可以看到,工作线程确实出现了飙升,发生在 15:51:00 - 15:52:30,并且大致呈现出一种 “三段式” 增长趋势。</span><br></p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-height="344" data-imgfileid="100006428" data-ratio="0.19722222222222222" src="/upload/6f794b43b120d5c001d181cb199a0bc9.png" data-type="png" data-w="1080" data-width="1748" style="width: 471px;height: 92px;"></p> <p style="text-align: center;"><span style="font-size: 12px;">图3:Tomcat 线程池监控</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">而我也很快通过 JVM 线程状态监控曲线发现了时间和趋势都与之对应的线程状态波动的证据,如<strong>图4</strong>。可以看到 也是在 15:51:00 - 15:52:30 期间,<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>状态的线程数呈现明显的 “三段式” 增长。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-height="346" data-imgfileid="100006429" data-ratio="0.3914027149321267" src="/upload/d0c0f143b83eabd01e9b8870d3b6e931.png" data-type="png" data-w="884" data-width="884" style="width: 372px;height: 145px;"></p> <p style="text-align: center;"><span style="font-size: 12px;">图4:JVM 线程数量(分状态)监控</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">这说明我之前的推论是正确的。因为某种原因,线程池中原本复用良好的工作线程纷纷主动让出 CPU,进入到<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>等待状态,无法再被复用。线程池只能补充新的线程来处理新的请求,可是新补充的线程也很快进入到<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code>状态,线程池只能继续补充新线程。就这样,陷入恶性循环,最终导致线程数量飙升。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">3.2 线程在等什么?</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">—— 等数据库连接。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">对于这个问题,在实际排查的过程中,几乎可以立刻做出下意识的判断,也很容易从监控上找到证据。我们使用 HikariCP 管理数据库连接,HikariCP 有着完善的连接池指标埋点,其中部分指标的监控信息如<strong>图5</strong>。但要解释清楚细节,就没那么容易了。让我们先从理解<strong>图5</strong>中的指标开始。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-height="338" data-imgfileid="100006430" data-ratio="0.1935185185185185" src="/upload/c7ad8a7998b86d740172bd8ddea4b19b.png" data-type="png" data-w="1080" data-width="1745" style="width: 424px;height: 82px;"></p> <p style="text-align: center;"><span style="font-size: 12px;">图5:HikariCP 链接池监控</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">图中共有<strong>3</strong>条曲线,我将它们的含义归纳在了下方的表格里。</p> <table data-ace-table-col-widths="100;212;229;229;81"> <colgroup> <col width="100"> <col width="212"> <col width="229"> <col width="229"> <col width="81"> </colgroup> <thead> <tr style="height: 39px;"> <th colspan="1" rowspan="1" width="67" style="padding: 8px;border-top-width: 1px;border-color: rgb(222, 224, 227);background-color: rgb(242, 243, 245);font-size: 10pt;vertical-align: top;font-weight: 500;text-align: left;word-break: break-all;"><p><strong>图中曲线</strong></p></th> <th colspan="1" rowspan="1" width="96" style="padding: 8px;border-top-width: 1px;border-color: rgb(222, 224, 227);background-color: rgb(242, 243, 245);font-size: 10pt;vertical-align: top;font-weight: 500;text-align: left;word-break: break-all;"><p><strong>指标名</strong></p></th> <th colspan="1" rowspan="1" width="103" style="padding: 8px;border-top-width: 1px;border-color: rgb(222, 224, 227);background-color: rgb(242, 243, 245);font-size: 10pt;vertical-align: top;font-weight: 500;text-align: left;word-break: break-all;"><p><strong>对应的 HikariCP 指标</strong></p></th> <th colspan="1" rowspan="1" width="123" style="padding: 8px;border-top-width: 1px;border-color: rgb(222, 224, 227);background-color: rgb(242, 243, 245);font-size: 10pt;vertical-align: top;font-weight: 500;text-align: left;word-break: break-all;"><p><strong>含义</strong></p></th> <th colspan="1" rowspan="1" width="39" style="padding: 8px;border-top-width: 1px;border-color: rgb(222, 224, 227);background-color: rgb(242, 243, 245);font-size: 10pt;vertical-align: top;font-weight: 500;text-align: left;word-break: break-all;"><p><strong>指标类型</strong></p></th> </tr> </thead> <tbody> <tr style="height: 39px;"> <td colspan="1" rowspan="1" width="89" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>蓝色曲线</p></td> <td colspan="1" rowspan="1" width="96" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>Pending Connections/等待连接</p></td> <td colspan="1" rowspan="1" width="103" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>hikaricp_pending_threads</p></td> <td colspan="1" rowspan="1" width="0" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>当前排队获取连接的线程数</p></td> <td colspan="1" rowspan="3" width="39" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: middle;"><p>Guage</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" width="89" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>橙黄色曲线</p></td> <td colspan="1" rowspan="1" width="96" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>Idle Connections/空闲连接</p></td> <td colspan="1" rowspan="1" width="103" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>hikaricp_idle_connections</p></td> <td colspan="1" rowspan="1" width="0" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>当前空闲连接数</p></td> </tr> <tr style="height: 39px;"> <td colspan="1" rowspan="1" width="89" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>绿色曲线</p></td> <td colspan="1" rowspan="1" width="96" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>Active Connections/活跃连接</p></td> <td colspan="1" rowspan="1" width="103" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;"><p>hikaricp_active_connections</p></td> <td colspan="1" rowspan="1" width="0" style="padding: 8px;border-color: rgb(222, 224, 227);font-size: 10pt;vertical-align: top;word-break: break-all;"><p>当前正在使用的连接数</p></td> </tr> </tbody> </table> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><span style="letter-spacing: 0px;">显然首先会关注的就是 “Pending Connections/等待连接” 指标。这个指标名起的不太好,实际上表示的是当前排队获取连接的线程数,它反映的正是线程在等待 —— 因为</span><strong style="letter-spacing: 0px;">获取不到连接</strong><span style="letter-spacing: 0px;">而进入了</span><code style="letter-spacing: 0px;font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code><span style="letter-spacing: 0px;">状态。</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><span style="letter-spacing: 0px;">可能有一部分本文的读者会误认为是获取到连接后,和数据库的 I/O 阻塞,导致了线程进入 </span><code style="letter-spacing: 0px;font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">TIMED_WAITING</code><span style="letter-spacing: 0px;">状态,但并非如此。事实上,Java 线程遇到同步 I/O 阻塞时,仍然是 </span><code style="letter-spacing: 0px;font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">RUNNABLE</code><span style="letter-spacing: 0px;">状态。如果你对此不是很有概念,我们可以设计一对简单的 Client - Server 实验程序来验证这一点。</span></p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;marg
作者:微信小助手
<p style="margin-bottom: 0em;letter-spacing: 0.578px;text-wrap: wrap;text-align: center;" data-mpa-powered-by="yiban.io"><img class="rich_pages wxw-img" data-cropselx1="0" data-cropselx2="578" data-cropsely1="0" data-cropsely2="89" data-galleryid="" data-imgfileid="504294134" data-ratio="0.10841121495327102" data-s="300,640" src="/upload/bb8501d4444f8abc4759941743936cc8.png" data-type="png" data-w="1070" style="height: 63px;width: 578px;"></p> <section style="margin-bottom: 8px;padding-right: 0.5em;padding-left: 0.5em;letter-spacing: 0.578px;text-wrap: wrap;text-align: center;"> <strong style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;"><span style="color: rgb(136, 136, 136);font-size: 12px;letter-spacing: 1px;">总第589</span></strong> <strong style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;"><span style="color: rgb(136, 136, 136);font-size: 12px;letter-spacing: 1px;">篇 | </span></strong> <strong style="letter-spacing: 0.578px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: var(--articleFontsize);"><span style="color: rgb(136, 136, 136);font-size: 12px;letter-spacing: 1px;">2024年第009篇</span></strong> </section> <section data-source="bj.96weixin.com" style="margin-bottom: 0px;padding-right: 0.5em;padding-left: 0.5em;text-wrap: wrap;letter-spacing: normal;text-align: left;color: black;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;"> <section style="padding: 20px 20px 15px;width: 670px;text-decoration: inherit;background-color: rgb(245, 245, 245);"> <section style="text-align: justify;line-height: 1.5em;margin-bottom: 8px;"> <span style="font-size: 14px;color: rgb(136, 136, 136);">菜品作为到店餐饮各相关业务的基石,提供了更细粒度的视角理解餐饮供给,为到餐精细化运营提供了抓手。</span> </section> <p style="text-align: justify;line-height: 1.5em;"><span style="font-size: 14px;color: rgb(136, 136, 136);">美团到店研发平台/数据智能平台部与天津大学刘安安教授团队展开了“基于多模态信息抽取的菜品知识图谱构建”的科研合作,利用多模态检索实现图文食材的识别,扩展了多模态菜品食材识别的范围,提升了食材识别的准确性。该项工作提出了一个跨模态食材级数据集,该数据集提供食材及其关系有助于增强对中国烹饪的理解。介绍该工作的论文《Toward Chinese Food Understanding: a Cross-Modal Ingredient-Level Benchmark》被IEEE Transactions on Multimedia(多媒体领域权威期刊之一)收录。</span></p> </section> </section> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-2"> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">1. 背景</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">2. 数据集</span></p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">2.1 数据收集和标注</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">2.2 标注数据后处理</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">2.3 数据统计和分析</span></p></li> </ul> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">3. 方法</span></p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">3.1 食材检测</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">3.2 跨模态食材检索</span></p></li> </ul> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">4. 实验</span></p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">4.1 算法实现细节</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">4.2 实验结果</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">4.3 可视化</span></p></li> </ul> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">5. 业务应用</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">6. 总结</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="font-size: 13px;color: rgb(136, 136, 136);">7. 作者团队简介</span></p></li> <li style="font-size: 13px;color: rgb(136, 136, 136);"><p><span style="border-radius: 0px;border-width: initial;border-style: none;border-color: initial;font-size: 13px;color: rgb(136, 136, 136);">8. 致谢</span></p></li> </ul> <h2 data-tool="mdnice编辑器" style="margin: 30px 0px 15px;"><p style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;margin-left: 0px;margin-right: 0px;"><span style="font-size: 20px;background-color: rgb(255, 209, 0);">1. 背景</span></p></h2> <p style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;margin-left: 0px;margin-right: 0px;margin-bottom: 0px;"><span style="font-size: 15px;">中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测<sup style="line-height: 0;">[1]-[3]</sup>、通用场景理解<sup style="line-height: 0;">[4][5]</sup>和跨模态检索<sup style="line-height: 0;">[6]-[8]</sup>方面取得了很大进展,却没有在食物相关的场景中取得好的表现,尤其是对烹饪菜肴的相关场景。其核心原因是缺乏细粒度食材的基准,这已经成为该领域发展的瓶颈。</span></p> <p style="line-height: 1.8em;letter-
作者:じ☆ve宝贝
> 最近更换macos系统后,发现在pycharm中debug运行项目就会出现python3.9/tokenize.py", line 330, in find_cookie错误,直接run可以正常运行。 ## 错误信息 ``` Traceback (most recent call last): File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/tokenize.py", line 330, in find_cookie line_string = line.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/tokenize.py", line 394, in open encoding, lines = detect_encoding(buffer.readline) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/tokenize.py", line 371, in detect_encoding encoding = find_cookie(first) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/tokenize.py", line 335, in find_cookie raise SyntaxError(msg) SyntaxError: invalid or missing encoding declaration for '/Users/willow/WorkSpaces/PycharmProjects/panda-hub/venv/bin/Python' ``` ## 解决方案  ## 原因复盘 去掉的这个:Attach to subprocess automatically while debugging 官方解释: If this checkbox is selected, PyCharm will automatically attach all subprocesses of the process being debugged. Thus, if the parent process has subprocesses, their breakpoints will always work. 中文:如果选中此复选框,PyCharm将自动附加正在调试的进程的所有子进程。因此,如果父进程有子进程,它们的断点将始终有效。简单来说就是这个编码错误是在运行子进程的时候解释代码导致的。
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="line-height: 1.6;word-break: break-word;text-align: left;font-size: 15px;color: rgb(53, 53, 53);word-spacing: 0.8px;letter-spacing: 0.8px;border-radius: 16px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;" data-mpa-powered-by="yiban.io"> <h1 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;border-top: 2px solid rgb(248, 57, 41);text-align: center;font-size: 1.3em;"><span style="display: none;"></span><span style="display: inline-block;font-weight: normal;background: rgb(248, 57, 41);color: #ffffff;padding: 3px 10px 1px;border-radius: 0 0 13px 13px;">离线部署 Jenkins 填坑指南</span></h1> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">你好,我是悟空。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">本文目录如下:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 16px;overflow: hidden;"> <img class="rich_pages wxw-img" data-imgfileid="304487048" data-ratio="0.49907407407407406" src="/upload/45cee83860a5ef2a9bf607baf8ff48c1.png" data-type="png" data-w="1080" style="border-radius: 6px;display: block;margin: 20px auto;max-width: 95%;object-fit: contain;"> </figure> <h2 data-tool="mdnice编辑器" style="font-weight: bold;color: black;font-size: 22px;margin-top: 20px;margin-right: 10px;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(34, 34, 34);display: inline-block;padding-left: 10px;border-left: 5px solid rgb(248, 57, 41);">一、背景</span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">之前我带着大家实践了如何在 Windows 系统在线部署 Jenkins、如何通过 Jenkins 部署前后端项目,以及 Jenkins 的权限管理。文章内容如下:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(248, 57, 41);font-size: 16px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> <a href="http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451968557&idx=1&sn=4a40968c69a17df511cd7865eebe5320&chksm=8d1febb2ba6862a47676d1e492666d2edc503a0ef3c10360125256619bb1457d9ad967b4b746&scene=21#wechat_redirect" style="color: rgb(248, 57, 41);border-bottom: 1px solid rgb(248, 57, 41);" data-linktype="2">1、丝滑的打包部署,一套带走</a> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> <a href="http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451969220&idx=1&sn=06cc3e1cc6f96e53d5c2179ad47b06f5&chksm=8d1fed5bba68644df92fa3b31bdd11f882c9c2eee56d69d1c6ee45fbdf2b600800b8865e0e70&scene=21#wechat_redirect" style="color: rgb(248, 57, 41);border-bottom: 1px solid rgb(248, 57, 41);" data-linktype="2">2、喝杯咖啡,一键部署完成!(建议收藏)</a> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> <a href="http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451970372&idx=1&sn=9127e6752b97885d3eab743214243ab0&chksm=8d1fe0dbba6869cd8c73a905126123ba770e51fe1d3781366659a4426a7650888d2fd6b2b6d3&mpshare=1&scene=21&srcid=0401bnPV8a8t6MHTC1NGSgIu&sharer_shareinfo=88eb7e4536dbc18ac62a4487ab5a5ea3&sharer_shareinfo_first=88eb7e4536dbc18ac62a4487ab5a5ea3#wechat_redirect" style="color: rgb(248, 57, 41);border-bottom: 1px solid rgb(248, 57, 41);" data-linktype="2">3、喝杯咖啡,一键部署前端项目</a> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> <a href="https://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451970459&idx=1&sn=06b1cb30ae87d53ab807fcd748bbe374&chksm=8d1fe004ba686912847dba091f4e9cf02aaddb116c434d60fcc32799336811b93574ee7bce57&token=1028945314&lang=zh_CN&scene=21#wechat_redirect" style="color: rgb(248, 57, 41);border-bottom: 1px solid rgb(248, 57, 41);" data-linktype="2">4、用代码实现流水线部署,像诗一般优雅</a> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> <a href="https://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451970570&idx=1&sn=fdc00c6e8e0cd760d999ee45b33876e3&chksm=8d1fe395ba686a8318be7c4139fee77bf1f4ef08ac8480e6deff93e19ce49af91e7fbb2acc27&mpshare=1&scene=21&srcid=0408mhMFqcIN4bTqtsRMbF3i&sharer_shareinfo=2c9ea09870ea7d83f8e693f416cc2929&sharer_shareinfo_first=ee470526845d4bf537fa82740728ec6e&version=4.1.26.6014&platform=win&nwr_flag=1#wechat_redirect" style="color: rgb(248, 57, 41);border-bottom: 1px solid rgb(248, 57, 41);" data-linktype="2">5、如果你还不理解 RBAC,看看 Jenkins 如何做到的</a> </section></li> </ul> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">在实际项目中,通过这些实践,目前已经稳定运行了两个月,现在又有了一个新项目也是需要用 Jenkins 来实现自动化部署,但新项目的部署环境是 Linux 离线环境,所以我需要在离线环境上再部署一遍。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;"><span style="color: rgb(255, 76, 65);"><strong>因为部署 Jenkins 的机器上没有网络,所以部署的过程中遇到了很多坑</strong></span>,本篇文章也是为了记录期间遇到的坑,以及解决方案。</p> <h2 data-tool="mdnice编辑器" style="font-weight: bold;color: black;font-size: 22px;margin-top: 20px;margin-right: 10px;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(34, 34, 34);display: inline-block;padding-left: 10px;border-left: 5px solid rgb(248, 57, 41);">二、依赖项</span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">部署后端项目时需要依赖 Java、Maven、Git,对应的离线包版本如下表所示。</p> <section data-tool="mdnice编辑器" style="overflow-x: auto;"> <table> <thead> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;font-size: 16px;background-color: rgb(219, 217, 216);min-width: 85px;">序号</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;font-size: 16px;background-color: rgb(219, 217, 216);min-width: 85px;">依赖项</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;font-size: 16px;background-color: rgb(219, 217, 216);min-width: 85px;">版本</th> </tr> </thead> <tbody style="border-width: 0px;border-style: initial;border-color: initial;"> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">1</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Linux 服务器</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">建议 ubuntu 20 以上</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">2</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Jenkins 离线 war 包</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">2.426.1(当前最新版本)</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">3</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Java 离线包,后端部署需要</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Java 11, Java 17 or Java 21</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">4</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Maven 离线安装,后端部署需要</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Maven 3.8.8</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">5</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">Git 离线包,拉取代码</td> <td style="border-color: rgb(204, 204, 204);font-size: 16px;color: rgb(100, 86, 71);min-width: 85px;">2.9.5(当前最新版本)</td> </tr> </tbody> </table> </section> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">关于离线部署前端项目会放到下一讲。</p> <h2 data-tool="mdnice编辑器" style="font-weight: bold;color: black;font-size: 22px;margin-top: 20px;margin-right: 10px;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(34, 34, 34);display: inline-block;padding-left: 10px;border-left: 5px solid rgb(248, 57, 41);">三、下载 Jenkins 安装包</span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">安装包路径:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">https://get.jenkins.io/war-stable/<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">选择版本:2.426.1</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 16px;overflow: hidden;"> <img class="rich_pages wxw-img" data-imgfileid="304487044" data-ratio="0.1685185185185185" src="/upload/420000bd9fc61765b757e38d82a4752f.png" data-type="png" data-w="540" style="border-radius: 6px;display: block;margin: 20px auto;max-width: 95%;object-fit: contain;"> </figure> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">下载完是一个 war 包,后续用 Java 启动这个 war 包即可。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 16px;overflow: hidden;"> <img class="rich_pages wxw-img" data-imgfileid="304487047" data-ratio="0.5499231950844854" src="/upload/28709e63e3aa2a12d6f9c3d1ad7ef8c6.png" data-type="png" data-w="651" style="border-radius: 6px;display: block;margin: 20px auto;max-width: 95%;object-fit: contain;"> </figure> <h2 data-tool="mdnice编辑器" style="font-weight: bold;color: black;font-size: 22px;margin-top: 20px;margin-right: 10px;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(34, 34, 34);display: inline-block;padding-left: 10px;border-left: 5px solid rgb(248, 57, 41);">四、安装 Java</span></h2> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;font-size: 20px;"><span style="display: none;"></span><span style="font-size: 16px;color: #222;">下载 Java 17 安装包</span><span style="display: none;"></span></h3> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 16px;overflow: hidden;"> <img class="rich_pages wxw-img" data-imgfileid="304487046" data-ratio="0.5583333333333333" src="/upload/a3703986155ad9586a4a1a69725879f2.png" data-type="png" data-w="1080" style="border-radius: 6px;display: block;margin: 20px auto;max-width: 95%;object-fit: contain;"> </figure> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">创建目标目录</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">sudo mkdir -p /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/java<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">复制安装包到目标目录</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">sudo cp /path/to/jdk-17_linux-x64_bin.tar.gz /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/java<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">解压安装包</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><span style="color: #e6c07b;line-height: 26px;">cd</span> /usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/java<br>sudo tar -xvzf jdk-17_linux-x64_bin.tar.gz<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">移除压缩包</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">sudo rm jdk-17_linux-x64_bin.tar.gz<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">配置环境变量</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">sudo vim /etc/profile<br><br><span style="color: #e6c07b;line-height: 26px;">export</span> PATH=/usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/sbin:/usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/bin:/usr/sbin:/usr/bin:/sbin:/bin<br><br><span style="color: #e6c07b;line-height: 26px;">export</span> JAVA_HOME=/usr/<span style="color: #e6c07b;line-height: 26px;">local</span>/java<br><span style="color: #e6c07b;line-height: 26px;">export</span> PATH=<span style="color: #d19a66;line-height: 26px;">$PATH</span>:<span style="color: #d19a66;line-height: 26px;">$JAVA_HOME</span>/bin<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">加载环境变量</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><span style="color: #e6c07b;line-height: 26px;">source</span> /etc/profile<br></code></pre> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">检查 Java 版本</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">java -version<br></code></pre> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 16px;overflow: hidden;"> <img class="rich_pages wxw-img" data-imgfileid="304487045" data-ratio="0.1021671826625387" src="/upload/6470005845eaf5fa2e80f6f838b21a07.png" data-type="png" data-w="969" style="border-radius: 6px;display: block;margin: 20px auto;max-width: 95%;object-fit: contain;"> <figcaption style="margin-top: 5px;text-align: center;color: rgb(136, 136, 136);font-size: 12px;"> java 版本 <br> </figcaption> </figure> <h2 data-tool="mdnice编辑器" style="font-weight: bold;color: black;font-size: 22px;margin-top: 20px;margin-right: 10px;"><span style="display: none;"></span><span style="font-size: 18px;color: rgb(34, 34, 34);display: inline-block;padding-left: 10px;border-left: 5px solid rgb(248, 57, 41);">五、启动 Jenkins</span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">启动方式分为两种:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(248, 57, 41);font-size: 16px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> 直接启动 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(53, 53, 53);"> 后台静默启动 </section></li> </ul> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;font-size: 20px;"><span style="display: none;"></span><span style="font-size: 16px;color: #222;">直接启动 jenkins</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">执行启动的命令:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3FdsbrAA6j9ib0ANjfzqicIce3/640?wx_fmt=svg&from=appmsg") 10px 10px / 40px no-repeat rgb(40, 44, 52);height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">java -jar jenkins.war --httpPort=8082<br></code></pre> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;font-size: 20px;"><span style="display: none;"></span><span style="font-size: 16px;color: #222;">后台静默启动</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 1.75;margin-top: 0em;margin-bottom: 0em;">执行启动的命令:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url("https://mmbiz.qpic.cn/mmbiz_svg/ibKHP1TZZeXIdB5vgAOEFCLlfvBM1oJiak0KGic2dwx54xUpPOIEU9gjcccs4QiahpJT4GoEnolP3
作者:じ☆ve宝贝
> 使用windows的edge浏览器发现无法保存密码,非常不方便。 ## 解决方案 C:\Users\{用户名}\AppData\Local\Microsoft\Edge\User Data\Default 删除该目录下的Login Data , Login Data-journal两个文件 