内网centos8安装gitlab私有化部署
- 因为内网无法连接外网,所以优先下载了rpm包再传到linux服务器进行安装
- 官方下载地址:https://packages.gitlab.com/gitlab/gitlab-ce
- 注意由于我们是centos8 所以选择el8 7选择el7
- 上传rpm包到服务器,执行rpm -ivh gitlab-ce-15.10.0-ce.0.el8.x86_64.rpm
- 耐心等待进度
值类型
包括:基本数据类型 int、float、bool、string;数组、结构体struct
声明一个值类型的变量,变量直接存储的是值,内存通常在 栈 上分配
引用类型
包括:指针、切片slice、map、管道channel、interface
声明一个引用类型的变量,变量存储的是一个地址,这个地址对应的内存空间中存储的才是具体的值,内存通常在 堆 上分配,当没有任何变量引用这个地址的时候,该地址对应的内存空间会被 GC 回收
基本数据类型
var a int //声明一个int类型的变量
var b struct { //声明一个结构体
Name string
}
var a = 8 //声明变量的同时赋值,编译器自动推导其数据类型
var a int = 8 //声明变量的同时赋值
var { //批量声明变量,简洁
a int
b string
}
var (
a int
b bool
xx,yy,dd string="xx","yy","dd"
//这里省略变量类型也是可以的.
zz,aa="zz","aa"
)
//已声明,但未使用
var a=1
//标识为已抛弃的变量.未使用的变量编译会报错
_=a
//简化方法,:=无法定义全局变量
var tmpStr = ""
var tmpStr string = ""
tmpStr :=""
复杂数据类型
//数组
var a [3]intname [nums]type
r := [...]int{99 :-1}
//数组长度位置出现省略号表示由初始化元素个数来确定长度。
//数组长度是类型的一部分(不同长度类型不同编译会发生报错),数组长度必须是常量表达式。
//如果一个数组元素类型可以比较,那数组之间可以比较。
//使用数组指针是高效的。
//slice切片
//一个拥有相同类型元素的可变长序列。通常写作[ ]T。它看上去像没有长度的数组类型。切片是一个很小的对象,对底层数组 进行了抽象。
//轻量级数据结构,可以用来访问数组部分或全部元素,而这个数组称为slice的底层数组。
//slice三个特性:长度 容量 指针。指针指向数组的第一个可访问的元素。
//因为slice包含了指向数组的指针,所以将一个slice传递给函数的时候,可以在函数内部修改底层数组的元素。
//创建和初始化:make([]type,len,cap)。如果只有len,则len=cap。
//另一种是切片字面量声明:slice := [ ]string{"1","2","3"}
//切片也可以像数组一样使用索引声明slice := []int{99 :-1}
slice :=[]int{10,20,30,40} //len=cap=4
append(slice, 50)
//需要复制所有的值到新数组 len=4 cap=4*2
// append扩展容量的算法:cap<1000成倍增加,大于1000,1.25倍增加。
//创建切片时可以使用三个索引:slice := source[i:j:k]
source :=[]string{"a","b","c","d","e"}
slice := source[2:3:4]
package main
import "fmt"
func main() {
slice1 := []int{1, 2, 3, 4, 5}
slice2 := slice1[2:3]
slice2 = append(slice2, 6)
fmt.Printf("%v", slice1)
fmt.Printf("%v", slice2)
}
内容 | PHP | Golang | 具体实现PHP | 具体实现Golang | 特殊说明 |
---|---|---|---|---|---|
数据类型 | 布尔型,字符串,整型,浮点型,数组,对象,资源,空值 。 | 布尔型,整型,浮点型,复数型,字符型,字符串型,错误类型,指针,数组,切片,字典,通道,结构体,接口。 | $name = "白色彩虹" | Golang数据类型变量声明 | Golang中声明的变量必须使用,否则编译报错 |
单元格 | 单元格 |
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
类似于中间件,类似于设计模式中的装饰器
迭代类似于遍历
迭代器作用:在进行遍历时,每每循环一次都会返回下一个数据,直到读完所有的数据为止。迭代器的作用就是记住访问到了第几条数据,以便于拿到下一条数据。
迭代器的本质:使多个不同类型的对象可以一起遍历,比如一个列表中既又元祖又有列表又有字符串
迭代器必须有__iter__和__next__方法。
迭代器优点:节省内存。不依赖索引取值。惰性计算。
迭代器的缺点:不能直观的查看里面的数据。取值时不走回头路,只能一直向下取值。
本质:是一个迭代器,即生成器是一种特殊的迭代器。
特点:惰性运算,开发者自定义。
生成器函数:在生成器函数中,用yield语句而不是return语句,yield语句一次返回一个结果。在其中两个结果的中间,函数是挂起的状态,以便于下次从离开的地方开始执行而不是从头开始。
生成器表达式:类似于列表推导式,但生成器是按需取结果,而不是一次性来构建一个结果列表。
缺点:只能遍历一次,最后一次会报异常
cat nohup.out | grep -n "长度" -C 10 #只看 长度 前后10行
cat -n text.txt 由 1 开始对所有输出的行数编号
cat -b text.txt 和 -n 相似,只不过对于空白行不编号
查询文件中关键内容,按条件查询
cat text.txt |grep '异常'-A 100 前100行
cat text.txt |grep '异常'-B 100 之前100行
cat text.txt |grep '异常'-C 100 前后100行
cat text.txt | grep -v '异常' 排除异常所在的行
cat text.txt | grep -n '异常' 显示异常所在行并显示行数
cat text.txt | grep -n '异常' -C 100 显示异常所在行前后100行并显示行数,其他想显示行数以此类推
cat -n text.txt1 > text.txt2 #把 text.txt1 的文档内容加上行号后输入 text.txt2 这个文档里
cat -b text.txt1 text.txt2 >> text.txt3 #把 text.txt1 和 text.txt2 的文档内容加上行号(空白行不加)之后将内容附加到 text.txt3 文档里
#首先拉取jenkins镜像
docker pull jenkins/jenkins
#以root身份运行镜像
docker run -d -uroot -p 9077:8080 -p 50000:50000 --name jenkins -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime jenkins/jenkins
#通过ip加端口号进入jenkins 127.0.0.1:9077
#切换进入docker镜像
docker exec -it d1949b69ce49 bash
#编辑密码所在文件 获取密码
cat /var/jenkins_home/secrets/initialAdminPassword
安装推荐的插件
安装必备的插件,在jenkins插件中搜索
Generic Webhook Trigger
GitLab
#服务器安装expect
apt install expect
在jenkins搜索栏输入Manage搜索,选择系统管理
需要在Jenkins系统设置中取消勾选“Enable authentication for '/project' end-point”
新建一个jenkins任务,选择第一个
进入任务配置,构建触发器选择入下图所示
构建步骤输入以下脚本
#!/usr/bin/expect
#web服务器
spawn ssh root@127.0.0.1
expect {
"(yes/no*" {send "yes\r";exp_continue}
"password:" {send "pwd\r";exp_continue}
eof
}
expect "*]$"
send "su root\n"
expect "*password"
send "pwd\n"
expect "*]$"
send "cd /var/www/project\n"
expect "*]#"
send "git pull\n"
expect "*]#"
send "exit\n"
expect "*]#"
多台服务器配置多个脚本链接,保存
登录你的gitlab
添加插件
# 取值必须values
query_data = Model.objects.filter().values('id')
# 返回必须转一次list
return JsonResponse(list(data),safe=False)
感觉django没有吹得那么好,orm转个json这么费劲
import copy
from prettyprinter import cpprint as p
campaign_bigo_no = campaign_bigo = {
'cpm': 0,
}
# 默认是传引用
campaign_bigo['cpm'] = 1
p(campaign_bigo_no)
p(campaign_bigo)
# 传值
campaign_bigo_no = copy.deepcopy(campaign_bigo)
campaign_bigo['cpm'] = 1
p(campaign_bigo_no)
p(campaign_bigo)
print('%.4f' % 1.22761)
1.2276
print('%.3f' % 1.2276)
1.228
print('%.2f' % 1.2276)
1.23