0%

在ng-alain脚手架项目中,默认存token到localstorage(也可以配置为其他存储类型),运行期间不再改动配置。

不应该把 Remember me 当作实际授权有效期的条件,Token 该什么时候过期就应该什么时候过期, Remember me 一般是用于支持自动无感刷新 Token。

redis value中存token,expire time,remember,当remember为false,应校验前端传来的token并核对expire time,当remember为true,应在token过期时自动刷新,并将新的token保存到前端

比较复杂的概念:

面向服务架构(Service Oriented Ambiguity, SOA),将紧耦合的系统,划分为面向业务的,粗粒度,松耦合,无状态的服务,服务之间彼此通信,用一组互相依赖的服务构成了SOA架构下的系统。

WebService是SOA的最佳实现之一

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

简单对象访问协议(Simple Object Access Protocol, SOAP), 基于XML在分散或分布式的环境中交换信息的简单的协议。允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。

  SOAP的设计是为了在一个松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制。

网络服务描述语言(Web Services Description Language, WSDL), 它是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问, WSDL文件是关于如何调用Web Service的文档。

解读WSDL文档

某wsdl_prod.xml

1
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions  xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"  xmlns:wsa10="http://www.w3.org/2005/08/addressing"  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"  xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"  xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"  xmlns:i0="http://sso.xxxxxxxxxxxxx.com/DataService/v1"  xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"  xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"  xmlns:tns="http://tempuri.org/"  xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tempuri.org/" name="SsoDataService">-<wsp:Policy wsu:Id="CustomBinding_ISsoDataService_policy">-<wsp:ExactlyOne>-<wsp:All>-<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">-<wsp:Policy>-<sp:TransportToken>-<wsp:Policy><sp:HttpsToken RequireClientCertificate="false"/></wsp:Policy></sp:TransportToken>-<sp:AlgorithmSuite>-<wsp:Policy><sp:Basic256/></wsp:Policy></sp:AlgorithmSuite>-<sp:Layout>-<wsp:Policy><sp:Lax/></wsp:Policy></sp:Layout></wsp:Policy></sp:TransportBinding>-<sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">-<wsp:Policy>-<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">-<wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy></sp:SignedSupportingTokens>-<sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">-<wsp:Policy><sp:MustSupportRefKeyIdentifier/><sp:MustSupportRefIssuerSerial/></wsp:Policy></sp:Wss10>-<sp:Trust10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">-<wsp:Policy><sp:MustSupportIssuedTokens/><sp:RequireClientEntropy/><sp:RequireServerEntropy/></wsp:Policy></sp:Trust10></wsp:All></wsp:ExactlyOne></wsp:Policy><wsdl:import location="wsdl0.xml" namespace="http://sso.xxxxxxxxxxxxx.com/DataService/v1"/><wsdl:types/>-<wsdl:binding name="CustomBinding_ISsoDataService" type="i0:ISsoDataService"><wsp:PolicyReference URI="#CustomBinding_ISsoDataService_policy"/><soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>-<wsdl:operation name="ValidateAccountLogin"><soap:operation style="document" soapAction="http://sso.xxxxxxxxxxxxx.com/DataService/v1/ISsoDataService/ValidateAccountLogin"/>-<wsdl:input><soap:body use="literal"/></wsdl:input>-<wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>-<wsdl:service name="SsoDataService">-<wsdl:port name="CustomBinding_ISsoDataService" binding="tns:CustomBinding_ISsoDataService"><soap:address location="https://sso.************.com/DataService.svc"/></wsdl:port></wsdl:service></wsdl:definitions>

该文档标注了大量的xml协议,包含用于SOAP header中做安全认证的协议以及格式
(待日后补充解读)

其中import wsdl0.xml 该文件主要是接口的协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions targetNamespace="http://sso.xxxxxxxxxxxxx.com/DataService/v1" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://sso.xxxxxxxxxxxxx.com/DataService/v1" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsdl:types>
<xsd:schema targetNamespace="http://sso.xxxxxxxxxxxxx.com/DataService/v1/Imports">
<xsd:import schemaLocation="xsd0.xml" namespace="http://sso.xxxxxxxxxxxxx.com/DataService/v1"/>
<xsd:import schemaLocation="xsd1.xml" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="xsd2.xml" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ISsoDataService_ValidateAccountLogin_InputMessage">
<wsdl:part name="parameters" element="tns:ValidateAccountLogin"/>
</wsdl:message>
<wsdl:message name="ISsoDataService_ValidateAccountLogin_OutputMessage">
<wsdl:part name="parameters" element="tns:ValidateAccountLoginResponse"/>
</wsdl:message>
<wsdl:portType name="ISsoDataService">
<wsdl:operation name="ValidateAccountLogin">
<wsdl:input wsaw:Action="http://sso.xxxxxxxxxxxxx.com/DataService/v1/ISsoDataService/ValidateAccountLogin" message="tns:ISsoDataService_ValidateAccountLogin_InputMessage"/>
<wsdl:output wsaw:Action="http://sso.xxxxxxxxxxxxx.com/DataService/v1/ISsoDataService/ValidateAccountLoginResponse" message="tns:ISsoDataService_ValidateAccountLogin_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>

其中xsd1,2,3是参数定义 略

首先须知xml语法(存目)

xmlns:el=”url” el元素遵循url定义的规范

WSDL 文档主要使用以下几个元素来描述某个 web service :

portType “最重要的元素” 描述一个 web service、可被执行的操作,以及相关的消息。

message 元素定义一个操作的数据元素。

每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。

WSDL types

types 元素定义 web service 使用的数据类型。

为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。

WSDL Bindings

binding 元素为每个端口定义消息格式和协议细节。

安全认证(存目)

SOAP用例

SOAP结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
...
...
</soap:Header>

<soap:Body>
...
...
<soap:Fault>
...
...
</soap:Fault>
</soap:Body>

</soap:Envelope>

Postman
参考 Web Service概念梳理

随机数

1
2
=rand() //生成随机数区间[0,1]
=randbetween(100,999)//生成范围内随机整数

随机字符

1
=CHAR(INT(RAND()*25+65))

字符串拼接

1
=concat("id","0001")

随机日期

1
=TEXT(RAND()*("2019-11-11"-"2018-11-11")+"2018-11-11","e/m/d")

批量取消科学计数法

格式化单元格 Number—Custom—0

进制转换

16进制—>十进制: HEX2DEC

VLOOKUP

y=vlookup(x, source_table, column_index, boolean)
在source_table中找到x所在行,返回第column_index列的对应结果,boolean:TRUE 模糊匹配 FALSE 严格匹配

条件格式

如 Home—>Conditional Formatting—>Highlight Cell Rules—>Duplicate Values

高亮显示所选区域中存在重复值的cell

批量输入

  • Ctrl + D
  • Home —> Editing —> Fill

添加库

add library

1
2
3
ng new my-project --style less
cd my-project
ng add ng-alain

add library 和 npm install

ng add \ uses your package manager and installs the dependency. That dependency can have an installation script which can be used to do more job except the dependency installation. It can update your configurations, download another dependencies based on that one or create scaffold templates (with initial markup and logic).

安装ng-alain库修改了angular.json文件,加入了上文提到的installation script。

项目中可以调用ng-alain库命令创建页面模板

1
2
ng g ng-alain:module user
ng g ng-alain:list list -m=user

根据ng-alain规则生成user模块,并为其添加一个list功能(自动生成组件,配置路由等)

Caution! “download another dependencies” 并不会加入到 package.json(存疑))

创建库

启动一个Jenkins docker

1
2
3
4
5
6
7
8
9
10
11
docker pull jenkins
sudo mkdir /var/jenkins_home
docker run
-d
-u root
--rm
--name myjenkins
-p 8080:8080 -p 50000:50000
-v /var/jenkins_home:/var/jenkins_home
--restart always
jenkins

说明

  • docker run启动一个container
  • -d 后台运行
  • -u root 以root权限执行 尤其对于jenkins 权限不足会影响持久化卷的访问
  • —rm 容器退出后自动移除 实际上写这个会报与—restart always冲突
  • —name myjenkins容器Name命名为myjenkins
  • -p 8080:8080 -p 50000:50000 容器端口映射到宿主端口,前者是主机端口,后者是容器端口
  • -v volume设置(详见“卷和持久化数据”)
  • —restart always重启策略
  • jenkins 镜像

参考
docker run命令

Docker提供了3种预置网络配置:桥接、主机、无网络
端口映射适应于桥接网络,是启动容器的默认网络设置,如果是主机网络,则可以直接使用主机上的剩余端口

jenkins升级
在jenkins ui中upgrade 重启后无法访问 查看docker container log发现需要升级JDK版本

由于我们启用jenkins时映射了宿主volume,不用担心丢失工作数据, 可以更新docker image 删除并重建容器

如何进入无限重启的容器

更新docker jenkins环境(jdk, ant)

连接到容器

docker attach [containerID]

docker exec -it [containerID] bash或sh

前者是直接进入容器启动命令的终端,不开启新的进程,退出终端意味着容器命令被终结
后者是打开一个新的终端(bash或sh)

在容器终端键入 exit 退出

使用Container ID 停止和重启等

1
2
3
4
5
docker ps -a
docker ps | grep jenkins
docker stop/restart id

docker rm id

Issue:如何得知特定镜像需要的持久化卷配置,即我要创建哪些路径的映射呢?

tomcat docker的卷设置

1
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat 

容器重连

有的封装服务的容器是可以docker run -d 保持后台运行的,很多容器如ubuntu等,断开终端连接往往会结束运行,在docker ps -a中看到状态是Exited。

启动容器并附加到当前进程

1
docker start -a -i `docker ps -q -l`

说明:
docker start启动容器(需要名称或ID)
-a附加到容器
-i交互模式
docker ps列表容器
-q列表仅容器ID
-l列表仅最后创建容器

检索自腾讯云问答

另,对于这种容器,可以保持一个“前台”的进程运行,如

1
docker run ubuntu /bin/bash -c "while true; do echo docker connected; sleep 5; done" // 每5s 输出一次

docker for mysql 5.7

1
2
3
4
5
docker pull mysql:5.7
docker run --name mysql_57_instance -v /home/qqs/Workspace/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it mysql_57_instance bash
mysql -u root -p
...

Containers for the linked service will be reachable at a hostname identical to the alias, or the service name if no alias was specified.

使用docker for mysql部署数据库,docker容器运行起后,不需要进入容器修改配置(事实上使用docker -it进入容器终端后,/etc/mysql/下面没有配置文件),在配置外部数据连接时,使用容器名代替localhost或127.0.0.1
参考issue: SQLSTATE[HY000] [2002] Connection refused

容器

容器时一种松散隔离(loosely, isolated)的环境,允许我们构建或运行软件包(software packages)。这些软件包包括源码和依赖,称为容器镜像。容器镜像是我们用于分发应用程序的单位。

一般来说,下文只记录操作记录而不是详细步骤

  • ubuntu install docker

  • usermod aG docker

  • 自动启动systemctl enable docker

  • 镜像列表docker image ls

  • 从Docker Hub搜索并下载镜像

    1
    2
    3
    docker search httpd

    docker pull httpd:latest

    这里的Docker Hub相当于npmjs.org仓库,镜像是容器的模板,镜像之于容器,如同class之于object。这里的httpd称为应用容器镜像,是包含指定应用的环境。

    latest 是版本tag,下载非latest的指定版本镜像只能查Docker Hub

  • 删除镜像 docker image rm hello-world

  • 启动容器 docker container run [OPTIONS] IMAGE [COMMAND]

    1
    2
    3
    docker container run -it centos:latest /bin/bash

    docker container ls
  • 查看日志(输出到当前终端)docker logs -f contianderId

ubuntu安装后无法ssh远程登录

检查是否安装ssh-server

1
dpkg -l | grep ssh

默认只有ssh-client,如下

20170210203338059
安装命令:

1
sudo apt-get install openssh-server

通过进程确认服务已启动
1
ps -e | grep ssh

启动与停止
1
2
sudo /etc/init.d/ssh stop
sudo /etc/init.d/ssh start

ssh key

1
2
3
4
5
6
// 查看ssh key目录
ls -al ~/.ssh
// 生成
ssh-keygen -t rsa -C ""
// 添加密钥到ssh-agent 注 见下文异常
ssh-add ~/.ssh/id_rsa.pub

异常:Could not open a connection to your authentication agent

1
ssh-agent bash

异常:Permissions 0777 for ‘~/.ssh/id_rsa’ are too open.

It is recommended that your private key files are NOT accessible by others.

This private key will be ignored.

keys need to be only readable to you

1
2
3
// 改为只读
chmod 400 ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa.pub

返回“identity added blablabla…”

使用ssh key连接GitHub

  • 复制public key
  • 测试
    1
    ssh -T git@github.com/qqstone/xxx.git

    异常:Could not resolve hostname github.com:qqstone/xxx.git: Name or service not known;

尝试ping github.com 发现超时,说明dns给的地址连接超时,然而由于网页上是http协议,是可以有反向代理以及负载均衡配置的(具体原因存疑),所以网页打开Github反而很流畅。

另一种情况,主机无法连接正确的dns,解析超时,可以在连接正常的环境中(如无线网络或4g网络)用nslookup查看域名解析,找到实际的公网ip,然后在超时的环境中尝试用ip连接

懒得去服务器上授权密钥,可以将已授权的 id_rsa + xxx.pub(公钥)拷贝覆盖到其他主机

异常:The authenticity of host 192.168.xxx.xxx can’t be established.ECDSA key fingerprint is blablabla

1
ssh  -o StrictHostKeyChecking=no  192.168.xxx.xxx

异常:ssh key在终端有效,在脚本中无效

在终端执行git 命令,ssh key认证可自动通过,将命令写入shell执行,git命令会要求当前用户访问Repository的密码。

原因可能是ssh key隶属当前用户,而未配置到root用户,root用户默认是禁用的,尝试添加/home/root/.ssh/*无效,未尝试添加/root/.ssh/*。

1
git config core.sshCommand "ssh -i /home/csd/.ssh/id_rsa -o StrictHostKeyChecking=no git@hostname"

异常:kex_exchange_identification: read: Software caused connection abort. banner exchange: Connection to 20.205.243.166 port 22: Software caused connection abort
fatal: Could not read from remote repository.

use https than ssh

linux系统之间的ssh授权访问

一、概述

1、就是为了让两个linux机器之间使用ssh不需要用户名和密码。采用了数字签名RSA或者DSA来完成这个操作

2、模型分析

假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机;

要达到的目的:
A机器ssh登录B机器无需输入密码;
加密方式选 rsa|dsa均可以,默认dsa

二、具体操作流程

单向登陆的操作过程(能满足上边的目的):
1、登录A机器
2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;(直接运行 #ssh 192.168.20.60 )

双向登陆的操作过程:

1、ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.具体方法如下:
2、两个节点都执行操作:#ssh-keygen -t rsa
然后全部回车,采用默认值.

3、这样生成了一对密钥,存放在用户目录的~/.ssh下。
将公钥考到对方机器的用户目录下,并将其复制到~/.ssh/authorized_keys中(操作命令:#cat id_dsa.pub >> ~/.ssh/authorized_keys)。

退出

1
exit

前提

1
select version()

返回8.0.16

root 初始密码

mysql安装时为root用户创建初始密码,可以在日志中找到

/var/log/mysqld.log
mysqld.log

登录之后会勒令重设密码

You must reset your password using ALTER USRE statement before executing this statement.

1
alter user 'root'@'localhost' identified by 'A_Za_z0_9'

修改密码级别

1
2
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=3;

现在可以设密码123了

新建管理员

1
2
3
mysql> create user 'admin'@'%' identified by 'admin';
mysql> grant all privileges on *.* to 'admin'@'%';
mysql> flush privileges;

native password

异常:

Client does not support authentication protocol requested by server; consider upgrading MySQL client

由于MySQL8 默认用编码口令代替了之前版本的native password,在使用第三方(如应用后台服务)连接数据库时,不符合协议

1
2
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';
FLUSH PRIVILEGES;

配置远程连接

Ubuntu :

/etc/mysql/mysqld.cnf

1
bind-address = 0.0.0.0

可以注释掉(未验证)
CentOS

见/etc/my.conf指定了配置目录

曾修改主机ip时mysql启动失败(查看状态:service mysqld status),现象是在本地登录mysql -u xxx -p验证密码后报异常:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’

数据库时间

1
2
3
4
select now();// yyyy-MM-dd hh24:mi:ss
select sysdate();// yyyy-MM-dd hh24:mi:ss

select current_date;// yyyy-MM-dd 带()结果相同

使用自增int作为主键

mysql为什么建议使用自增主键

关于删除表数据后重置auto increment:

1
2
delete from table1;
alter table1 AUTO_INCREMENT=1;

1
trancate table1;

使用时间戳

1
ALTER TABLE mytable CHANGE COLUMN ptime ptime TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP

联合唯一

1
alter table all_user add unique key(employeeid, isvalid)

CAUTION ! 上述语句是为了能在记录标记删除后,原纪录的唯一字段可以重新使用,但是如果isvalid是boolean(0-1)类型的,再次删除会造成违反联合唯一约束,解决方法是将isvalid以自增值标记,或以时间戳标记

数据导入

MySQL Workbench工具,支持csv,json格式的import wizard,其实可以直接用命令方式导入
Capture_mysql_workbench
工具提供了直观图形界面和字段映射。

然而csv的支持是个大坑。

Excel在读取csv的时候是通过读取文件头上的bom来识别编码的,如果文件头无bom信息,则默认按照unicode编码读取。

MySQL读取csv数据不能识别bom头,遇到utf8bom报“Can’t analyze file. Please try to change encoding type. If that doesn’t help, maybe the file is not: csv, or the file is empty.

应如下操作:

  • 在Excel中整理待导入数据的格式,特别提示MySQL datetime类型字段数据源应调整为yyyy-mm-dd hh:mm:ss格式
  • 第一行列头会作为导入field的标识,这一行不能为中文(此坑已踩)
  • 保存为CSV UTF-8(Comma delimited) 在Excel365的SAVE AS选项中是这样。
  • 用Notepad++打开保存的文件,可见此时默认为Encoding in UTF8-BOM,需Convert to UTF8 (此时再使用Excel打开,会发现出现中文乱码,原因如上所述,找不到BOM将以Unicode解码,应该打开Excel,使用数据导入向导,from text/csv)
  • 使用Workbench Import Wizard导入

关于utf8 和 utf8mb4

记住,永远不要在MySQL中使用“utf8”

大致是说,,别人utf-8都是四个字节编码,就MySQL所谓的utf-8是3字节,为与标准对应,又出了utf8mb4,请在MySQL中使用utf8mb4

数据库备份

1
mysqldump -u${username} -p${password} schemaName tableName1 tableName2 tableName3 > backup.sql

关于使用git实现快捷数据备份的实践

1
2
3
4
5
6
cd ~/Workspace
git clone git@projectX.git
mkdir ~/Workspace/projectX/db
mysqldump -u admin -padmin schemaName tableName > backup.sql
git commit
git push

///
思考:我要是不在本地跑源码(node server.js),是否可以省略拉本地仓库的步骤?是否可以直接将备份文件“push”到远程仓库?

编辑文件在上图的workspace范畴中,我想,问题答案应该是否定的。

常用查询

1
2
3
4
show databases;
create database csc;
use csc;
show tables;

联合更新

1
2
update asset a inner join department d on a.depart_id=d.depart_id set a.department=d.depart_name 
where a.department <> d.depart_name

key, primary key, unique key

分组取第一条

MySQl 8 之前的版本不支持partition by

1
2
3
4
select * from
(
select *,row_number() over(partition by Grade order by Score desc) as Sequence from Student
)T where T.Sequence<=1

workaround
1
2
3
4
5
6
7
8
9
10
SELECT 
t1.*
FROM
action_history t1
INNER JOIN (SELECT
MAX(timestramp) AS newest, process_id
FROM
action_history
GROUP BY process_id) t2 ON t2.process_id = t1.process_id
AND t2.newest = t1.timestramp

加/减后缀

1
2
3
4
5
6
UPDATE all_user 
SET
email = CONCAT(email, '_disabled')
WHERE
email NOT LIKE '%yopmail.com'
AND user_id < 108

去后缀,即取该字段的左起(总长度-后缀长度)个字符

1
2
3
4
5
6
UPDATE all_user 
SET
email = LEFT(email, LENGTH(email) - 9)
WHERE
email NOT LIKE '%yopmail.com'
AND user_id < 108

查询各表数据条数

1
2
USE information_schema;
SELECT table_name,table_rows FROM TABLES WHERE TABLE_SCHEMA = 'ams'

MySQL Utilities

数据库更新工具

1
$ mysqldbcompare --server1=admin:admin@10.196.98.83:3306 --server2=admin:admin@10.196.98.107:3306 ams:ams --run-all-tests --changes-for=server1 --difftype=sql >> d:\temp\diff.sql

该工具依赖表mysql.proc, mysql.event已在mysql8以上版本移除,如有需要宜寻5.7等版本数据库导出

安装NodeJS

Manage Jenkins菜单 —> Manage Plugins
添加Node.js 并重启Jenkins
进入 Manage Jenkins —> Global Tool Configuration
找到NodeJS installations 此处可以配置安装多个版本的NodeJS
如有需要填写Global npm packages to install项

1
@angular/cli@8.2.2 electron@6.0.2 electron-builder@21.2.0 node-gyp@6.1.0

添加和使用credentials 有用户名密码模式 ssh模式等

ssh模式粘贴private key即可

建立Job 选择Freestyle project

配置git并选择credentials

Build Environment中 勾选 “Provide Node & npm bin/ folder to PATH” 并选择已安装的版本

否则jenkins所在系统无法识别nodejs命令

最后 Build 步骤可以直接用 “Windows batch command” 或者 “execuate shell”调用

1
npm install && npm run build

注意 npm 命令是安装了node包管理工具之后的命令行指令,并非是nodejs命令,否则报 syntaxerror unexpected identifier