linux12Devops --> 01软件开发生命周期、持续集成、代码管理工具Git

一、软件开发生命周期

软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程的集合 。
  • 需求分析:根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
  • 设计:系统架构和满意状态(就是要做成什么样子,有什么功能)和创建一个项目计划。计划可以使用图表,布局设计挥着文字方式呈现。
  • 实现:项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
  • 测试:测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
  • 进化:最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug修复,功能增加等
#  软件开发生命周期
1、设计 ---> 需求分析

2、实现
	写配置清单,构建容器,部署一个测试环境
3、测试
4、优化(迭代)

二、开发模式

### 1.敏捷开发  (Agile Development)  

核心是迭代开发与增量开发

### 2.迭代开发  (Iterative Development)  

对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次"大 开发";迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次"大开发"变成多次"小开 发",每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。

### 3.增量开发  (Incremental Development) 
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。

三、持续集成(CI)持续交付(CD)持续部署(CD)

1.持续集成( Continuous integration )
持续集成是软件开发周期的一种实践,把代码仓库(Gitlab或者Github)、构建工具(如Jenkins)和测试工具(SonarQube)集成在一起,频繁的将代码合并到主干然后自动进行构建和测试。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。通过持续集成,团队可以快速的从一个功能到另一个功能。在持续集成的过程当中主要包括以下步骤:提交、测试、构建(容器需要构建, 编译型语言编译)、部署及回滚。

在这里插入图片描述

1)持续集成要素
# 1、一个自动构建过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预 
# 2、 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用SVN或Git。
# 3、 一个持续集成服务器, Jenkins 就是一个配置简单和使用方便的持续集成服务。
2)持续集成的好处
  • 1、降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少
  • 2、对系统健康持续检查,减少发布风险带来的问题
  • 3、减少重复性工作
  • 4、持续部署,提供可部署单元包
  • 5、持续交付可供使用的版本
  • 6、增强团队信心
2.持续交付( Continuous Delivery )

持续交付,简称CD,是在CI的基础进行了扩展,在CI环节完成了软件构建和测试工作并形成了新的版本,那么接下来就要进行交付,而这里的交付并不是交付到生产环境,而是类生产环境(STAGING),我们可以理解为灰度环境或者预发环境,进而接受部分真实流量的测试。如果没有问题的话则通过手动的方式部署到生产环境。
在这里插入图片描述

3.持续部署( Continuous Deployment )

持续部署,简称CD,它是在持续交付的基础上打通最后一公里的工作,就是把手动部署到生产环境的方式升级为自动部署。看下图和上图在最后部署到生产环境中的区别。

在这里插入图片描述

四、部署代码到服务器的方式

# 1、早期两者方式
1、将代码上传到服务器,然后解压

2、将代码上传到服务器中,然后通过软连接的方式部署 ln -s /root/jenkins /usr/share/nginx/html/

无法实现批量部署,无法实现批量回滚,更无法实现批量测试。
# (ansible只是一个自动化部署工具,无法进行重复利用)

以上两种方式都无法实现批量部署,无法实现批量回滚,更无法实现批量测试。

  • 实现自动集成(java、golang)、自动部署、自动测试: DevOps

  • 实现自动集成、自动部署:Jenkins

  • 代码类型:

    # 1、批量部署,批量测试
    
    1、源代码管理
    2、协同开发
    
    # 2、代码管理工具
    自动集成(java、golang)、自动部署、自动测试: DevOps
    代码:
    	编译型语言:需要编译,后运行
    	脚本型语言:直接运行
    
  • 工具种类:

    # 工具:
    实现自动集成、自动部署:Jenkins
    实现代码管理:git --giterb管理页面-> gitlab、github、gitee
    

五、代码管理工具Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而是一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必有服务器端软件支持。

1.安装Git
# 1.安装git
[root@jenkins ~]# yum install git -y
[root@jenkins ~]# git  --version  #查看版本
git version 1.8.3.1
2.仓库

仓库对应的就是一个目录,这个目录中的所有文件被git管理起来。以后会将一个项目的根目录,作为仓库。仓库中的每个文件的改动 都由git跟踪。

#1.新建一个data仓库
[root@jenkins ~]# mkdir data
[root@jenkins ~]# cd data/

#2.初始化代码仓库
[root@jenkins data]# git init
初始化空的 Git 版本库于 /root/data/.git/
[root@jenkins data]# ll -a
total 0
drwxr-xr-x  3 root root  18 Aug 11 23:47 .
dr-xr-x---. 4 root root 207 Aug 11 23:47 ..
drwxr-xr-x  7 root root 119 Aug 11 23:47 .git
[root@jenkins data]# cd .git/  #这里存放的都是git的配置文件
[root@jenkins .git]# ll
total 12
drwxr-xr-x 2 root root   6 Aug 11 23:47 branches
-rw-r--r-- 1 root root  92 Aug 11 23:47 config
-rw-r--r-- 1 root root  73 Aug 11 23:47 description
-rw-r--r-- 1 root root  23 Aug 11 23:47 HEAD
drwxr-xr-x 2 root root 242 Aug 11 23:47 hooks
drwxr-xr-x 2 root root  21 Aug 11 23:47 info
drwxr-xr-x 4 root root  30 Aug 11 23:47 objects
drwxr-xr-x 4 root root  31 Aug 11 23:47 refs
3.远程仓库
# github   gitee   gitlab

#1.下载远程仓库
[root@jenkins ~]# git clone https://gitee.com/mming2021/data.git
正克隆到 'data'...
warning: 您似乎克隆了一个空版本库。

#2.设置用户名和邮箱
[root@git ~/data]# git config --global user.name "mming2021"
[root@git ~/data]# git config --global user.email "9205210+mming2021@user.noreply.gitee.com"

#3.查看信息
[root@git ~/data]# git config --get user.name
mming2021
[root@git ~/data]# git config --get user.email
9205210+mming2021@user.noreply.gitee.com
#4.关联命令
[root@jenkins data1]# git remote add origin git@gitee.com:mming2021/data-discuz.git  #关联命令
#5.查看远程连接
git remote -v  
#6. 删除远程连接
git remote rm origin 
4.提交代码
#1.创建源代码文件
[root@git ~/data]# echo 'hello world' > index.html
[root@git ~/data]# ll
总用量 0
-rw-r--r-- 1 root root 0 3月  24 06:09 index.html
[root@git ~/data]# git status  #查看状态
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	index.html
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

#注:此时的源代码还没有交给git管理,如果删除源代码文件,git不会有报错信息,代码会被彻底删除

#2.将代码提交到git暂存区
[root@git ~/data]# git add index.html 
[root@git ~/data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#	新文件:    index.html

#注:此时源代码文件已经提交到git,如果此时删除源代码,文件不会被彻底删除,git查看会有报错信息,还可以使用git移回文件

#3.将代码提交到git缓冲区
[root@git ~/data]# git commit -m 'init' .  #-m参数是添加注释
[master(根提交) 425fb32] init
 1 file changed, 1 insertion(+)
 create mode 100644 index.html
 # 注:添加到暂存区代码是可以修改的,修改后可以将修改的内容重新添加后暂存区。从暂存区添加到缓存区内容是不可以修改的。
 
#4.查看修改内容(+代表添加,-代表删除)
[root@git ~/data]# git diff index.html
diff --git a/index.html b/index.html
index 3b18e51..ec6cee9 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
 hello world
+hello mm
[root@git ~/data]# vim index.html 
hello world  # 如果修改内码,下面git status状态会变的
[root@git ~/data]# git add index.html 
[root@git ~/data]# git status   #修改后再查看会显示修改字样
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	修改:      index.html
#5.在远程创建仓库并把本地的ssh公钥复制到仓库中
#6.远程推送
[root@git ~/data]# git push -u origin master
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 216 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To git@gitee.com:mming2021/depove-test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

在这里插入图片描述

4.回滚
#1.查看提交代码历史记录
[root@jenkins data]# git log
commit 3a47bf413ea47bba8d47e0f6c5220c768108fafe
Author: elaina_mm <1715554782@qq.com>
Date:   Thu Aug 12 00:06:42 2021 +0800

    init

commit 0476939d64f6ef497a1a695865bf5a3fe64e0ebe
Author: elaina_mm <1715554782@qq.com>
Date:   Thu Aug 12 00:06:20 2021 +0800

    init
commit 6c7e8316a6602fe199e933a2c740b7b15b310a24
Author: Your Name <you@example.com>
Date:   Wed Aug 11 23:57:35 2021 +0800
    init    
#2.回滚 
[root@jenkins data]# git reset 0476939d64f6ef497a1a695865bf5a3fe64e0ebe
[root@jenkins data]# git reset --hard 425fb32d50f71f8f4a78e7037f58ff8869b40f7c  # 指定版本
HEAD 现在位于 425fb32 init
5.将本地代码提交到远程仓库
#1.下载远程仓库
[root@jenkins ~]# git clone https://gitee.com/mming2021/data.git 
Cloning into 'data'...
warning: You appear to have cloned an empty repository.
warning: 您似乎克隆了一个空版本库。

#2.设置用户名和邮箱
[root@git ~/data]# git config --global user.name "mming2021"
[root@git ~/data]# git config --global user.email "9205210+mming2021@user.noreply.gitee.com"

#3.查看信息
[root@git ~/data]# git config --get user.name
mming2021
[root@git ~/data]# git config --get user.email
9205210+mming2021@user.noreply.gitee.com

#4.将本地代码提交到远程仓库
[root@git ~/data]# git push -u origin master 
Username for 'https://gitee.com': 15132332840
Password for 'https://15132332840@gitee.com': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 217 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/mming2021/data.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
分支 master 设置为跟踪来自 origin 的远程分支 master。

#5.使用SSH将我们的代码提交到远程仓库
[root@git ~/data]# vim .git/config   #修改配置文件
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@gitee.com:mming2021/data.git #将http修改成ssh方式
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[root@git ~/data]# ssh-keygen -t rsa  #生成密钥
[root@git ~/data]# cat /root/.ssh/id_rsa.pub #查看公钥,复制公钥到gitee上添加公钥(如下图)
# 修改配置文件,重新加载
[root@git ~/data]# vim index.html 
[root@git ~/data]# git add index.html
[root@git ~/data]# git commit -m 'init'  # -m '注释' ,必须写
[master ce7496f] init
 1 file changed, 2 insertions(+)

[root@git ~/data]# git push -u origin master  #免密提交
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes  # 输入yes直接上传
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Counting objects: 5, done.
Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To git@gitee.com:mming2021/data.git
   338cf8c..ce7496f  master -> master
Branch master set up to track remote branch master from origin.

在这里插入图片描述

6.拉取远程仓库代码
# 1、另外一个人也在登录git账号
[root@jenkins ~]# mkdir jenkins
[root@jenkins ~]# cd jenkins/
[root@jenkins jenkins]# git clone  git@gitee.com:mming2021/data.git
# 2、进入仓库修改内码
[root@jenkins jenkins]# cd data/
[root@git ~/data]# vim index.html 
hello world
hello mm
# 3、提取到仓库
[root@git ~/data]# git add index.html
[root@git ~/data]# git commit -m 'init'
[master 330e53a] init
 1 file changed, 1 insertion(+), 2 deletions(-)
[root@git ~/data]# git push -u origin master  #发送到gitee
# 4、在另一个终端查看
[root@git ~/data]# git pull
[root@git ~/data]# cat index.html 
hello world
hello mm
 # git pull 和 git clone 之间有什么不同?
 1、git pull  是更新代码:在现有的仓库里将远程修改过的代码更新到本地仓库
 2、git clone 是下载代码:需要创建仓库,本地仓库与远程仓库连接起来
7.分支(不同分支之间是相对隔离的)
# 房子 ---> 房间
# git仓库  ---> 代表是房间

不同的分支之间是相对隔离的。

代码仓库:mm

开发环境
测试环境
预发布环境
线上环境
#1.查看本地分支
[root@git ~/data]# git branch  #必须在存放内码的目录,否则无效
* master  #默认的master分支

#2.查看远程分支
[root@git ~/data]# git branch -a
* master
  remotes/origin/master

#3.创建分支
[root@git ~/data]# git checkout -b test
切换到一个新分支 'test'
[root@git ~/data]# git branch
  master
* test
#4.修改内码
[root@git ~/data]# cat index.html 
hello world
hello mm
[root@git ~/data]# git add index.html
[root@git ~/data]# git commit -m 'init'
#5.将本地分支同步到远程分支
[root@git ~/data]# git branch  #前提要保证当前在要同步的分支上
  master
* test
[root@git ~/data]# git push -u origin test 
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
remote: Create a pull request for 'test' on Gitee by visiting:
remote:     https://gitee.com/mming2021/data/pull/new/mming2021:test...mming2021:master
To git@gitee.com:mming2021/data.git
 * [new branch]      test -> test
分支 test 设置为跟踪来自 origin 的远程分支 test。

#5.切换分支
[root@git ~/data]# git checkout master
切换到分支 'master'
[root@git ~/data]# git branch  # *在那个分支就代表那个分支
* master
  test
#6.查看分支 -- 见下图

在这里插入图片描述

8.标签(是一种特殊的分支,只能删除不能修改)
#代码上传之后打上标签
# 本地创建标签
# 1.本地创建
git tag -a [tag名称] -m "解释"
[root@git ~/data]# git tag -a v1-stable -m '第一个标签'
[root@git ~/data]# git tag
v1-stable
# 远程创建标签
# 2.远程仓库创建鼠标点点
/标签/创建标签
# 3.另一个终端查看 (标签自动创建)
[root@git ~/data]# git pull
[root@git ~/data]# git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test
[root@git ~/data]# git tag
v1-stable
[root@git ~/data]# cat index.html 
hdello world
hello mm
hello mm
hello mm
# 4.拉取指定标签内容
git clone -b [标签名称|分支名称] [仓库地址]
[root@git ~/data]# git clone git@gitee.com:mming2021/data.git #默认是master
[root@git ~/data]# git clone -b master git@gitee.com:mming2021/data.git
[root@git ~/data]# git clone -b master v1-stable  git@gitee.com:mming2021/data.git # 指定标签
正克隆到 'data'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (7/7), done.

六、练习

# 1、实现脚本通过标签部署discuz
1、准备代码
2、提交的git暂存区
3、配置用户名和邮箱
4、提交
5、推送(认证)
6、创建标签
7、编写部署脚本

创建本地仓库,关联上远程仓库,并实现脚本通过标签部署discuz

#1.创建本地仓库
[root@jenkins ~]# mkdir data1
[root@jenkins ~]# cd data1
[root@jenkins data1 ~]# git init
初始化空的 Git 版本库于 /root/data1/.git/

#2.将本地仓库关联上远程仓库(前提要有远程仓库)
[root@jenkins data1]# git remote add origin git@gitee.com:mming2021/data-discuz.git  #关联命令
[root@jenkins data1]# cat .git/config  #关联远程仓库后的配置文件
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@gitee.com:mming2021/data-discuz.git  #远程仓库的地址
	fetch = +refs/heads/*:refs/remotes/origin/*

#3.准备discuz包
[root@jenkins data1]# mkdir discuz
[root@jenkins data1]# mv Discuz_X3.4_SC_UTF8_20210320.zip discuz/
[root@jenkins data1]# cd discuz/
[root@jenkins discuz]# unzip Discuz_X3.4_SC_UTF8_20210320.zip 
总用量 12172
-rw-r--r--  1 root root 12330468 4月   7 2021 Discuz_X3.4_SC_UTF8_20210320.zip
-rw-r--r--  1 root root    17886 3月  20 10:36 LICENSE
-rw-r--r--  1 root root    31040 1月  19 17:18 qqqun.png
drwxr-xr-x  2 root root      124 3月  22 19:44 readme
-rw-r--r--  1 root root    71107 1月  19 17:20 readme.html
drwxr-xr-x 13 root root     4096 3月  22 19:44 upload
drwxr-xr-x  4 root root       94 3月  22 19:44 utility
[root@jenkins discuz]# mv upload/* /root/data1/
[root@jenkins discuz]# cd ..
[root@jenkins data1]# rm -rf discuz/
[root@jenkins data1]# ll
总用量 68
-rw-r--r--  1 root root 2834 3月  22 19:44 admin.php
drwxr-xr-x  9 root root  135 3月  22 19:44 api
-rw-r--r--  1 root root  727 3月  22 19:44 api.php
drwxr-xr-x  2 root root   23 3月  22 19:44 archiver
drwxr-xr-x  2 root root   90 3月  22 19:44 config
-rw-r--r--  1 root root 1040 3月  22 19:44 connect.php
-rw-r--r--  1 root root  106 3月  22 19:44 crossdomain.xml
drwxr-xr-x 12 root root  178 3月  22 19:44 data
drwxr-xr-x  5 root root  140 4月   6 06:39 discuz
-rw-r--r--  1 root root 5558 3月  20 10:36 favicon.ico
-rw-r--r--  1 root root 2245 3月  22 19:44 forum.php
-rw-r--r--  1 root root  821 3月  22 19:44 group.php
-rw-r--r--  1 root root 1280 3月  22 19:44 home.php
-rw-r--r--  1 root root 6472 3月  22 19:44 index.php
drwxr-xr-x  5 root root   64 3月  22 19:44 install
drwxr-xr-x  2 root root   23 3月  22 19:44 m
-rw-r--r--  1 root root 1025 3月  22 19:44 member.php
-rw-r--r--  1 root root 2371 3月  22 19:44 misc.php
-rw-r--r--  1 root root 1788 3月  22 19:44 plugin.php
-rw-r--r--  1 root root  977 3月  22 19:44 portal.php
-rw-r--r--  1 root root  582 3月  22 19:44 robots.txt
-rw-r--r--  1 root root 1155 3月  22 19:44 search.php
drwxr-xr-x 10 root root  168 3月  22 19:44 source
drwxr-xr-x  7 root root   86 3月  22 19:44 static
drwxr-xr-x  3 root root   38 3月  22 19:44 template
drwxr-xr-x  7 root root  106 3月  22 19:44 uc_client
drwxr-xr-x 13 root root  241 3月  22 19:44 uc_server
#4.将diacuz所有文件添加到远程仓库
[root@jenkins data1]# git add . #代表当前目录下的所有文件提交到暂存区
[root@jenkins data1]# git config --global user.name "mming2021"
[root@jenkins data1]# git config --global user.email "1715554782@qq.com"
[root@jenkins data1]# git commit -m 'init' .

#5.将公钥添加到gitee
[root@jenkins data1]# cat ~/.ssh/id_rsa.pub 
复制粘贴公钥内容到gitee设置内添加
#6.推送到远程仓库
[root@jenkins data1]# git push -u origin master
#查看gitee仓库就自动更新了
#7.代码推送成功后可以在gitee上创建一个标签,代码就无法修改了
/标签/创建标签/
#8.编写部署脚本
[root@jenkins ~]# mkdir -pv /usr/share/nginx/html

[root@jenkins ~]# vim discux.sh
#/bin/bash

REPOASITORY=discuz-`date +%F_%H:%M:%S`
REPOASITORY_URL="git@gitee.com:mming2021/data-discuz.git"
REPOASITORY_TAG=$1
CURRENT_DIR=`pwd`  #当前路径
echo $1
git clone -b ${REPOASITORY_TAG} ${REPOASITORY_URL} ${REPOASITORY}
rm -rf /usr/share/nginx/html
ln -s ${CURRENT_DIR}/${REPOASITORY} /usr/share/nginx/html

#9.执行脚本
[root@jenkins ~]# chmod +x discux.sh 
[root@jenkins ~]# ./discux.sh v1-stable
#10.查看是否挂载成功
[root@jenkins ~]#  ll /usr/share/nginx/
total 0
lrwxrwxrwx 1 root root 32 Aug 12 12:03 html -> /root/discuz-2021-08-12_12:03:52
# 11.查看部署文件
[root@jenkins ~]# ll
-rwxr-xr-x   1 root root  311 Aug 12 12:03 discux.sh
drwxr-xr-x  14 root root 4096 Aug 12 12:03 discuz-2021-08-12_12:03:52

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL-09-19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值