分类目录归档:未分类

安装iTop采坑记录

PHP安装缺少zip模块会提示iTop Uncaught Error: Class ‘DBBackup’ not found in ……

需要安装zip, libzip

tar -zxvf libzip-1.2.0.tar.gz

cd libzip-1.2.0

./configure 

make 

make install 

wget http://pecl.php.net/get/zip-1.14.0.tgz
tar zxvf zip-1.14.0.tgz
cd zip-1.14.0
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make

make install

安装完成后,可以安装zip了。如果找不到’zipconf.h’,先找找,其实可以找到的

find /usr/local -iname ‘zipconf.h’

但是为什么找不到呢?可以
ln -s /usr/local/lib/libzip/include/zipconf.h /usr/local/include 。这样在安装zip即可。

php.ini 中增加
extension=”zip.so”

将zlib.output_compression=Off改为zlib.output_compression=On;

php -m 可以查看已安装的模块。

CentOS7 安装 PHP最新版本

设置你的yum仓库

安装EPEL:

sudo yum install epel-release

安装remi:

sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
安装PHP
## 安装PHP 7.3
yum --enablerepo=remi-php73 install php
## 安装 PHP 7.2
yum --enablerepo=remi-php72 install php
## 安装 PHP 7.1
yum --enablerepo=remi-php71 install php 
安装模块
### For PHP 7.3
yum --enablerepo=remi-php73 install php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt
### For PHP 7.2
yum --enablerepo=remi-php72 install php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt
### For PHP 7.1
yum --enablerepo=remi-php71 install php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt

基于Docker的前后端分离项目CD/CI

按:宿主机为CentOS7.4,NodeJS环境前端项目,SpringBoot Maven后端项目,Git代码仓库,Jenkins打包部署,Nginx做负载均衡。

安装Docker

CentOS通过yum安装的Docker版本有点低,需要安装Docker-CE:

# 添加安装源
sudo yum-config-manager --add-repo 
 https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker-CE
sudo yum install docker-ce
# 启动Docker服务
sudo systemctl start docker
# 设置开机启动
sudo systemctl enable docker
# 修改启动代码支持远程访问(Docker中的Jenkins会调用docker命令远程访问宿主机的Docker)
sudo vi /usr/lib/systemd/system/docker.service
在ExecStart的末尾添加如下启动参数
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# 重新加载修改后的文件
sudo systemctl daemon-reload
# 重启Docker服务
sudo systemctl restart docker

安装包含Docker命令的Jenkins

Jenkins镜像本身不包含Docker命令,需要自行制作一个包含Docker命令的镜像并启动容器。

mkdir ~/jenkins_with_docker
cd ~/jenkins_with_docker
vi Dockerfile
# 开始Dockerfile
FROM jenkinsci/jenkins
USER root
RUN curl -O https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz \
    && tar zxvf docker-latest.tgz \
    && cp docker/docker /usr/local/bin/ \
    && rm -rf docker docker-latest.tgz
ARG DOCKER_GID=999
USER jenkins:${DOCKER_GID}
# 结束Dockerfile
# 构建镜像
sudo docker build -t myjenkins .
# 创建存放Jenkins文件的目录(删除重建容器时不会破坏原有数据)
sudo mkdir /data/jenkins
# 更改数据目录权限
chown -R 1000:1000 /data/jenkins
# 创建并运行容器
docker run -d --name jenkins --restart=always -p 8080:8080 -p 50000:50000 --privileged=true -v /data/jenkins:/var/jenkins_home myjenkins
# 浏览器访问宿主机的8080端口,安装插件,创建用户
# Unlock Jenkins时需要输入密码,进入jenkins容器交互界面,查询密码
sudo docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
# 安装插件时需要安装Docker plugin, docker-build-step, NodeJS plugin
# 其实docker的插件也可以不装,我们直接执行shell命令操作宿主机的docker
# 配置 Jenkins:在系统设置-全局工具配置中添加NodeJS和Maven。都选择在线安装,如果不同项目用到Node多个版本,可以安装多个。
# 如果使用Docker插件而不是shell操作Docker的话,需要在系统设置中配置docker builder,tcp://xxx.xxx.xxx.xxx:2375

前端项目配置

# 前端项目中需要先准备一个Dockerfile用于构建镜像
# /docker/Dockerfile
FROM nginx:stable-alpine
WORKDIR /usr/local/bin
COPY ./ /usr/share/nginx/html

Jenkins中新建一个自由风格的项目,把git源配置好,在“构建环境”中勾选“ Provide Node & npm bin/ folder to PATH ”,选择项目使用的NodeJS版本。在“构建”中执行Shell命令:

echo $PATH
node -v
npm -v
# 避免被屏蔽国外网站下载失败
npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
npm install
npm run build

Shell方式执行Docker命令

cd ${WORKSPACE}/dist/
cp ../docker/Dockerfile ./
docker -H 宿主机IP build -t front-end-demo .

# 停止指定镜像的容器
docker -H 宿主机IP container ls| awk '$2=="front-end-demo"{system("docker -H 宿主机IP stop " $1)}'
# 删除指定镜像的容器
docker -H 宿主机IP container ls -a| awk '$2=="front-end-demo"{system("docker -H 宿主机IP rm " $1)}'
# 停止指定镜像的容器
docker -H 宿主机IP container ls|grep front-end-demo-container|awk '{system("docker -H 宿主机IP stop " $1)}'
# 删除指定镜像的容器
docker -H 宿主机IP container ls -a|grep front-end-demo-container|awk '{system("docker -H 宿主机IP rm " $1)}'
# 根据需要可以启动多个
docker -H 宿主机IP run -d --name front-end-demo-container-1 -p 9901:80 front-end-demo
docker -H 宿主机IP run -d --name front-end-demo-container-2 -p 9902:80 front-end-demo

# 总是有一个<none>的多余镜像,删掉它
docker -H 宿主机IP image ls|awk '$2=="<none>"{system("docker -H 宿主机IP image rm "$3)}'

配置后端项目

后端项目Dockerfile文件,用于构建镜像:

FROM jdk8

VOLUME /tmp
# 下面这个文件名要根据实际打包的来调整
ADD demo-1-0.0.1-SNAPSHOT.jar /app.jar
RUN touch /app.jar
EXPOSE 80
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

由于没有找到尺寸小的jdk8的官方标准镜像,我们还是自己构建一个,新建一个目录,把下载到的jdk*.tar.gz拷贝到这个目录并新建Dockerfile如下:

FROM frolvlad/alpine-glibc
#FROM centos:7

MAINTAINER sunits
WORKDIR /usr
RUN mkdir  /usr/local/java

ADD jdk-8u211-linux-x64.tar.gz /usr/local/java/

ENV JAVA_HOME /usr/local/java/jdk1.8.0_211
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

构建镜像:

sudo docker build -t jdk8 .

这里按SpringBoot项目打jar包的情况来配置。
Jenkins中新建一个Maven项目,如果没有这个选项,就添加Maven插件Maven Integration plugin。Maven的goal设置为 clean package
pom.xml中的build部分增加jar包的输出路径:

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<outputDirectory>src/docker</outputDirectory>
				</configuration>
			</plugin>
		</plugins>
	</build>

Post Steps中添加Shell命令

cd ${WORKSPACE}/src/docker/
docker -H 宿主机IP build -t spring-boot-demo .

# 停止指定镜像的容器
docker -H 宿主机IP container ls| awk '$2=="spring-boot-demo"{system("docker -H 宿主机IP stop " $1)}'
# 删除指定镜像的容器
docker -H 宿主机IP container ls -a| awk '$2=="spring-boot-demo"{system("docker -H 宿主机IP rm " $1)}'
# 停止指定镜像的容器
docker -H 宿主机IP container ls|grep spring-boot-demo-container|awk '{system("docker -H 宿主机IP stop " $1)}'
# 删除指定镜像的容器
docker -H 宿主机IP container ls -a|grep spring-boot-demo-container|awk '{system("docker -H 宿主机IP rm " $1)}'

# 根据需要可以启动多个容器
docker -H 宿主机IP run -d --name spring-boot-demo-container-1 -p 9911:8080 spring-boot-demo

docker -H 宿主机IP run -d --name spring-boot-demo-container-2 -p 9912:8080 spring-boot-demo

# 总是有一个<none>的多余镜像,删掉它
docker -H 宿主机IP image ls|awk '$2=="<none>"{system("docker -H 宿主机IP image rm "$3)}'

Nginx做负载均衡

先做对应的域名解析,后端:be.demo.com, 前端:fe.demo.com,指向nginx服务器,nginx这里不用容器:

yum install nginx
systemctl start nginx
systemctl enable nginx
# 修改/etc/nginx/nginx.conf,在http节内最后添加
include /etc/nginx/vhosts/*.conf;
# 然后就可以每个站点一个conf文件
# 前端文件 /etc/nginx/vhosts/fe.conf
# 开始 fe.conf
upstream fe {
    server 127.0.0.1:9901;  // 启动几个容器就可以配置几个
    server 127.0.0.1:9902;
}
server {
    listen       80;
    server_name fe.demo.com;
    location / {
        proxy_pass http://fe;
    }
}
# 结束 fe.conf

# 后端文件 /etc/nginx/vhosts/be.conf
# 开始 be.conf
upstream be {
    server 127.0.0.1:9911;  // 启动几个容器就可以配置几个
    server 127.0.0.1:9912;
}
server {
    listen       80;
    server_name be.demo.com;
    location / {
        proxy_pass http://be;
    }
}
# 结束 be.conf

# 重新加载配置文件或者重启
systemctl reload/restart nginx

其他常用Docker容器创建

#启动一个Redis容器
sudo docker run --name myredis -d --restart=always -p 6379:6379 --privileged=true -v /data/redis/data:/data redis:alpine
#启动一个MariaDB容器
docker run -d --name mariadb --privileged=true --restart=always -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mariadb
#启动一个禅道容器
sudo docker run -d --restart=always --name zentao -p 8081:80 -v /data/zentao/www:/app/zentaopms -v /data/zentao/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d zentao:latest
#启动一个gitlab容器
GITLAB_HOME=/data/gitlab
docker run \
    --hostname gitlab \
	--privileged=true \
    --publish 8443:443 --publish 80:80 --publish 2222:22 \
    --name gitlab \
    --restart always \
    --volume $GITLAB_HOME/config:/etc/gitlab \
    --volume $GITLAB_HOME/logs:/var/log/gitlab \
    --volume $GITLAB_HOME/data:/var/opt/gitlab \
    gitlab/gitlab-ce

安装RabbitMQ

docker pull rabbitmq:management-alpine

sudo docker run -d –restart=always –hostname my-rabbit -v /data/rabbitmq/data:/var/lib/rabbitmq –name rabbit -p 15672:15672 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 25672:25672 -p 61614:61614 -p 61613:61613 rabbitmq:management-alpine

纪念小白

去年初秋全家去京西山里游玩,吃住在一个农家院,其间女儿看到一只白色小波斯猫,特别喜爱,央求我把它带回家养,店主也很大方,说想要的话就送给你们,于是我们把它带了回来。

由于之前没有养过猫,猫砂猫粮都要置备,小家伙慢慢习惯并喜欢上了新环境。后来慢慢成为了我们的家人,儿子还以小白为主题写了英语作文。

刚来的时候我们住10楼,基本没有带他下过楼,今年3约月我们搬家到一楼,有个小院子,这样我们就把小白放开了,基本每天还要回家吃东西喝水,爱躺在门口的沙发上晒太阳,如果有人坐了那个沙发,他也会坚持要躺到那个位置。

也许是在外面跑接触了别的携带病毒的野猫,前几天感觉叫声不太对劲,没太在意,前天突然呕吐出一些黄绿色的液体,还以为他吃坏肚子了,就想着等等看,到了昨天,感觉小白已经无精打采,上吐下泻,非常虚弱,一早就带他去了宠物医院,住进了动物ICU,保暖,输液。到了晚上的时候,医生说有点精神了,但基本上不会治好了,于是我们就把他带回家与我们度过最后的时光,到家后,他还认得我们,在客厅慢走了几步,就躺下了,我们把他放回窝里,旁边放了吃喝的东西,祈祷他能度过这个难关。

早上女儿醒来第一时间就去看猫咪,发现他已经一动不动了,安慰过她之后,带上小白,把他埋在了一个小树林,希望他能在天堂生活的快乐,没有病痛。

咪咪,我们会想你的!

刚到家里的小白,感觉一切都新鲜
脏脏的小白,还没洗过澡
喜欢跟家人亲近的小白,工作的时候人家就要上键盘
小白原来的家是个农家院,除了一群无忧无虑的猫狗,还有少了一只胳膊的野猴子
也是我们疏于照顾,忽视了前面几天的异常,意识到的时候已经晚了,赶紧带小白去看医生
输液延长了一天的生命,晚上我们把他带回家,还在客厅慢走了几步,半夜的时候就走了
小白离开了我们,我们很难过,把他埋葬在一个风景优美的小树林,希望他在天堂永远快乐

SAP移动类型

MvT移动类型文本含义
101GR 收货直接收货
102用于PO冲销的收货冲销直接收货
103进入冻结库存的收货收入质检仓
104到冻结冲销的收货冲销收入质检仓(待检退货等)
105来自冻结库存的收货从质检仓收货入库
106来自冻结的收货冲销冲销入库异常及向供应商退货
121收货后续调整 
122RE 向供应商退货向供应商退货(101、105)
123RE退货供应商冲销冲销向供应商退货(122)
124收货退货冻结库存冻结库存退货(103)
125收货退货冻结库存冲销冲销冻结库存退货(124)
131收货 
132收货 
141收货后续调整 
142收货后续调整 
161收货退货创建退货采购订单向供应商退货
162收货退货冲销冲销创建退货采购订单向供应商退货
201有关成本中心的发货向成本中心发料
202有关成本中心的收货成本中心退料或冲销成本中心发料
221有关项目的发货向项目发货
222有关项目的收货项目退货或冲销项目发货
231有关销售订单的发货销售订单的发货
232有关销售订单的收货销售订单的退货或重销销售订单的发货
241有关资产的发货向资产的发货
242有关资产的收货向资产的发货
251有关销售的发货有关销售的发货
252有关销售的收货有关销售的收货
261有关订单的发货工单领料
262有关订单的收货工单退料(或冲销工单领料)
281有关网络的发货有关网络的发货
282有关网络的收货有关网络的收货
291发货的全部帐户分配向所有对象发货(可选择发货到对象的类型)
292收货的全部帐户分配向所有对象收货(可选择发货到对象的类型)
301TF工厂间的转移工厂间的转移(one step)
302TR工厂间的转储 
303TF出库到工厂 
304TR出库到工厂 
305TF厂内库存转储计划 
306TR厂内库存交易计划 
309TF转储采购物料到物料TF转储采购物料到物料
310TR转储采购物料到物料TR转储采购物料到物料
311TF厂内移储TF厂内移储
312TR 厂内转储TR 厂内转储
313TF出库到库存地从出库库存到库存地
314TR出库到库存地冲销出库库存到库存地
315TF库存地库存转储计划 
316TR库存地库存转储计划 
317创建结构化物料 
318RE创建结构化物料 
319拆分结构化物料 
320RE拆分结构化物料 
321TF质量到非限制质检库存到非限制库存
322TR 质量到非限制冲销质检库存到非限制库存
323TF厂内质量 
324TR厂内质量 
325TF厂内冻结 
326TR厂内冻结 
331GI 到采样QI 
332RE 到采样QI 
333GI 到采样非限制 
334RE 到采样非限制 
335GI 到采样冻结 
336RE 到采样冻结 
340批次重估 
341TF 非限制到限制 
342TF 限制到非限制 
343TF冻结到非限制冻结库存到非限制库存
344TR 冻结到非限制冲销冻结库存到非限制库存
349TF 冻结到QI冻结库存到质检库存
350TR冻结到QI冲销冻结库存到质检库存
351TF在途库存 
352TR 在途库存 
411TF库存地到库存地寄售入库(K)、MTO(E)
412TR库存地到库存地寄售入库(K)、MTO(E)
413TF库存地到销售订单MTO(E)
414TR库存地到销售订单MTO(E)
415TF 库存地到项目 
416TR 库存地到项目 
441TP 非限制到 tiedEmp 
442TP tiedEmp.到非限制 
451GI退货Returns from customer without Shipping
452RE 退货(冲销)冲销451
453总储备退回发出处总储备退回发出处
454总储备到退货总储备到退货
455TF库存转储退货 
456TR库存转储退货 
457TP 退货到总储备 QI客户退货的转回(质检库存)
458TP 总储备QI到退货客户退货的转回(质检库存)冲销
459TP退货到总储备冻结客户退货的转回(冻结库存)
460TP 总储备冻结到退货客户退货的转回(冻结库存)冲销
501无PO的收货 
502RE无PO的收货 
503收货到QI 
504RE收货到数量 
505收据到收货 
506RE收货到冻结 
511免费交货 
512无费用的RE交货 
521无订单的收货无订单的收货
522RE无生产订单的收货无订单的收货的冲减
523无生产订单的QI收货质检库存无订单的收货
524RE无生产订单的质量质检库存无订单的收货冲销
525无生产订单的冻结收货冻结库存无订单的收货
526RE无生产订单冻结冻结库存无订单的收货冲销
531副产品收货 
532RE副产品 
541对转包库存的GI仓库对转包库存的GI仓库
542RE转包库存到仓库RE转包库存到仓库
543GI发货销售订单存货GI发货销售订单存货
544GI收货销售订单存货GI收货销售订单存货
545副产品SC收货 
546GI 发货 SC 副产品 
551GI报废GI报废(仓库物料报废)
552RE报废RE报废(仓库物料报废)
553GI报废QI质检库存报废
554RE报废QI质检库存报废冲销
555GI报废冻结冻结库存报废
556RE报废冻结冻结库存报废冲销
557GI调整转运 
558GI调整转运 
561库存余额的初始条目库存余额的初始条目
562RE初始条目库存余额RE初始条目库存余额(初始库存冲销)
563初始条目库存余额:QI质检限制性初始库存
564RE库存余额输入:QI质检初始库存冲销
565库存余额输入:冻结冻结初始库存
566RE库存余额输入:冻结冻结初始库存冲销
571收货装配 
572RE 收货装配 
573收货 QI 装配 
574RE 收货 QI 装配 
575收货冻结装配 
576RE 收货冻结装配 
581收货副产品网络 
582RE 副产品    网络 
601GD发货: 交货(内销)GD发货: 交货(内销)
602RE交货冲销(内销) 
603TF出库到工厂 
604TR出库到工厂 
605TF厂内库存转储计划 
606TR厂内库存交易计划 
621GI返回式包装:借贷 
622GI返回式包装:退货 
623GI发货:客户退货包装 
624GI收货:客户退货包装 
631GI寄售: 借贷寄售订单发货到办事处
632GI寄售: 退货寄售订单发货到办事处
633GI发货: 客户寄售寄售结算发货订单由办事处发货到客户处
634GI收货: 客户寄售冲销633
635TF托售出租 
636TR寄售退货交货 
641TF在途库存 
642TR 在途库存 
643TF 至跨公司间 
644TR 至跨公司间 
645TF 跨公司 
646TR 跨公司 
647TF在途库存 
648TR 在途库存 
651GD退货  退回客户退货退回(限制性使用库存的转回)
652GD退货  退货冲销冲销651
653GD 退货    非限制客户退货退回(非限制性使用库存的转回)
654GD 退货 非限制 冲销冲销客户退货退回(非限制性使用库存的转回)
655GD 退货 QI客户退货退回(质检状态使用库存的转回)
656GD 退货 QI 冲销冲销客户退货退回(质检状态使用库存的转回)
657GD 退货冻结客户退货退回(冻结使用库存的转回)
658GD 退货冻结冲销冲销客户退货退回(冻结使用库存的转回)
661GI向供应商退货 
662RE退货到供应商冲销 
671TR 在途库存 
672TF在途库存 
673TF 至跨公司间 
674TR 至跨公司间 
675TR 跨公司 
676TF 跨公司 
677TR 在途库存 
678TF在途库存 
6A1TF GI1 
6A2TR GI1 
6A3TF CC GI1 
6A4TR CC GI1 
6A5TF CC GI1 
6A6TR CC GI1 
6A7TF GI1 
6A8TR GI1 
6B1TF GI2 
6B2TR GI2 
6B3TF CC GI2 
6B4TR CC GI2 
6B5TF CC GI2 
6B6TR CC GI2 
6B7TF GI2 
6B8TR GI2 
6K5TF GI2 托售 
6K6TR GI2 托售 
6W5TF GI1 托售 
6W6TR GI1 托售 
701GR实际盘点: 仓库盘盈
702GI实际盘点: 仓库盘亏
703GR实际盘点: QI质检物料盘盈
704GI实际盘点: QI质检物料盘亏
707GR实际盘点: 已冻结冻结物料盘盈
708GI实际盘点: 冻结冻结物料盘亏
711GI存货差异: 仓库 
712GR存货差异: 仓库 
713GI存货差异:QI 
714GR存货差异: 质检 
715GI存货差异: 退货 
716GR存货差异: 退货 
717GI存货差异: 冻结 
718GR存货差异: 冻结 
721SlsVal.rec.n.afftMgs 
722SlsVal.iss.n.afftMgs 
731SlsVal.rec. afftgMgs 
732SlsVal.iss. afftgMgs 
841  
842  
843  
844  
901GD发货: 交货(外销) 
902RE交货冲销(外销) 
Z03有关内部订单的发货有关内部订单的发货
Z04有关内部订订单的收货有关内部订订单的收货
Z09TF转储采购物料到物料TF转储采购物料到物料
Z10TR转储采购物料到物料TR转储采购物料到物料