前言

本文旨在记录——如何在docker的Ubuntu镜像下配置defects4j 1.2.0 (最新版本,此时时间:2018-09-16)。

一、配置过程

1)先要在docker下安装Ubuntu(我的系统是win10家庭版)

docker pull ubuntu:14.04

docker run --name testByDale -it ubuntu:14.04

docker exec -u deheng -w /home/deheng/ -it testByDale bash
docker exec -u deheng -it testByDale bash

docker exec -it --user root /bin/bash

在ubuntu中添加一个新的用户账户:
adduser deheng
密码:deheng

删除账户:deluser 或者 sudo deluser
重建sudo账户:sudo adduser deheng

然而还是没有sudo权限,那么我就参考:https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-ubuntu-16-04https://www.linuxidc.com/Linux/2010-12/30386.htm 中的两篇文章

先进入root,用su -
然而我不知道root的密码。只能用docker exec 命令重新进入root了。

chmod u+w /etc/sudoers
添加deheng ALL=(ALL) ALL
chmod u-w /etc/sudoers

exit

docker exec -u deheng -it testByDale bash

2)根据defects4j官网(https://github.com/rjust/defects4j )要求,安装需要的程序和模块

Requirements


Java 1.7
Perl >= 5.0.10
Perl modules: run cpan Bundle::CSV DBD::CSV DBI or sudo cpan Bundle::CSV DBD::CSV DBI
Git >= 1.9
SVN >= 1.8

安装git:

sudo apt-get update
sudo apt-get install git
git --version

安装svn:

sudo apt-get subversion
svn --version

安装perl 模块:

cpan Bundle::CSV DBD::CSV DBI

安装jdk 1.7:
必须先拷贝jdk.tar.jar到docker container中,然后
zip -r archive_name.zip directory_to_compress 这个是用来压缩目录的
unzip archive_name.zip 解压zip文件

tar -cvf archive_name.tar directory_to_compress 压缩文件夹成一个tar包
tar -xvf archive_name.tar.gz 解压tar包。
tar -xvf archive_name.tar -C /tmp/extract_here/ 解压到指定目录
tar -zxvf archive_name.tar.gz 解压缩tar包。
tar -zcvf archive_name.tar.gz directory_to_compress 压缩tar包。

修改/etc/profile,添加java的环境变量,需要掌握vim指令:
vim /erc/profile
按insert进入插入模式,按esc退出插入模式。
: q! (输入q!, 不存盘强制退出vi)
: wq (输入「wq」,存盘并退出vi)

关于每次都要source /etc/profile:
https://segmentfault.com/q/1010000005981201

~/.bashrc里面加一句 source /etc/profile

linux关于bashrc与profile的区别:
https://www.cnblogs.com/hongzg1982/articles/2101792.html
/etc/profile,/etc/bashrc 是系统全局环境变量设定
/.profile,/.bashrc用户家目录下的私有环境变量设定

我知道为什么我的deheng账户下的ubuntu没有~./bashrc了,因为我之前就建了一个deheng的文件夹,所以现在需要自己新建一个bashrc,
我建立了之后,就搞定了,在~./bashrc里面加上一行:source /etc/profile 就可以正确设置java 环境变量了。nice。

不信可以验证一下,我重新建一个账户,绝对会自动生成一个文件夹出来:

exit
docker exec -it testByDale bash
sudo adduser justfortest
exit
docker exec -u justfortest -it testByDale bash
ls
ls -a

果然有结果:

deheng justfortest
. … .bash_logout .bashrc .profile

3)把defects4j拷贝到ubuntu中

perl模块查看:
perldoc -l DBD::mysql
perldoc perllocal
perldoc -l Bundle::CSV

https://blog.csdn.net/u010533843/article/details/54971428

我先运行 cpan Bundle::CSV DBD::CSV DBI,结果不行
所以我分开: sudo cpan DBI
看来必须先安装YAML,否则会提示:‘YAML’ not installed, will not store persistent state

查看安装的所有软件
dpkg -l

二、步骤一已经失败,现在进入另外的尝试——configure defects4j in my ubuntu image from the scratch

1)
先下载defects4j:
git clone https://github.com/rjust/defects4j

更换阿里源:
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份
sudo vim /etc/apt/sources.list #修改
sudo apt-get update #更新列表

2)运行init.sh

Linux下获取当前的目录,需执行以下命令:$(cd dirname $0;pwd)

其中,dirname $0,取得当前执行的脚本文件的父目录
cd dirname $0,进入这个目录(切换当前工作目录)
pwd,显示当前工作目录(cd执行后的)

关于wget:
-N, –timestamping 不要重新下载文件除非比本地文件新
-nv, –non-verbose 关掉冗长模式,但不是安静模式

关于unzip命令:
-o 以 压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-o 不 必先询问用户,unzip执行后覆盖原有文件。
-q 执 行时不显示任何信息。
-q 不显 示指令执行过程。
-u 更 换较新的文件到压缩文件内。

关于stat命令:
stat指令:文件/文件系统的详细信息显示。
stat命令主要用于显示文件或文件系统的详细信息,该命令的语法格式如下:
-f  不显示文件本身的信息,显示文件所在文件系统的信息
-c 自定义输出格式,结尾有换行

运行:
$ docker cp ./ubuntu/defects4j/project_repos/defects4j-repos.zip testByDale:/home/deheng/defects4j/project_repos

$ docker cp ./ubuntu/defects4j/framework/lib/test_generation/generation/evosuite-0.2.0.jar testByDale:/home/deheng/defe
cts4j/framework/lib/test_generation/generation/

$ docker cp ./ubuntu/defects4j/framework/lib/test_generation/runtime/evosuite-standalone-runtime-0.2.0.jar testByDale:/
home/deheng/defects4j/framework/lib/test_generation/runtime

拷贝文件到ubuntu中。

雕虫小技。。。
我觉得只要习惯了看init.sh,还是不难把defects4j配置出来的。

下载randoop
https://github.com/randoop/randoop/releases/

docker cp ./ubuntu/defects4j/framework/lib/test_generation/generation/replacecall-4.0.4.jar testByDale:/home/deheng/d
efects4j/framework/lib/test_generation/generation/

发现一个神奇海螺般的问题:
在wget的时候,如果进度条不动了,我只要按一下ctrl + c,进度条就又动起来了,神奇。

问题:
2018-09-16 14:58:33 (14.9 KB/s) - ‘major-1.3.2_jre7.zip’ saved [4490962/4490962]

cp: cannot stat ‘major/bin/.ant’: No such file or directory

Setting up EvoSuite …

Setting up Randoop …
./init.sh: line 83: jar: command not found

3)然而,还需要:
cpan Bundle::CSV DBD::CSV DBI

这个命令不可行。

$ docker cp ./ubuntu/sources.list testByDale:/home/deheng/

幸好之前还记录了一些DBI perl模块的安装,,,

不过我先装make。我这个ubuntu好像没有make,也没有gcc??有点奇怪。

不过163网易源已经不行了啊,全部是miss,bad,所以只能用清华源了

https://blog.csdn.net/qq_35038153/article/details/72790762

sudo apt-get install gcc (装gcc)

sudo apt-get install cmake (装cmake,不知道有用没)

原来确实是我没有装gcc和cmake,装了之后,现在运行的可好了
cpan Bundle::CSV DBD::CSV DBI

##三、保存对docker 容器的修改

保存对容器的修改

当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

运行docker commit,可以查看该命令的参数列表。
你需要指定要提交保存容器的ID。(译者按:通过docker ps -l 命令获得)
无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分。(译者按:非常类似git里面的版本号)

$docker commit 698 learn/ping
docker commit -a “runoob.com” -m “my apache” a404c6c174a2 mymysql:v1

https://www.jianshu.com/p/1c8b96cf1f13
这里讲的很详细,怎么上传docker 镜像

$ docker save busybox > busybox.tar
$ ls -sh busybox.tar
2.7M busybox.tar
$ docker save --output busybox.tar busybox
$ ls -sh busybox.tar
2.7M busybox.tar
$ docker save -o fedora-all.tar fedora
$ docker save -o fedora-latest.tar fedora:latest

如果想要把镜像存出到本地文件,可以使用docker save命令,例如,存出本地的刚才创建的testimage:lastest为镜像文件testimage.tar文件:

[root@wdg2 ~]# docker save -o /data/centos7.tar centos7
[root@wdg2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos7 latest 562987ba2b7e 3 minutes ago 589.4 MB
centos latest 9baab0af79c4 2 weeks ago 196.8 MB

载入镜像的话,要先删除:
docker rmi centos7
docker load --input /data/centos7.tar
docker images

运行defects4j的一些问题

1)编码
docker里面不支持ascii编码,好像。
我在下载math_35_buggy的时候,编译出错(defects4j compile):
[javac] /home/deheng/SimFix/buggyprograms/math_35_buggy/src/test/java/org/apache/commons/math3/exception/util/LocalizedFormatsTest.java:21: error: unmappable character for encoding ASCII
[javac] * Copyright 2010 CS Communication & Syst??mes
[javac] ^
[javac] /home/deheng/SimFix/buggyprograms/math_35_buggy/src/test/java/org/apache/commons/math3/exception/util/LocalizedFormatsTest.java:21: error: unmappable character for encoding ASCII
[javac] * Copyright 2010 CS Communication & Syst??mes
[javac] ^
[javac] 2 errors

把这个systems改正常之后,就可以了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐