热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:DevOpsGitlab环境部署

本文由编程笔记#小编为大家整理,主要介绍了DevOpsGitlab环境部署相关的知识,希望对你有一定的参考价值。DevOps介绍
本文由编程笔记#小编为大家整理,主要介绍了DevOps Gitlab环境部署相关的知识,希望对你有一定的参考价值。

DevOps 介绍

目录
  • DevOps 介绍
    • 一、DevOps 介绍
      • 1.1.1 DevOps 介绍
      • 1.1.2 CI/CD简介
      • 1.1.2 Gitlab安装与使用

一、DevOps 介绍


1.1.1 DevOps 介绍



  1. DevOps介绍


DevOps 是Development和Operations的组合,也就是开发和运维的简写。
1、DevOps集文化理念、实践与工具与一身,可以提高组织高速交付应用程序和服务的能力,与使用 传统软件开发和基础设施管理流程相比,能够帮助企业更快速的发展和改进产品,这种速度使企业 能够更好地服务于客户,并在市场上高效地参与竞争。
2、DevOps 是针对企业中的研发人员、运维人员和测试人员的工作理念,是他们在应用开发、代码部 署和质量测试等整条生命周期中协作和沟通的最佳实践,DevOps 强调整个组织的合作以及交付和 基础设施变更的自动化、从而实现持续集成、持续部署和持续交付。
3、DevOps 平台:代码托管(gitlab/svn)、项目管理(jira/禅道/Teambition)、运维平台(腾讯蓝鲸/自主研发 平台)、持续交付(Jenkins/gitlab)。
技术图片



  1. . 为什么要推广DevOps


DevOps 强调团队协作、相互协助、持续发展,然而传统的模式是开发人员只顾开发程序,运维 只负责基础环境管理和代码部署及监控等,其并不是为了一个共同的目标而共同实现最终的目的, 而DevOps 则实现团队作战,即无论是开发、运维还是测试,都为了最终的代码发布、持续部署和业 务稳定而付出各自的努力,从而实现产品设计、开发、测试和部署的良性循环,实现产品的最终持 续交付。

3.DevOps的优势

速度:应用版本快速的迭代更新,以更好地适应不断变化的市场需求。 快速交付:更快的将应用交付至生产环境。 可靠性:保证应用交付的结果是成功的。 规模:可以在大规模环境下且可靠的交付应用。 增强合作:建立适应DevOps文化模式的团队,开发人员和运维人员协同工作。 安全性:在快速迭代的同时保证应用的质量。

1.1.2 CI/CD简介



  1. 什么是持续集成(CI-Continuous integration)


持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代 码行合并到一起并切相互不影响工作。
技术图片
2.什么是持续部署(CD-continuous deployment)
是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实 现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代 速率
技术图片
技术图片
技术图片


1.1.2 Gitlab安装与使用



  1. Git、Gitlab、GitHub介绍


Git: 由linux之父Linus Torvalds(林纳斯·托瓦兹,1969年12月28日出生)在2005年开发的一个分 布式持续集成工具,设计之初就具备了以下优点: 可靠性:数据的上传和下载必须是安全的、一致的,所有行为都要进行验证,数据的变更通过不同的版本 进行逻辑隔离。 分布式:Linus Torvalds认为之前的集中式版本控制系统性能太差,于是git的代码恢复不依赖于中央服务 器,而是每个开发电脑都是一个本地仓库,可用于代码提交与回滚。 高效:Git基于分布式的功能实现代码的快速提交与秒级回滚。
Github:基于git的一个公有代码仓库,GitHub于2008年4月10日正式上线,2018年6月,微软宣布通 过75亿美元的股票交易收购GitHub。
Gitlab:基于git的一个私有代码仓库。



  1. Gitlab部署

[root@gitlab ~]# mkdir -p /server/tools
[root@gitlab ~]# cd /server/tools/
[root@gitlab /server/tools]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
--2020-07-01 23:02:46-- https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
[root@gitlab /server/tools]# ll
total 648548
-rw-r--r-- 1 root root 664112883 Jul 1 22:16 gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
[root@gitlab /server/tools]# yum install policycoreutils-python -y
[root@gitlab /server/tools]# rpm -ivh gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
warning: gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID f27eab47: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:gitlab-ce-11.11.8-ce.0.el7 ################################# [100%]
[root@gitlab ~]# rpm -qa gitlab-ce
gitlab-ce-11.11.8-ce.0.el7.x86_64

配置Gitlab.rb

gitlab官方文档有各邮箱详细配置
https://docs.gitlab.com/omnibus/settings/smtp.html
external_url ‘http://10.4.7.56‘ #域名或IP地址
gitlab_rails[‘smtp_enable‘] = true
gitlab_rails[‘smtp_address‘] = "smtp.qq.com"
gitlab_rails[‘smtp_port‘] = 465
gitlab_rails[‘smtp_user_name‘] = "XXXX@qq.com" #qq邮箱账号
gitlab_rails[‘smtp_password‘] = "ypyvpirefumrbjed" # #qq授权码
gitlab_rails[‘smtp_domain‘] = "smtp.qq.com"
gitlab_rails[‘smtp_authentication‘] = "login"
gitlab_rails[‘smtp_enable_starttls_auto‘] = true
gitlab_rails[‘smtp_tls‘] = true
gitlab_rails[‘gitlab_email_from‘] = XXXX@qq.com #和smtp_user_name一致
gitlab_rails[‘gitlab_email_enabled‘] = true
重新加载配置文件
[root@gitlab ~]# gitlab-ctl reconfigure
[root@gitlab ~]# gitlab-ctl status
run: alertmanager: (pid 5965) 317s; run: log: (pid 5688) 354s
run: gitaly: (pid 5848) 322s; run: log: (pid 4910) 516s
run: gitlab-monitor: (pid 5900) 321s; run: log: (pid 5562) 387s
run: gitlab-workhorse: (pid 5879) 322s; run: log: (pid 5410) 427s
run: logrotate: (pid 5459) 412s; run: log: (pid 5474) 409s
run: nginx: (pid 5426) 423s; run: log: (pid 5440) 420s
run: node-exporter: (pid 5891) 322s; run: log: (pid 5524) 398s
run: postgres-exporter: (pid 5979) 317s; run: log: (pid 5776) 343s
run: postgresql: (pid 5065) 503s; run: log: (pid 5082) 500s
run: prometheus: (pid 5919) 321s; run: log: (pid 5629) 365s
run: redis: (pid 4839) 525s; run: log: (pid 4852) 522s
run: redis-exporter: (pid 5909) 321s; run: log: (pid 5594) 376s
run: sidekiq: (pid 5355) 441s; run: log: (pid 5372) 437s
run: unicorn: (pid 5297) 452s; run: log: (pid 5328) 449s
#gitlab安装目录:
/etc/gitlab #配置文件目录
/run/gitlab #运行pid目录
/opt/gitlab #安装目录
/var/opt/gitlab #数据目录
/var/log/gitlab #日志目录
# gitlab-ctl #客户端命令行操作行
# gitlab-ctl stop #停止gitlab
# gitlab-ctl start #启动gitlab
# gitlab-ctl restart #重启gitlab
# gitlab-ctl status #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志
浏览器访问:520报错解决
chmod -R 755 /var/log/gitlab #502报错

技术图片
4. Git命令的使用
技术图片

基础命令:
git clone #克隆项目到本地
git add #添加项目到暂存区
git status #查看本地工作区和暂存区的状态
git comit -m ‘‘ #提交项目到本地
git push #提交项目到远程仓库
[root@jenkins ~]# yum install git -y
[root@jenkins ~]# rpm -qa git
git-1.8.3.1-23.el7_8.x86_64
[root@jenkins ~]# cd /opt/
[root@jenkins /opt]# git clone http://10.4.7.56/magedu/devops.git
Cloning into ‘devops‘...
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
[root@jenkins /opt]# ll
total 0
drwxr-xr-x 3 root root 36 Jul 2 21:37 devops
#注意:clone的时候项目里文件不能为空,需要代码。否则会有坑。
编辑项目:
[root@jenkins /opt]# cd devops/
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


提交项目到暂存区
[root@jenkins /opt/devops]# git add index.html
查看项目
[root@jenkins /opt/devops]# git status;
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: index.html
#
提交项目到本地仓库
[root@jenkins /opt/devops]# git commit -m ‘v3‘ ./
[master d2f8e8f] v3
1 file changed, 1 insertion(+)
提交项目到远程仓库
[root@jenkins /opt/devops]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching‘ to ‘simple‘. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See ‘git help config‘ and search for ‘push.default‘ for further information.
(the ‘simple‘ mode was introduced in Git 1.7.11. Use the similar mode
‘current‘ instead of ‘simple‘ if you sometimes use older versions of Git)
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
d49a0a9..d2f8e8f master -> master


  1. 设置全局用户和邮箱

[root@jenkins /opt/devops]# git config --global user.name ‘user1‘
[root@jenkins /opt/devops]# git config --global user.email ‘user1@163.com‘
#注意用户和邮箱可为真亦可为假。只要格式正确(上面设置为假)
[root@jenkins /opt/devops]# git config --global push.default current


  1. git 其它命令使用

git log #查看操作日
[root@jenkins /opt/devops]# git log
commit dfa58caf1adfd64962d3f200fa29e50cf526f69b
Author: root
Date: Thu Jul 2 22:22:04 2020 +0800
v4
commit d2f8e8fb622e9a6f4a2f206626add8ee569d03ae
Author: root
Date: Thu Jul 2 21:56:54 2020 +0800
v3
commit d49a0a94994496d90014891f95f9d36ab91cc4c3
Author: root
Date: Thu Jul 2 21:04:07 2020 +0800
v2
commit ba59ed9d0f3e32ac889bfe06b8ce54334714504e
Author: zhangxiaoming
Date: Thu Jul 2 20:53:50 2020 +0800
v1
.gitignore #定义忽略某些指定文件或者目录不上传至gitlab 默认是没有的需要创建
比如:mysql.cnf里面有一些敏感(保密)的信息,不想上传到Gitlab上,就可以这样操作
[root@jenkins /opt/devops]# vim my.cnf #里面随便一点内容做测试
[root@jenkins /opt/devops]# vim .gitignore
[root@jenkins /opt/devops]# cat .gitignore
my.cnf #忽略my.cnf文件不git push 远程仓库
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m ‘config‘ ./
[master e846f4f] config
1 file changed, 1 insertion(+)
create mode 100644 .gitignore
[root@jenkins /opt/devops]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching‘ to ‘simple‘. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See ‘git help config‘ and search for ‘push.default‘ for further information.
(the ‘simple‘ mode was introduced in Git 1.7.11. Use the similar mode
‘current‘ instead of ‘simple‘ if you sometimes use older versions of Git)
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 256 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
b25ff63..e846f4f master -> master
假如你的zookeeper.cnf配置文件没有加入.gitignore里面,就会上传到远程仓库
[root@jenkins /opt/devops]# cp my.cnf zookeeper.cnf
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "zookeeper.cnf"
[master e7712c3] zookeeper.cnf
2 files changed, 99 insertions(+)
create mode 100644 .gitignore
create mode 100644 zookeeper.cnf
[root@jenkins /opt/devops]# git status
# On branch master
# Your branch is ahead of ‘origin/master‘ by 1 commit.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 1.20 KiB | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
4bae31f..e7712c3 HEAD -> master

技术图片
没有上传mysql的配置文件但有zookeeper的配置文件
7. git 版本回滚命令

git reset --hard HEAD^^ #git版本回滚,HEAD为当前版本,加一个^为上一个,^^为上上一个版本
git reflog #获取每次提交的ID,可以使用--hard根据提交的ID进行版本回退
git reset --hard 5ae4b06 #回退到指定id的版本
多添加几个版本做测试:
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v5"
[master e746a8f] v5
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 335 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
e7712c3..e746a8f HEAD -> master
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v6"
[master a840fa7] v6
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
e746a8f..a840fa7 HEAD -> master
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v7"
[master fd75b2e] v7
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 335 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
a840fa7..fd75b2e HEAD -> master
[root@jenkins /opt/devops]# git log
commit fd75b2ed1e3bff195f6c0356a117c903122d0b4e
Author: user1
Date: Thu Jul 2 23:35:58 2020 +0800
v7
commit a840fa7eaab4a05402781251f81dd5a7e0175af7
Author: user1
Date: Thu Jul 2 23:34:32 2020 +0800
v6
commit e746a8f8c98c769b6536f62f512c8f64288f05b3
Author: user1
Date: Thu Jul 2 23:31:36 2020 +0800
v5
回到v6版本
[root@jenkins /opt/devops]# git re
rebase relink repack request-pull revert
reflog remote replace reset
[root@jenkins /opt/devops]# git reset --hard HEAD^
HEAD is now at a840fa7 v6
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


跨版本回滚
[root@jenkins /opt/devops]# git pull
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Updating a840fa7..fd75b2e
Fast-forward
index.html | 1 +
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


v777777777777


查看commit id 号(全局唯一不重复)
[root@jenkins /opt/devops]# git log
commit fd75b2ed1e3bff195f6c0356a117c903122d0b4e #这就是ID号
Author: user1
Date: Thu Jul 2 23:35:58 2020 +0800
比如回滚到zookeeper
[root@jenkins /opt/devops]# git reset --hard e7712c
HEAD is now at e7712c3 zookeeper.cnf
查看commit ID号的命令还有一个git reflog (更加详细)
[root@jenkins /opt/devops]# git reflog
e7712c3 HEAD@{0}: reset: moving to e7712c
fd75b2e HEAD@{1}: pull: Fast-forward
a840fa7 HEAD@{2}: reset: moving to HEAD^
fd75b2e HEAD@{3}: commit: v7
a840fa7 HEAD@{4}: commit: v6
e746a8f HEAD@{5}: commit: v5
e7712c3 HEAD@{6}: commit: zookeeper.cnf
4bae31f HEAD@{7}: clone: from http://10.4.7.56/magedu/devops.git


  1. 分支相关命令

git branch #查看当前所处的分支
git branch develop #创建新分支
git checkout -b develop #创建并切换到一个新分支
git checkout develop #切换分支
git branch -d 分支名 #删除本地已经合并了的分支.
git branch –D 分支名 #删除本地未合并的分支
git push origin –delete 分支名 #要删除服务器远端的分支。
查看当前分支
[root@jenkins /opt/devops]# git branch
* master
创建分支
[root@jenkins /opt/devops]# git checkout -b develop
Switched to a new branch ‘develop‘
切换分支
[root@jenkins /opt/devops]# git checkout develop
Switched to branch ‘develop‘
常见的分支结构: 单分支模型:只有master分支
生产/开发模型:master分支与develop类型分支
特性/发布模型:master/develop/feature类型分支
开发/发布/分离模型:master/develop/feature/release类型分支
开发/发布/缺陷分离模型:master/develop/feature/release/hotfix类型分支

8 git分支合并

换一台虚拟主机做测试:
[root@db03 /opt]# cd /opt/
[root@db03 /opt]# yum install git -y
clone指定分支:-b 分支名
[root@db03 /opt]# git clone -b develop http://10.4.7.56/magedu/devops.git
Cloning into ‘devops‘...
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 35 (delta 8), reused 25 (delta 5)
Unpacking objects: 100% (35/35), done.
[root@db03 /opt/devops]# git branch
* develop
[root@db03 /opt/devops]# vim index.html
[root@db03 /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


v777777777777


v888888888888

#加这么一行
[root@db03 /opt/devops]# git config --global user.name ‘user1‘
[root@db03 /opt/devops]# git config --global user.email ‘user1@163.com‘
[root@db03 /opt/devops]# git config --global push.default current
添加代码到暂存区
[root@db03 /opt/devops]# git add ./
提交代码
[root@db03 /opt/devops]# git commit -m "v9"
[develop 7755ca9] v9
1 file changed, 1 insertion(+)
提交代码到远程仓库
[root@db03 /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 339 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for develop, visit:
remote: http://10.4.7.56/magedu/devops/merge_requests/new?merge_request%5Bsource_branch%5D=develop
remote:
To http://10.4.7.56/magedu/devops.git
fd75b2e..7755ca9 HEAD -> develop
换一台主机或者在Windows上将最新的的代码pull到本地
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 12 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
From http://10.4.7.56/magedu/devops
e7712c3..fd75b2e master -> origin/master
* [new branch] develop -> origin/develop
Updating e7712c3..fd75b2e
Fast-forward
index.html | 3 +++
1 file changed, 3 insertions(+)
分支合并
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git merge origin/develop
Updating fd75b2e..7755ca9
Fast-forward
index.html | 1 +
1 file changed, 1 insertion(+)
上传远程仓库
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
fd75b2e..7755ca9 master -> master

技术图片
分支版本已经合并master分支

除了在本地合并外,还可以在web页面合并(生产常用)
开发申请合并
技术图片
技术图片
技术图片
技术图片
技术图片
项目负责人登录web合并分支
技术图片
技术图片
合并分支成功





























推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • IamsettingupApacheserverwithTortoiseSVNforalocalsourcecoderepository.Ihaveobservedt ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
author-avatar
_我是谁谁谁__950
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有