分类 技术 下的文章

一些能让你自定义 Bash 提示符的黑科技

 title=

当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:

[user@$host ~]$

你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~

如何设置 Bash 提示符

Bash 提示符是通过环境变量 PS1 提示符字符串 1 Prompt String 1 ) 来设置的,它用于交互式 shell 提示符。当然如果你需要更多的输入才能完成一个 Bash 命令时,PS2 环境变量就是用来设置多行提示符的:

[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ "
[Linux Rulez] export PS2="... "
[Linux Rulez] if true; then
... echo "Success!"
... fi
Success!

在哪里设置 PS1 的值?

PS1 就是一个普通的环境变量,系统默认值设置在 /etc/bashrc 中,在我的系统中,默认提示符通过以下命令来设置的:

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

它判断 PS1 是否是系统的默认值 \s-\v$ ,如果是的话则将值设置为 [\u@\h \W]\$。(LCTT 译注:注意命令中用 \ 做了转义。)

但如果你想要自定义提示符,不应该修改 /etc/bashrc ,而是应该在你的主目录下将自定义命令加到 .bashrc 文件中。

上面提到的 \u\h\W\s\v 是什么意思?

man bash 中的 PROMPTING 章节中,你能够找到所有 PS1PS2 相关的特殊字符的描述,以下是一些比较常用的:

  • \u:用户名
  • \h:短主机名
  • \W:当前你所在的目录的名称(basename),~ 表示你的主目录
  • \s:Shell 名字(bash 或者 sh,取决于你的 Shell 的名字是什么)
  • \v:Shell 的版本号

还有哪些特殊的字符串可以用在提示符当中

除了上面这些,还有很多有用的字符串可以用在提示符当中:

  • \d:将日期扩展成 “Tue Jun 27” 这种格式
  • \D{fmt}:允许自定义日期格式——可通过 man strftime 来获得更多信息
  • \D{%c}:获得本地化的日期和时间
  • \n:换行(参考下面的多行提示符)
  • \w:显示当前工作目录的完整路径
  • \H:当前工作机器的完整主机名

除了以上这些,你还可以在 Bash 的 man 页面的 PROMPTING 部分找到更多的特殊字符和它的用处。

多行提示符

如果你的提示符过长(比如说你想包括 \H\w 或完整的日期时间时 ),想将提示符切成两行,可以使用 \n 将提示符切断成两行显示,比如下面的多行的例子会在第一行显示日期、时间和当前工作目录,第二行显示用户名和主机名:

PS1="\D{%c} \w\n[\u@\H]$ "

还能再好玩点吗?

人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心、易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做:

PS1="\[\e[31m\]\D{%c}\[\e[0m\]
     \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ "
  • \[..\] :表示一些非打印字符
  • \e[.. :转义字符,后面的跟着的特定的转义字符串在终端中表示颜色或者其他意思
  • 31m :表示红色字体(41m 表示是红色背景)
  • 36m :表示是青蓝色字体
  • 1;43m :表示黄色字体(1;33m 表示黄色字体)
  • \[\e[0m]\] :它在最后将颜色恢复成系统终端默认颜色

你可以在 Bash prompt HOWTO 这里找到更多的颜色代码,甚至可以让字符反相和闪烁!我不知道为什么地球人会有这种想法,但是你可以这么干!

所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里告诉我吧~

(照片来源:ajmexico. 修改自 Jason Baker. CC BY-SA 2.0.)


作者简介:

Dave Neary - Dave Neary 是红帽开源和标准化团队成员,帮助开源项目对红帽的成功至关重要。自从在 1999 年为 GIMP 提交了第一个补丁以来,他一直带着各种不同的帽子,在开源的世界徜徉。


via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks

作者:Dave Neary 译者:吴霄/toyijiu 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用终端恢复你 Linux 系统上仍在运行进程的已删除文件的快速指南。

许多情况下,删除的文件都可以恢复,比如在该文件有活动的进程在操作它,并且目前被单个或多个用户使用时。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,其被称之为进程标识符 “PID”,并将它们存放在 /proc 目录中。这正是我们恢复仍在运行的进程中(具有PID)已删除的文件所需要的东西。这里就是介绍我们如何做到这一点的。

假设你打开了一个压缩文件,之后你删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。

计算原始文件的 MD5 哈希

删除之前,我们将计算该文件的 MD5。这样我们可以将原来的 MD5 哈希值与恢复文件的 MD5 哈希进行比较。这个过程将保证我们恢复的压缩文件的完整性是一样的,它没有被破坏。

md5sum opengapps.zip >> md5-opengapps.txt

要显示文本文件的内容。

cat md5-opengapps.txt

86489b68b40d144f0e00a0ea8407f7c0  opengapps.zip

检查压缩文件的 MD5 哈希值之后。我们将压缩文件保持打开(LCTT 译注:此处是使用 file-roller 这个图形界面的解压程序保持对该压缩文件的打开,其内置在 GNOME 环境中;在桌面环境中,使用桌面工具打开一个压缩包也能起到同样的作用。又及,本文举例不是很恰当,如果是删除了某个服务进程的已经打开的配置文件,那么这种恢复就很有意义),并将其删除。之后,我们将从文件的恢复过程开始,步骤如下:

rm opengapps.zip

删除文件的恢复过程

正如我们前面提到的,运行的进程在 /proc 目录中。我们可以使用以下命令搜索该目录中需要的进程:

由于我们已经知道文件名包括 .zip 扩展名,因此我们可以使用 .zip 扩展名进行搜索。它将限制输出结果并显示所需的进程。

ps -axu | grep .zip

m        13119  0.8  1.0 121788 30788 ?        Sl   06:17   0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip
m        13164  0.0  0.0   5108   832 pts/20   S+   06:18   0:00 grep --color=auto .zip

然后我们将进入到包含 PID 13119 的目录并打开 fd 子目录。

cd /proc/13119/fd

fd (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件以硬链接的方式链接到原始文件。 fd 目录中的所有文件都以数字链接到“文件名”。因此,要确定这些文件中的哪一个链接到该原始文件,我们将用详细列表选项列出 /fd 目录。

ls -l

total 0
lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null
lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161]
lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd]
lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify
lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671]
lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted)
lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161]
lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd]
lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd]
lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361]
lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd]
lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd]
lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363]
lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365]

正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 13,其进程 PID 13119。但是,我们仍然可以通过将链接的文件复制到安全的地方来恢复它。

cp 13 /home/m/Downloads/Compressed

文件复制后。我们将返回包含恢复文件的目录,并使用以下命令重命名它。

mv 13 opengapps-recovered.zip

计算恢复文件的 MD5 哈希

由于我们已经恢复了该文件。让我们检查该文件的完整性,这只是为了确保文件没有损坏,并且和原来一样。早先我们保存了原始文件的 MD5 哈希值。

md5sum opengapps-recovered.zip >> md5-opengapps.txt

该命令将检查文件的 MD5 哈希值,并在文件中追加新恢复文件的 MD5 哈希值,以轻松比较两个 MD5 哈希值。

可以显示文本文件的内容来比较原始文件和恢复文件的 MD5 哈希值。

cat md5-opengapps.txt

86489b68b40d144f0e00a0ea8407f7c0  opengapps.zip
86489b68b40d144f0e00a0ea8407f7c0  opengapps-recovered.zip

恢复文件的 MD5 哈希是一样的。所以,我们成功地恢复了我们以前删除的文件,并且恢复后文件完整性一致,并且工作正常。

注意: 在某些情况下,某些文件无法通过 ps -axu 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。

假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为扩展名的视频。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。

要查找正在运行的程序的 PID,请使用以下命令,后面跟程序的名称。

pidof 程序名

通过分享支持我们。


via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/

作者:mhnassif 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

查看本教程,看看使用 Node-RED 的拖放界面设置硬件流程是多么容易。

 title=

Node-RED 是一个编程工具,可让你使用基于浏览器的编辑器快速连接硬件设备。它具有大量的节点,可以以拖放的方式构建流程,这大大减少了开发时间。Node-RED 与树莓派的 Raspian Jessie 一起安装,你还可以独立下载 Node-RED。

为了向你展示它如何工作,我们将使用 Node-RED 构建一个简单的工具,与连接到树莓派的蜂窝调制解调器通信。使用蜂窝调制解调器,你可以通过蜂窝网络从你的树莓派发送/接收数据。你可以使用蜂窝网络提供商通常提供的 3G/4G USB 加密狗,也可以将开发板与 3G 或 4G 无线调制解调器连接。

无论你是连接 USB 加密狗还是开发板,树莓派的连接接口都是通过 USB 端口的。在本教程中,我将一块 SIM900 开发板通过一根 USB 转串行电缆连接到树莓派。

第一步是检查 SIM900 开发板是否连接到树莓派上。

 title=

USB 转串行适配器在这里被显示为连接到树莓派的 USB 设备之一。

接下来,检查 SIM900 连接的 USB 端口号。

 title=

在最后一行,你可以看到 SIM900 板(通过 USB 转串行转换器连接)连接到了树莓派上的 ttyUSB0。现在我们准备开始使用 Node-RED。

在树莓派上启动 Node-RED。

 title=

下载示例流图并将其导入到 Node-RED 中。请注意,流文件是该图形 UI 的 JSON 表示形式。

在 Node-RED 中,导入的流图应该看上去像这样:

 title=

注入节点设置 AT 命令需要查询调制解调器。添加换行 功能节点会在注入节点传递过来的 AT 命令后面附加 **
添加换行 的输出然后被连接到串行输出节点,它将数据写入串行端口。来自调制解调器的 AT 命令的响应通过 串行输入 节点读取,该节点将响应输出到 调试 窗口。确认串行端口号和端口速度在 串行输入串行输出** 节点中的配置。

Node-RED 是一种易于使用的编程工具,可用于快速集成和测试硬件设备。从本教程可以看出,使用 Node-RED 连接和测试使用树莓派的蜂窝模式不需要编码。

有关 Node-RED 和其他可以使用的方式的更多信息,请访问项目网站

(题图: Thomas Hawk 的 Flickr. CC BY-NC 2.0. Opensource.com 修改)


作者简介:

Surya G - 我的兴趣是为物联网项目尤其是使用蜂窝调制解调器的项目做软件开发。


via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware

作者:Surya G 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文、部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元,Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 Java,Javascript 和 Ptyhon 语言,甚至包括 Go 语言。

两年前 Express (基本上是 NodeJS 事实标准上的网络框架层)的作者,离开了 Node 社区,而将其注意力转向 Go (谷歌创造的后端服务语言),以及 Lambda(由 AWS 提供的函数即服务)。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 Apex 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。

什么是 Lambda?

如今,人们如果不能使用自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们会部署一个完整的协议栈如 Node、Express,和一个自定义应用。或者如果他们更进一步使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。

在这个抽象的阶梯上的下一步是单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如,AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件,而函数即服务(FaaS)的供应方根据要求执行匹配的函数。

Apex 起步

Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了从 AWS 获取的命令行工具(详情请查看 AWS CLI Getting Started 或者 Apex documentation)。

接下来,安装 Apex:

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

然后为你的新项目创建一个目录并运行:

apex init

apexInit

这步会配置好一些必须的安全策略,并且将项目名字附在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件和默认的 “Hello World" 风格的 Javascript 函数的 functions 目录。

tree

Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录,然后在其中创建项目。如果想要使用 Go 语言,你可以创建一个叫 simpleGo 的目录然后在其中创建一个小型的 main 函数:

//  serverless/functions/simpleGo/main.go
package main

import (  
    "encoding/json"
    "github.com/apex/go-apex"
    "log"
)

type helloEvent struct {  
    Hello string `json:"hello"`
}

func main() {  
    apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
        var h helloEvent
        if err := json.Unmarshal(event, &h); err != nil {
            return nil, err
        }
        log.Print("event.hello:", h.Hello)
        return h, nil
    })
}

Node 是 Lambda 所支持的运行环境,Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 event 传入二进制文件的 STDIN,将从二进制返回的 STDOUT 作为 value。通过 STDERR 来显示日志。apex.HandleFunc 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 go run main.go 来测试它。

goRun

通过 Apex 向云端部署稍显琐碎:

apexDeploy

注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 stagingproduction配置env

通过 apex invoke 在云端执行也比较琐碎:

apexInvoke

当然我们也可以追踪一些日志:

apexLog

这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见,但是当在另一个终端参照此结果来署它会更快。

窥探内部的秘密

来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外,它会提前做好配置如入口与安全条例:

lambdaConfig

Lambda 服务实际上接受一个包含所有依赖的 zip 压缩包,它会被部署到服务器来执行指定的函数。我们可以使用 apex build <functionName> 在本地创建一个压缩包用来在以后解压以探索。

apexBuild

这里的 _apex_index.js handle 函数是原始的入口。它会配置好一些环境变量然后进入 index.js

index.js 孕育一个 main Go 的二进制文件的子进程并且将所有关联联结在一起。

使用 mgo 继续深入

mgo 是 Go 语言的 MongoDB 驱动。使用 Apex 来创建一个函数来连接到 Compose 的 MongoDB 就如同我们已经学习过的 simpleGo 函数一样直观。这里我们会通过增加一个 mgoGo 目录和另一个 main.go 来创建一个新函数。

// serverless/functions/mgoGo/main.go

package main

import (  
    "crypto/tls"
    "encoding/json"
    "github.com/apex/go-apex"
    "gopkg.in/mgo.v2"
    "log"
    "net"
)

type person struct {  
  Name  string `json:"name"`
  Email string `json:"email"`
}

func main() {  
    apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
        tlsConfig := &tls.Config{}
        tlsConfig.InsecureSkipVerify = true

        //connect URL:
        // "mongodb://<username>:<password>@<hostname>:<port>,<hostname>:<port>/<db-name>
        dialInfo, err := mgo.ParseURL("mongodb://apex:[email protected]:15188, aws-us-west-2-portal.1.dblayer.com:15188/signups")
        dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
            conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
            return conn, err
        }
        session, err := mgo.DialWithInfo(dialInfo)
        if err != nil {
            log.Fatal("uh oh. bad Dial.")
            panic(err)
        }
        defer session.Close()
        log.Print("Connected!")

    var p person
    if err := json.Unmarshal(event, &p); err != nil {
            log.Fatal(err)
    }

        c := session.DB("signups").C("people")
        err = c.Insert(&p) 
        if err != nil {
            log.Fatal(err)
        }

    log.Print("Created: ", p.Name," - ", p.Email)
        return p, nil
    })
}

发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API:

apexMgo

最终结果是 insert 到在 Compose 之上 的 MongoDB 中。

composeDeploy

还有更多……

尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 Terraform 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript、Java、Python 以及 Go。你也可以为开发、演示以及产品环境配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。

和大多数事物一样,Apex 和 Lambda 并不是在所有场景下都完美。 但是,在你的工具箱中增加一个完全不需要你来管理底层建设的工具完全没有坏处。


作者简介:

Hays Hutton 喜欢写代码并写一些与其相关的东西。喜欢这篇文章?请前往Hays Hutton’s author page 继续阅读其他文章。


via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/

作者:Hays Hutton 译者:xiaow6 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro(13 寸,2011 年后期发布,16GB 内存, 500G 的固态硬盘,内核是 i5,主频 2.4GHz,64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成(CI)服务器。

写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始:

  1. 配置一个新的 Ubuntu ,以便运行 Android SDK。
  2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。
  3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。
  4. Android app 配置需求。

第一步-安装 Ubuntu:

我将使用 Ubuntu 作为持续集成的 SO,因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了,我就不废话了,贴个下载链接就行了。

有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。

第二步-远程管理:

SSH 服务器

Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。

$ sudo apt-get install openssh-server

NoMachine 远程桌面

可能你的持续集成服务器没有挨着你,而是在你的路由器后面,或者其它屋子,甚至还可能远离你数里。我试过各种远程桌面方案,不得不说,IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。

第三步-配置环境:

这里我打算安装 Java8,Git,和 Android SDK,Jenkins 需要它们来拉取、编译和运行 android 项目。

SDKMAN!

这个超级厉害的命令行工具让你可以安装各种流行的 SDK(比如说,Gradle、Groovy、Grails、Kotlin、 Scala……),并可以以容易方便的方式列出它们和在各个并行版本中切换。

它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java,而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到。

安装 SDKMAN! 很容易,执行以下命令即可:

$ curl -s "https://get.sdkman.io" | bash

Oracle JAVA8

因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了:

$ sdk install java

或者使用 webupd8 这个仓库:

Git:

安装git的命令也非常直观,就不废话了。

$ sudo apt install git

Android SDK

这下面这篇文章的底部

你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如:

https://dl.google.com/android/repository/tools_r25.2.3-linux.zip

下载,然后解压到 /opt/android-sdk-linux 下:

$ cd /opt
$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux

我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。

$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/

然后,在 ~/.bashrc 文件下设置 SDK 的环境变量

$ cd
$ nano .bashrc

在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前):

export ANDROID_HOME="/opt/android-sdk-linux"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

关闭此终端,再打开一个新的终端看看环境变量是否正确生效:

$ echo $ANDROID_HOME
/opt/android-sdk-linux

然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖:

$ android

运行 Android SDK Manager 的图形交互界面

第四步-Jenkins 服务器

这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。

安装 Jenkins

你可以在下面的链接找到 Jenkins 服务器相关信息:

我们有许多办法运行 Jenkins,比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。

我起初是想把它当做 Docker 容器运行,但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。

少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

编辑 source.list,写入这一行:

$ sudo nano /etc/apt/sources.list
#Jenkin Stable
deb https://pkg.jenkins.io/debian-stable binary/

然后安装:

sudo apt-get update
sudo apt-get install jenkins

在你的用户组里面增加 jenkins ,允许其读写 Android SDK 文件夹。

$ sudo usermod -a -G 你的用户组 jenkins

Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问:

安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。

启用安装成功的 Jenkins 服务器。

Jenkins 配置

启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。

安装 Jenkins 插件

创建管理员用户,并完成安装。

要完成安全需要配置环境变量 ANDROID_HOMEJAVA_HOME

点击 Manage Jenkins,接着 Configure System。

滚动文件至底部,在全局属性模块中找到环境变量,并增加 ANDROID_HOMOE,和 JAVA_HOME 变量。

给所有 Jenkins 任务增加全局变量

创建 Jenkins 任务

一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app,带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。

首先创建一个新的 Freestyle 任务项目,取名为 Hello_Android。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。

创建一个 Freestyle Jenkins 任务

接下来就是配置了,我给每一部分都做了截屏。

概况

这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,这是 url 的部分,不是仓库的)。

项目 Url 配置

源代码管理

这时候我们就要选择我们的 CVS 作为 Git,并且增加仓库的 url(这次就要包括 *.git)然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。

相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。

另外,如果你已经使用了双因子认证,Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。

配置仓库

构建触发器

你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。

最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github 为此提供了一个名叫 webhooks 的系统。

这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。

你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI,我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。

仓库轮询配置

构建环境

这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。

构建超时

构建

现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下,Android 项目带有 Gradle Wrapper,不要忘记把它检入到 Git ),然后定义你要执行哪些任务:

  1. clean:清除之前构建的所有历史输出,这样可以确保没有东西缓存,从头构建。
  2. asseembleDebug: 生成调试 .apk 文件。
  3. test:在所有模块上执行 JUnit 测试。
  4. connectedDebugAndroidTest:在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。

配置 Gradle

构建后操作

我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。

我们 app 模块中,测试运行结果的路径是: app/build/test-results/debug/*.xml

在多模块项目中,其它的“纯” Java 模块中测试结果在这里:*/build/test-results/*.xml

还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。

运行 Jenkins 任务

只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。

手动执行任务

最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。

控制台输出的开始部分

如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。

哈哈哈哈,构建成功,测试结果符合预期

第五步-SonarQube

这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。

SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。

安装 Docker

安装 Docker 十分容易,按照下面的教程即可:

生成容器

MySQL

我们先搭建一个 MySQL5.7.17 服务器容器,命名为 mysqlserver,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 YOUR_USERYOUR_MYSQL_PASSWORD 替换为你自己账号密码)。

$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17

phpMyAdmin

想要优雅简单地管理 MySQL服务器,我强烈推荐 phpMyAdmin。你只要建立个容器,命名为 phpmyadmin,然后链接到我们的 mysqlserver 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。

$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin

你可以用你的 mysql 密码 YOUR_MYSQL_PASSWORD ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar,使用uft8_general_ci 字符集。此外,也创建一个 sonar 的新用户,密码 YOUR_SONAR_PASSWORD,并给它 sonar 数据库的权限。

SonarQube

现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090,使用 5.6.4 版本。

$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4

配置 SonarQube

如果一起都正常,你将在 localhost:9000 看到如下页面:

好了,让我们来配置必要的插件和基本的配置文件:

  1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin)。
  2. 进入到 Administration,然后点击 System,接下来是 Updata Center,最后是 Updates Only。

    • 如果需要的话,更新 Java 插件。
  3. 现在启用,并安装以下插件

    • Android (提供 Android lint 规则)
    • Checkstyle
    • Findbugs
    • XML
  4. 返回顶部,点击重启按钮完成整个安装。

SonarQube 配置文件

我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。

同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。

就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。

将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。

继承链

运行 Sonarqube 分析器

现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 sonarqube 到我们的 Jenkins 任务。我们在最后执行。

再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。

分析结果的显示

点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。

在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。

第六步 附加:配置其他 Android 应用

想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息

你也可以看看我在云上测试的文章:

最后

啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。


作者简介:

Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller


via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98

作者:Pablo A. Martínez 译者:Taylor1024 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本教程将指导你如何使用 iRedMail 服务器配置 Mozilla Thunderbird 客户端,以便通过 IMAPS 和 SMTP 提交协议发送和接收邮件,如何使用 Samba AD LDAP 服务器设置联系人数据库以及如何配置其他相关的邮件功能,例如通过 LDAP 数据库离线副本启用 Thunderbird 联系人。

安装和配置 Mozilla Thunderbird 客户端的过程适用于安装在 Windows 或 Linux 操作系统上的 Thunderbird 客户端。

要求

  1. 如何在 CentOS 7 上安装 iRedMail 集成到 Samba4 AD
  2. 如何配置和集成 iRedMail 服务到 Samba4 AD DC
  3. 将 iRedMail Roundcube 与 Samba4 AD DC 集成

第一步:为 iRedMail 服务器配置 Thunderbird

1、 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。

Thunderbird System Integration

Thunderbird 系统集成

2、 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。

在 Thunderbird 客户端尝试识别由 iRedMail 服务器提供的正确的IMAP设置后,点击手动配置按钮手动设置 Thunderbird。

Thunderbird Mail Account Setup

Thunderbird 邮箱帐户设置

3、 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置,为邮件服务添加安全端口(IMAPS 为 993,发送为 587),为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。

Thunderbird iRedMail Settings

Thunderbird iRedMail 设置

4、 由于你的 iRedMail 服务器使用自签名证书,屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常,Thunderbird 客户端应该就被成功配置了。

Thunderbird Security Exception

Thunderbird 安全异常

你会看到你的域帐号的所有已收文件,并且你能够从你的域或者其他域发送或者接收文件。

Domain Mails Inbox

域邮箱收件箱

第二步:使用 Samba AD LDAP 设置 Thunderbird 联系人数据库

5、 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories”

Thunderbird Samba AD LDAP Settings

Thunderbird Samba AD LDAP 设置

Thunderbird Composition & Addressing Settings

Thunderbird Composition & Addressing 设置

6、 LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中:

在 “常规” 选项卡上添加此对象的描述性名称,添加你的域的名称或 Samba 域控制器的 FQDN,你的域的基本 DN 形式是 “dc=你的域,dc=tld”,LDAP 端口号 389,vmail 绑定 DN 帐户用于以 vmail@your\_domain.tld 的形式查询 Samba AD LDAP 数据库。

使用下面的截图作为指导:

Directory Server Properties

目录服务器属性

7、 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容:

(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))

Add Search Filter

添加搜索过滤

让其他的设置保持默认,并点击 OK 按钮来应用更改,再次点击 OK 按钮关闭 LDAP 目录服务器窗口,在账户设置界面点击 OK 关闭窗口。

Select LDAP Directory Server

选择 LDAP 目录服务器

8、 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。

添加绑定 DN 帐户密码来查询 AD LDAP 服务器,勾选使用密码管理器记住密码,然后点击确定按钮保存更改并关闭窗口。

Thunderbird Samba AD LDAP Testing

Thunderbird Samba AD LDAP 测试

9、 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。

Search Samba AD Mail Contacts

搜索 Samba AD 邮件联系人

10、 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。

Search Mail Contacts in Thunderbird

在 Thunderbird 中搜索联系人

11、 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。

Send Mail in Thunderbird

在 Thunderbird 发送邮件

12、 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU,如下所示。

ou=your_specific_ou,dc=your_domain,dc=tld 

Search Contacts in Samba LDAP Database

Samba LDAP 数据库中搜索联系人

第三步:设置 LDAP 离线副本

13、 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。

接着切换到离线选项卡并点击“现在下载”按钮开始在本地复制 Samba AD LDAP 数据库。

Setup LDAP Offline Replica in Thunderbird

在 Thunderbird 设置 LDAP 离线副本

Download LDAP Database for Offline

为离线下载 LDAP 数据库

当同步联系人完成后,你将收到消息复制成功通知。点击 OK 并关闭所有窗口。在无法访问 Samba 域控制器的情况下,你仍然可以通过离线方式进行搜索。


作者简介:

我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。


via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/

作者:Matei Cezar 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出