CICD 流程学习(五)Jenkins后端工程构建

案例1:数据库服务部署
MySQL部署
#安装MySQL服务
[root@Services ~]# yum clean all; yum repolist -v
...
Total packages: 8,265
[root@Services ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 
...
Complete!
[root@Services ~]# 

#启动MySQL服务
[root@Services ~]# systemctl enable mysqld      #设置MySQL服务开机自启动
[root@Services ~]# systemctl start mysqld       #启动MySQL服务
[root@Services ~]# ss -antpul | grep mysql      #确认3306端口被监听
tcp   LISTEN 0      70     *:33060  *:*    users:(("mysqld",pid=6875,fd=22)) 
tcp   LISTEN 0      128    *:3306   *:*    users:(("mysqld",pid=6875,fd=25)) 
[root@Services ~]# 

#初始化MySQL服务
[root@Services ~]# mysql
mysql> ALTER USER root@'localhost' IDENTIFIED BY 'Tarena';  #设置root用户密码
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' -e "STATUS;"
mysql: [Warning] Using a password on the command line interface can be insecure.
--------------
mysql  Ver 8.0.26 for Linux on x86_64 (Source distribution)

Connection id:          9
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.26 Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/lib/mysql/mysql.sock
Binary data as:         Hexadecimal
Uptime:                 2 min 0 sec

Threads: 2  Questions: 9  Slow queries: 0  Opens: 130  Flush tables: 3  Open tables: 46  Queries per second avg: 0.075
--------------

[root@Services ~]# 

#创建HIS项目数据库
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena'
mysql> CREATE DATABASE his;                                         #创建his库
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'his'@'192.168.88.60' IDENTIFIED BY 'hisadmin';  #创建his用户
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL ON his.* TO 'his'@'192.168.88.60';                 #授权his用户
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'his'@'192.168.88.60';                       #查看his用户权限
+----------------------------------------------------------+
| Grants for his@192.168.88.60                             |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `his`@`192.168.88.60`              |
| GRANT ALL PRIVILEGES ON `his`.* TO `his`@`192.168.88.60` |
+----------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> exit
Bye
[root@Services ~]# 

#导入HIS项目SQL
[root@Services ~]# ls his.sql 
his.sql
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' his < his.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' -e "SHOW TABLES FROM his;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+
| Tables_in_his                    |
+----------------------------------+
| bms_bills_record                 |
| bms_invoice_exp                  |
| bms_invoice_record               |
| bms_operator_settle_record       |
| bms_settlement_cat               |
| dms_case_history                 |
| dms_case_model                   |
| dms_case_model_catalog           |
| dms_dise                         |
| dms_dise_catalog                 |
| dms_dosage                       |
| dms_drug                         |
| dms_drug_model                   |
| dms_drug_refund_item_record      |
| dms_herbal_item_record           |
| dms_herbal_model_item            |
| dms_herbal_prescription_record   |
| dms_medicine_item_record         |
| dms_medicine_model_item          |
| dms_medicine_prescription_record |
| dms_non_drug                     |
| dms_non_drug_item_record         |
| dms_non_drug_model               |
| dms_registration                 |
| pms_patient                      |
| sms_dept                         |
| sms_description                  |
| sms_frequent_used                |
| sms_login_log                    |
| sms_permission                   |
| sms_registration_rank            |
| sms_role                         |
| sms_role_permission_relation     |
| sms_skd                          |
| sms_skd_rule                     |
| sms_skd_rule_item                |
| sms_staff                        |
| sms_workload_record              |
+----------------------------------+
[root@Services ~]# 
Redis部署
#安装Redis服务
[root@Services ~]# yum -y install redis.x86_64 

#配置Redis服务
[root@Services ~]# vim /etc/redis.conf 
[root@Services ~]# sed -rn '69p;88p;507p' /etc/redis.conf 
bind 0.0.0.0            #监听本地所有网络
protected-mode no       #关闭保护模式
requirepass hisadmin    #设置redis访问密码
[root@Services ~]# 

#启动Redis服务
[root@Services ~]# systemctl enable redis.service   #设置Redis服务开机自启动
[root@Services ~]# systemctl start redis.service    #启动Redis服务
[root@Services ~]# ss -antpul | grep redis          #确认6379端口被监听
tcp   LISTEN 0  128  0.0.0.0:6379 0.0.0.0:* users:(("redis-server",pid=7839,fd=6))
[root@Services ~]# 

#测试Redis服务
[root@Services ~]# redis-cli -h localhost -p 6379 -a hisadmin info
案例2:Jenkins全局工具配置
配置JDK环境

配置Git工具

配置Maven工具

#Jenkins主机安装Maven
[root@Jenkins ~]# ls apache-maven-3.6.3-bin.tar.gz 
apache-maven-3.6.3-bin.tar.gz
[root@Jenkins ~]# tar -xf apache-maven-3.6.3-bin.tar.gz         #解包
[root@Jenkins ~]# mv apache-maven-3.6.3 /usr/local/maven        #移动到指定目录
[root@Jenkins ~]# ls /usr/local/maven/              
bin  boot  conf  lib  LICENSE  NOTICE  README.txt
[root@Jenkins ~]# 

#配置Maven环境变量
[root@Jenkins ~]# vim /etc/bashrc                               #修改bash环境配置
[root@Jenkins ~]# tail -2 /etc/bashrc 
export MAVEN_HOME="/usr/local/maven/"   #声明MAVEN_HOME变量
export PATH=${MAVEN_HOME}/bin/:$PATH    #将MAVEN命令加入PATH
[root@Jenkins ~]# source /etc/bashrc                            #刷新bash环境
[root@Jenkins ~]# echo ${MAVEN_HOME}                            #测试变量声明
/usr/local/maven/
[root@Jenkins ~]# mvn -v                                        #测试mvn命令
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 11.0.15, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.15.0.9-2.el8_5.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix"
[root@Jenkins ~]# 

#部署Maven本地仓库
[root@Jenkins ~]# ls repository.tar.gz 
repository.tar.gz
[root@Jenkins ~]# tar -xPpf repository.tar.gz -C /      #解压Maven仓库
[root@Jenkins ~]# ls /var/lib/jenkins/.m2/
repository
[root@Jenkins ~]# ls /var/lib/jenkins/.m2/repository/
aopalliance               classworlds  commons-beanutils    commons-io       de     joda-time  net
backport-util-concurrent  cn           commons-codec        commons-lang     io     junit      org
ch                        com          commons-collections  commons-logging  javax  mysql
[root@Jenkins ~]# 
配置邮件工具
#启动邮件服务
[root@Jenkins ~]# systemctl enable postfix.service 
[root@Jenkins ~]# systemctl start postfix
[root@Jenkins ~]# ss -antpul | grep master
tcp   LISTEN 0  100   127.0.0.1:25   0.0.0.0:*    users:(("master",pid=1203,fd=13))
tcp   LISTEN 0  100   [::1]:25       [::]:*    users:(("master",pid=1203,fd=14))
[root@Jenkins ~]# 
#确认邮件接收情况
[root@Jenkins ~]# yum -y install mailx              #安装邮件客户端命令
Complete!
[root@Jenkins ~]# mail -u root                      #查看root用户邮件
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/mail/root": 1 message 1 new
>N  1 没有配置邮箱地址      Fri Feb 24 12:04  18/640   "Test email #4"
& 1
Message  1:         #查看邮件内容
From nobody@nowhere  Fri Feb 24 12:04:20 2023
Return-Path: <nobody@nowhere>
X-Original-To: root
Delivered-To: root@Jenkins.localdomain
Date: Fri, 24 Feb 2023 12:04:20 +0800 (CST)
From: 没有配置邮箱地址  <nobody@nowhere>
To: root@Jenkins.localdomain
Subject: Test email #4
Content-Type: text/plain; charset=UTF-8
Status: R

This is test email #4 sent from Jenkins

& quit
Held 1 message in /var/mail/root
[root@Jenkins ~]#
案例3:Jenkins后端工程构建
Jenkins中创建HIS-BACKEND工程
#Maven打包参数:Maven执行打包操作时需要调用pom.xml文件,所以需要指定pom.xml文件位置
clean package -Dmaven.test.skip=true    #清理旧文件、跳过测试直接打包

测试HIS-BACKEND工程构建

#Jenkins主机确认HIS-BACKEND构建情况
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/            #确认拉取HIS-BACKEND代码
HIS-BACKEND  HIS-FONTEND
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/
HIS-api  HIS-common  HIS-demo  HIS-mbg  HIS-service  pom.xml
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/
mvnw  mvnw.cmd  pom.xml  src  target
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/ #确认打包
classes  generated-sources  HIS-api-1.0-SNAPSHOT.jar  HIS-api-1.0-SNAPSHOT.jar.original  maven-archiver  maven-status
[root@Jenkins ~]# 

#清理HIS-BACKEND本次构建
[root@Jenkins ~]# rm -rf /var/lib/jenkins/workspace/HIS-BACKEND/
[root@Jenkins ~]# 
案例4:Jenkins后端自动发布
添加SSH服务器

HIS-BACKEND工程配置自动发布

Backend主机部署
  • 部署OpenJDK环境

    #安装OpenJDK-1.8
    [root@Backend ~]# yum clean all; yum repolist -v
    ...
    Total packages: 8,265
    [root@Backend ~]# yum -y install java-1.8.0-openjdk-devel.x86_64 #安装jdk-1.8

    #配置JDK环境变量
    [root@Backend ~]# ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el8_5.x86_64/ /usr/lib/jvm/jdk #制作软链接
    [root@Backend ~]# vim /etc/bashrc #配置JAVA相关环境变量
    [root@Backend ~]# tail -3 /etc/bashrc
    export JAVA_HOME="/usr/lib/jvm/jdk/" #声明JAVA_HOME
    export PATH={JAVA_HOME}/bin/:PATH #将JAVA_HOME加入PATH
    export CLASSPATH=. #声明类库路径
    [root@Backend ~]# source /etc/bashrc #刷新bash环境
    [root@Backend ~]# echo ${JAVA_HOME} #测试变量声明
    /usr/lib/jvm/jdk/
    [root@Backend ~]# java -version
    openjdk version "1.8.0_332"
    OpenJDK Runtime Environment (build 1.8.0_332-b09)
    OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
    [root@Backend ~]#

  • 部署jar包运行配置文件

    #HIS项目采用外置配置文件方式
    [root@Backend ~]# mkdir /opt/his/
    [root@Backend ~]# scp 192.168.88.10:/root/HIS/HIS-CONFIG/*.yml /opt/his/
    application-prod.yml 100% 2690 912.9KB/s 00:00
    application.yml 100% 257 374.1KB/s 00:00
    [root@Backend ~]# ls /opt/his/
    application-prod.yml application.yml
    [root@Backend ~]#

HIS-BACKEND工程自动发布测试

#Jenkins主机确认HIS-BACKEND打包成功
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar
/var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar
[root@Jenkins ~]#

#Backend主机确认jar包发布情况
[root@Backend ~]# ls /opt/his/
application-prod.yml  application.yml  HIS-api-1.0-SNAPSHOT.jar
[root@Backend ~]# 

#手工运行jar包测试HIS后端程序
[root@Backend his]# java -jar HIS-api-1.0-SNAPSHOT.jar      #前台进程
/opt/his/.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)
...
2023-02-24 13:00:24.881  INFO 9629 --- [           main] com.neu.his.HisApiApplication            : Started HisApiApplication in 13.82 seconds (JVM running for 14.352)


#另开终端验证
[root@Backend ~]# ss -antpu | grep :8888        #确认8888端口被监听
tcp   LISTEN    0      100      *:8888  *:*     users:(("java",pid=9629,fd=63))     
[root@Backend ~]# ss -antpu | grep java   

#访问测试
[root@Backend ~]# curl http://localhost:8888
<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>HIS</h1>
</body>
</html>[root@Backend ~]# curl http://localhost:8888/actuator/health?pretty
{"status":"UP","details":{"rabbit":{"status":"UP","details":{"version":"3.11.5"}},"diskSpace":{"status":"UP","details":{"total":10725883904,"free":8431407104,"threshold":10485760}},"db":{"status":"UP","details":{"database":"MySQL","hello":1}},"elasticsearch":{"status":"UP","details":{"clusterName":"elasticsearch","numberOfNodes":1,"numberOfDataNodes":1,"activePrimaryShards":22,"activeShards":22,"relocatingShards":0,"initializingShards":0,"unassignedShards":20}},"elasticsearchRest":{"status":"UP","details":{"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":22,"active_shards":22,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":20,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":52.38095238095239}},"redis":{"status":"UP","details":{"version":"5.0.3"}}}}[root@Backend ~]# 
案例5:HIS项目展示
配置Nginx前后端交互
#修改his.conf虚拟主机配置
[root@Fontend ~]# vim /etc/nginx/conf.d/his.conf 
[root@Fontend ~]# cat /etc/nginx/conf.d/his.conf 
server {
    listen 80 default_server;
    server_name __;
    access_log "/opt/his/log/$host.log";

    location / {
        root "/opt/his/web/";
        index index.html index.htm;
    }
    #配置api转发
    location /prod-api/ {
        proxy_pass http://192.168.88.60:8888/;
    }
}
[root@Fontend ~]# systemctl restart nginx.service   #重启nginx服务
[root@Fontend ~]# ss -antpul | grep nginx
tcp   LISTEN 0      128          0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=952,fd=6),("nginx",pid=951,fd=6),("nginx",pid=950,fd=6))
[root@Fontend ~]# 
HIS效果展示
#确保HIS后端程序正常运行
[root@Fontend ~]# curl http://192.168.88.60:8888/
<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>HIS</h1>
</body>
</html>
[root@Fontend ~]#

#浏览器访问HIS前端页面:http://192.168.88.70/
案例6:HIS项目全流程
清理Jenkins工作目录
#手工清理Jenkins工作目录
[root@Jenkins ~]# rm -rf /var/lib/jenkins/workspace/*
[root@Jenkins ~]# 
前端全流程
#更新HIS-FONTEND工程
    1、构建前清理/opt/his/web/下原有代码
    2、构建后自动解压fontend.tar.gz压缩包
    3、删除fontend.tar.gz压缩包
    
#构建前操作
rm -rf /opt/his/web/*       #清理旧版本文件

#构建后操作
cd /opt/his/web/            #切换到前端代码存放目录
tar -xf fontend.tar.gz      #解压fontend.tar.gz压缩包
rm -rf fontend.tar.gz       #清理fontend.tar.gz压缩包

后端全流程

#更新HIS-FONTEND工程
    1、构建前终止HIS后端jar进程
    2、清理/opt/his/目录下原有jar包
    3、发送jar后远程启动jar包
    
#构建前操作
jps | grep jar | awk '{print $1}' | xargs kill      #查找HIS后端jar包pid并杀死进程
rm -rf /opt/his/HIS-api-1.0-SNAPSHOT.jar            #清理旧版本jar包

#构建后操作
cd /opt/his/                                                    #切换到jar包目录
nohup java -jar HIS-api-1.0-SNAPSHOT.jar > ./his.log 2>&1 &     #后台启动jar包
CI/CD全流程测试
  • 前端全流程测试

    #查看现有首页内容,注意title内容为"东软云"
    [root@Fontend ~]# vim /opt/his/web/index.html
    [root@Fontend ~]#

    #Programer主机更新前端代码,title更新为"达内云"
    [root@Programer HIS-FONTEND]# vim index.html #修改title内容
    [root@Programer HIS-FONTEND]#

    [root@Programer HIS-FONTEND]# git add ./ #添加修改到暂存区
    [root@Programer HIS-FONTEND]# git commit -m "modify index.html" #生成新版本
    [master 33da040] modify index.html
    1 file changed, 1 insertion(+), 1 deletion(-)
    [root@Programer HIS-FONTEND]# git tag v2 #打v2标签
    [root@Programer HIS-FONTEND]# git push #推送分支到服务器
    枚举对象中: 5, 完成.
    对象计数中: 100% (5/5), 完成.
    使用 2 个线程进行压缩
    压缩对象中: 100% (3/3), 完成.
    写入对象中: 100% (3/3), 345 字节 | 345.00 KiB/s, 完成.
    总共 3(差异 1),复用 0(差异 0),包复用 0
    To http://192.168.88.20/devops/HIS-FONTEND.git
    2c9f9bb..33da040 master -> master
    [root@Programer HIS-FONTEND]# git push --tags #推送标签到服务器
    总共 0(差异 0),复用 0(差异 0),包复用 0
    To http://192.168.88.20/devops/HIS-FONTEND.git

    • [new tag] v2 -> v2
      [root@Programer HIS-FONTEND]#
#Fontend主机验证构建结果
[root@Fontend ~]# ls /opt/his/web/              #确认fontend.tar.gz清理情况
favicon.ico  index.html  static
[root@Fontend ~]# vim /opt/his/web/index.html   #查看页面内title内容是否为"达内云"
[root@Fontend ~]# 

#Jenkins主机确认自动清理工作目录
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/
[root@Jenkins ~]# 
  • 后端全流程测试

    #此时HIS后端jar包应为之前的手工启动前台进程
    [root@Fontend ~]# curl http://192.168.88.60:8888/

    <!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body>

    HIS

    #页面展示为HIS </body> </html>[root@Fontend ~]#

    #Programer主机更新HIS-BACKEND代码
    [root@Programer ~]# cd HIS/HIS-BACKEND/
    [root@Programer HIS-BACKEND]# vim HIS-api/src/main/resources/static/index.html
    [root@Programer HIS-BACKEND]# cat HIS-api/src/main/resources/static/index.html

    <!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body>

    医疗信息系统

    #修改后端首页内容 </body> </html> [root@Programer HIS-BACKEND]# git add . #添加修改到暂存区 [root@Programer HIS-BACKEND]# git commit -m "modify index.html" #生成版本库 [master 8343263] modify index.html 1 file changed, 2 insertions(+), 2 deletions(-) [root@Programer HIS-BACKEND]# git tag v2 #打v2标签 [root@Programer HIS-BACKEND]# git push --all #推送所有分支到服务器 枚举对象中: 15, 完成. 对象计数中: 100% (15/15), 完成. 使用 2 个线程进行压缩 压缩对象中: 100% (6/6), 完成. 写入对象中: 100% (8/8), 607 字节 | 607.00 KiB/s, 完成. 总共 8(差异 4),复用 0(差异 0),包复用 0 To http://192.168.88.20/devops/HIS-BACKEND.git f582569..8343263 master -> master [root@Programer HIS-BACKEND]# git push --tags #推送所有标签到服务器 总共 0(差异 0),复用 0(差异 0),包复用 0 To http://192.168.88.20/devops/HIS-BACKEND.git * [new tag] v2 -> v2 [root@Programer HIS-BACKEND]#

#确认结果
2023-02-24 15:29:58.229  INFO 9629 --- [       Thread-5] AnnotationNacosInjectedBeanPostProcessor : class com.alibaba.nacos.spring.beans.factory.annotation.AnnotationNacosInjectedBeanPostProcessor was destroying!
[root@Backend his]#         #手工运行jar包的前台进程退出

#确认jar包后台运行
[root@Backend his]# ss -antpu | grep :8888
tcp   LISTEN    0    100     *:8888    *:*     users:(("java",pid=9934,fd=63))     
[root@Backend his]# 

#测试访问后台首页
[root@Backend his]# curl http://localhost:8888/
<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>医疗信息系统</h1>
</body>
</html>
[root@Backend his]# 
相关推荐
davenian1 小时前
<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools
linux·ubuntu·vmware
Simulink_2 小时前
ROS学习笔记15——Xacro
linux·笔记·学习·机器人·ros
北京迅为2 小时前
【北京迅为】iTOP-4412全能版使用手册- 第五章 Linux常用命令
linux·嵌入式硬件·4412开发板
南暮思鸢2 小时前
应急响应靶机——linux2
linux·网络安全·wireshark·write up·应急响应靶机系列·宝塔面板利用·webshell流量分析
2301_775281193 小时前
当日本人说「お疲れ様」时,该怎么回?柯桥日语培训零基础学习
学习
sun0077003 小时前
ubuntu增加swap交换空间
linux·运维·服务器
E___V___E4 小时前
CSAPP学习
学习
LinuxST4 小时前
27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)
linux·开发语言·stm32·嵌入式硬件
黄焖鸡能干四碗4 小时前
【软件设计文档】详细设计说明书模板和实际项目案例参照,概要设计说明书,需求设计书,软件设计报告(Word原件)
大数据·软件需求·设计规范·规格说明书·1024程序员节
Tony_long74834 小时前
Python学习——猜拳小游戏
开发语言·python·学习