未命名
docker 镜像打包
pip install simplejson docker harbor-py
https://github.com/vmware/harbor/tree/master/contrib/sdk/harbor-py
未命名
jenkins 使用groovy创建用户
创建文件$JENKINS_HOME/init.groovy.d/basic-security.groovy
在fedoar系统中jenkisn的家目录是/var/lib/jenkins把下面代码粘贴到basic-security.groovy创建的用户admin_name 密码admin_password
#!groovy
import jenkins.model.
import hudson.security.
def instance = Jenkins.getInstance()
def hudsonRealm = new HudsonPrivateSecurityRealm(false)
hudsonRealm.createAccount(“admin_name”,”admin_password”)
instance.setSecurityRealm(hudsonRealm)
instance.save()
重启 jenkins服务
systemctl restart jenkins删除basic-security.groovy 文件
rm /var/lib/jenkins/init.groovy.d/basic-security.groovylocalhost:8080 登录主机
未命名
groovy里的任何变量必须是number,string或可序列化的类型
否则需要写成函数,使用@NonCPS 或 最后至为null每次sh的命令for循环,只执行一步
可以使用如下方式解决:
@NonCPS
def createScript(){
def cmd=””
for (i in [ ‘a’, ‘b’, ‘c’ ]) {cmd = cmd+ "echo $i"
}
writeFile file: ‘steps.groovy’, text: cmd
}
Then call the function like
createScript()
load ‘steps.groovy’
未命名
使用jenkins 使用pipeline
- jenkisn –》Add Credentials
Scope -> Global(Jenkins,nodes…)
Username
Password
ID
Description
未命名
使用jenkins构建 mongodb
安装插件 Docker plugin 和 Git plugin
Jenkins -> 系统管理 -> 管理插件 -> 可选插件 在里面搜索Docker plugin 和 Git plugin安装之。配置Docker plugin
Jenkins -> 系统管理 –> 云-> 新增一个云 Docker
Name:docker-agent
Docker URL:unix:///var/run/docker.sock开放权限
sudo chmod 777 /var/run/docker.sock点击 Test Connection 测连接
配置镜像
在 Jenkins -> 系统管理 –> 云-> 新增一个云 Docker 中
下拉 选择Add Docker Template
Docker Image: library/centos7.1-v1
Credentials: 使用add添加 并选择
用户名:jenkins 密码:jenkins
Volumes –》 /var/run/docker.sock:/var/run/docker.sock配置
- 创建一个job
未命名
harbor 仓库安装
- 下载离线包
- 解压
- 编辑 harbor.cfg
默认用户名 密码
admin/Harbor12345
安装
./install.sh
配置 使用代理缓存镜像 (ps: 使用后无法push镜像,会报错”Upload failed, retrying: unsupported”)
配置镜像缓存,客户端先访问harbor,如果harbor没有 会去阿里云下载,并缓存到本地harbor
以后客户端下载,可直接使用本地harbor的
vi common/templates/registry/config.yml
proxy:
remoteurl: https://fcpj2tcn.mirror.aliyuncs.com重启服务
docker-compose down
docker-compose rm -f
docker-compose up -d
##客户端使用harbor
root ➜ workspace cat /etc/docker/daemon.json
{
“registry-mirrors”: [“http://monkey.rhel.cc“],
“insecure-registries”: [“monkey.rhel.cc”]
}
systemctl restart docker
重启后 使用docker info
看到如下内容,说明配置成功
Insecure Registries:
monkey.rhel.cc
127.0.0.0/8
Registry Mirrors:
http://monkey.rhel.cc
登录:
docker login -u admin -p Harbor12345 monkey.rhel.cc
下载:
docker pull
上传:
docker tag centos7.1:tomcat monkey.rhel.cc/library/centos7.1:tomcat
docker push monkey.rhel.cc/library/mongodb
本地docker日志查看:
journalctl -f _SYSTEMD_UNIT=docker.service
未命名
学习开始
- SQLAlchemy
CRUD Review
Operations with SQLAlchemy
In this lesson, we performed all of our CRUD operations with SQLAlchemy on an SQLite database. Before we perform any operations, we must first import the necessary libraries, connect to our restaurantMenu.db, and create a session to interface with the database:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from database_setup import Base, Restaurant, MenuItem
engine = create_engine(‘sqlite:///restaurantMenu.db’)
Base.metadata.bind=engine
DBSession = sessionmaker(bind = engine)
session = DBSession()
CREATE
We created a new Restaurant and called it Pizza Palace:
myFirstRestaurant = Restaurant(name = “Pizza Palace”)
session.add(myFirstRestaurant)
sesssion.commit()
We created a cheese pizza menu item and added it to the Pizza Palace Menu:
cheesepizza = menuItem(name=”Cheese Pizza”, description = “Made with all natural ingredients and fresh mozzarella”, course=”Entree”, price=”$8.99”, restaurant=myFirstRestaurant)
session.add(cheesepizza)
session.commit()
READ We read out information in our database using the query method in SQLAlchemy:
firstResult = session.query(Restaurant).first()
firstResult.name
items = session.query(MenuItem).all()
for item in items:
print item.name
UPDATE
In order to update and existing entry in our database, we must execute the following commands:
Find Entry
Reset value(s)
Add to session
Execute session.commit()
We found the veggie burger that belonged to the Urban Burger restaurant by executing the following query:
veggieBurgers = session.query(MenuItem).filter_by(name= ‘Veggie Burger’)
for veggieBurger in veggieBurgers:
print veggieBurger.id
print veggieBurger.price
print veggieBurger.restaurant.name
print “\n”
Then we updated the price of the veggie burger to $2.99:
UrbanVeggieBurger = session.query(MenuItem).filter_by(id=8).one()
UrbanVeggieBurger.price = ‘$2.99’
session.add(UrbanVeggieBurger)
session.commit()
DELETE
To delete an item from our database we must follow the following steps:
Find the entry
Session.delete(Entry)
Session.commit()
We deleted spinach Ice Cream from our Menu Items database with the following operations:
spinach = session.query(MenuItem).filter_by(name = ‘Spinach Ice Cream’).one()
session.delete(spinach)
session.commit()
未命名
蓝鲸配置平台go语言版:
https://github.com/shwinpiocess/cc
蓝鲸有97个文件 变更,学习这97个文件就ok
- 根据环境变量 读配置
development
testing
production
system_path => system
application_folder => application
view_folder => ‘’ 默认view路径在application目录下面
define(‘BASEPATH’, str_replace(‘\‘, ‘/‘, $system_path));
把\ 替换成 /
在index 文件中定义了
BASEPATH –>对应的system目录
FCPATH
SYSDIR
APPPATH
VIEWPATH
的路径
使用了CodeIgniter 框架
使用查询字符串的url方式,把FALSE 改为true
$config[‘enable_query_strings’] = FALSE;
样子如下:
index.php?c=controller&m=method
url 分段传递参数:
example.com/index.php/products/shoes/sandals/123
会在contrl 目录下找products文件 shoes 类中 接收 sandals 和 123 两个参数
- 默认控制器
在 application/config/routes.php 中定义了默认控制器 welcome
$route[‘default_controller’] = ‘welcome’; 访问网站首页时跳转到这里
辅助函数
辅助函数位于 system/helpers 或者 application/helpers 目录 目录下。CodeIgniter 类库
所有的系统类库都位于 system/libraries/ 目录下使用 CodeIgniter 驱动器
以下是系统核心文件的清单,它们在每次 CodeIgniter 启动时被调用:
Benchmark
Config
Controller
Exceptions
Hooks
Input
Language
Loader
Log
Output
Router
Security
URI
Utf8
- 扩展类
扩展核心类
如果你只是想往现有类中添加一些功能,例如增加一两个方法,这时替换整个类感觉就有点杀鸡用牛刀了。在这种情况下,最好是使用扩展类的方法。扩展一个类和替换一个类的做法几乎是一样的,除了要注意以下几点:
你定义的类必须继承自父类。
你的类名和文件名必须以 MY_ 开头。(这是可配置的,见下文)
举个例子,要扩展原始的 Input 类,你需要新建一个文件 application/core/MY_Input.php,然后像下面这样定义你的类:
class MY_Input extends CI_Input {
}
- 应用程序流程图
下图说明了整个系统的数据流程:
CodeIgniter 程序流程
index.php 文件作为前端控制器,初始化运行 CodeIgniter 所需的基本资源;
Router 检查 HTTP 请求,以确定如何处理该请求;
如果存在缓存文件,将直接输出到浏览器,不用走下面正常的系统流程;
在加载应用程序控制器之前,对 HTTP 请求以及任何用户提交的数据进行安全检查;
控制器加载模型、核心类库、辅助函数以及其他所有处理请求所需的资源;
最后一步,渲染视图并发送至浏览器,如果开启了缓存,视图被会先缓存起来用于 后续的请求。
- 挂钩点
以下是所有可用挂钩点的一份列表:
pre_system 在系统执行的早期调用,这个时候只有 基准测试类 和 钩子类 被加载了, 还没有执行到路由或其他的流程。
pre_controller 在你的控制器调用之前执行,所有的基础类都已加载,路由和安全检查也已经完成。
post_controller_constructor 在你的控制器实例化之后立即执行,控制器的任何方法都还尚未调用。
post_controller 在你的控制器完全运行结束时执行。
display_override 覆盖 _display() 方法,该方法用于在系统执行结束时向浏览器发送最终的页面结果。 这可以让你有自己的显示页面的方法。注意你可能需要使用 $this->CI =& get_instance() 方法来获取 CI 超级对象,以及使用 $this->CI->output->get_output() 方法来 获取最终的显示数据。
cache_override 使用你自己的方法来替代 输出类 中的 _display_cache() 方法,这让你有自己的缓存显示机制。
post_system 在最终的页面发送到浏览器之后、在系统的最后期被调用。
- URI 路由
一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系。 URL 中的每一段通常遵循下面的规则:
example.com/class/function/id/
- 首页第一个索引在
application/controllers/Welcome.php
未命名
groovy使用
安装
dnf install groovy
概念
元编程 意思应该是指「编写能改变语言语法特性或者运行时特性的程序」。
##groovy 调用shell命令
for (i in 0..2) { print ‘ho ‘}
println ‘Merry Groovy!’
0.upto(10) { print “$it “}
print(“\nI love you\n”)
println “svn help”.execute().getClass().name
安全导航操作符
str?.reverse() 如果str非空才执行
###
class Car {
def miles = 0
final year
Car(theYear) { year = theYear}
}
Car car = new Car(2008)
println “Year: $car.year”
println “Miles: $car.miles”
println “Setting miles”
car.miles = 25
println “Miles: $car.miles”
符号重载
lst = [‘hello’]
lst << ‘there’
println lst
静态导入
import static Math.random;
import static Math.random as rand;
groovy陷阱
str1 = ‘hello’
str1 = ‘Hello’
${ str1 == str2 }
${ str1.is(str2) }
##闭包
pickEven(10) {println it}
pickEven(10) { evenNumber -> printlen evenNumber }
正则表达式
/\d\w/ 与 “\d\w*” 等价
字符串前加~表示正则,匹配规则
Groovy 提供了一对操作符: =~ 和 ==~
pattern = ~”(G|g)roovy”
text = ‘Groovy is Hip’
if (text =~ pattern)
println “match”
else
println “no match”
if (text ==~ pattern)
println “match”
else
println “no match”
执行后结果:
match
no match
=~ 执行RegEx部分匹配,而==~执行RegEx精确匹配。因此,在前面的代码示例中,第一个模式匹配报告的是match,第二个是no match。
列表迭代
lst = [1,2,3,4,5,6,7]
lst.each { println it }
lst.collect { it 2 } 把迭代的值 继续传给lst,相当于给每个值 2
##map的使用
langs = [‘c++’:’stroustrup’,’java’:’Gosling’,’Lisp’:’McCarthy’]
langs[‘c++’]
langs.’c++’
map 的引用
- map的迭代
langs.each { entry ->
println “ $entry.key $entry.value”
}
langs.each { k,v ->
println “ $k $v”
}
远程调用
http://
返回页面
http://
return result/System.out
远程访问
$curl –data-urlencode “script=$(<./somescript.groovy)” http://
$curl –user ‘username:password’
pickEven(10) { evenNumber -> printlen evenNumber }