Fork me on GitHub

如何在Ubuntu 18.04上安装Jenkins

原文地址: How To Install Jenkins on Ubuntu 18.04

通过google翻译翻译的文章,翻译不太准确

介绍

Jenkins是一个开源自动化服务器,可以自动执行持续集成和交付软件所涉及的重复技术任务。Jenkins是基于Java的,可以从Ubuntu软件包安装,也可以通过下载和运行其Web应用程序存档(WAR)文件来安装 - 该文件是构成在服务器上运行的完整Web应用程序的文件集合。

在本教程中,您将通过添加其Debian软件包存储库来安装Jenkins,并使用该存储库来安装软件包apt

先决条件

要学习本教程,您需要:

第1步 - 安装Jenkins

默认Ubuntu软件包中包含的Jenkins版本通常位于项目本身的最新可用版本之后。要利用最新的修补程序和功能,您可以使用项目维护的软件包来安装Jenkins。

首先,将存储库密钥添加到系统:

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

添加密钥后,系统将返回OK。接下来,将Debian软件包存储库地址附加到服务器的sources.list

1
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

当这两个都到位时,运行update以便apt使用新的存储库:

1
sudo apt update

最后,安装Jenkins及其依赖项:

1
sudo apt install jenkins

既然Jenkins及其依赖项已经到位,我们将启动Jenkins服务器。

第2步 - 启动詹金斯

让我们开始使用Jenkins systemctl

1
sudo systemctl start jenkins

由于systemctl不显示输出,您可以使用其status命令来验证Jenkins是否已成功启动:

1
sudo systemctl status jenkins

如果一切顺利,输出的开头应该显示服务处于活动状态并配置为在启动时启动:

1
2
3
4
5
6
Output● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Mon 2018-07-09 17:22:08 UTC; 6min ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 1153)
CGroup: /system.slice/jenkins.service

现在Jenkins正在运行,让我们调整防火墙规则,以便我们可以从Web浏览器访问它以完成初始设置。

第3步 - 打开防火墙

默认情况下,Jenkins在端口上运行8080,所以让我们使用ufw以下命令打开该端口:

1
sudo ufw allow 8080

检查ufw状态以确认新规则:

1
sudo ufw status

您将看到允许流量8080从任何地方移植:

1
2
3
4
5
6
7
8
OutputStatus: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
8080 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
8080 (v6) ALLOW Anywhere (v6)

注意:如果防火墙处于非活动状态,则以下命令将允许OpenSSH并启用防火墙:

1
2
sudo ufw allow OpenSSH
sudo ufw enable

安装Jenkins并配置防火墙后,我们可以完成初始设置。

第4步 - 设置Jenkins

要设置安装,请8080使用您的服务器域名或IP地址访问Jenkins的默认端口:http://your_server_ip_or_domain:8080

您应该看到Unlock Jenkins屏幕,它显示初始密码的位置:

解锁Jenkins屏幕

在终端窗口中,使用cat命令显示密码:

1
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

从终端复制32个字符的字母数字密码并将其粘贴到管理员密码字段中,然后单击继续

下一个屏幕显示安装建议插件或选择特定插件的选项:

自定义Jenkins屏幕

我们将单击Install suggested plugins选项,它将立即开始安装过程:

Jenkins入门安装插件屏幕

安装完成后,系统将提示您设置第一个管理用户。可以跳过此步骤并继续admin使用我们上面使用的初始密码,但我们会花一点时间来创建用户。

注意:默认的Jenkins服务器未加密,因此使用此表单提交的数据不受保护。当您准备好使用此安装时,请按照指南如何在Ubuntu 18.04上使用Nginx反向代理配置Jenkins和SSL。这将保护用户凭据和有关通过Web界面传输的构建的信息。

Jenkins创建第一个管理员用户屏幕

输入用户的名称和密码:

詹金斯创建用户

您将看到一个“ 实例配置”页面,该页面将要求您确认Jenkins实例的首选URL。确认服务器的域名或服务器的IP地址:

Jenkins实例配置

确认相应信息后,单击“ 保存并完成”。您将看到一个确认页面,确认“Jenkins准备就绪!”

詹金斯准备好了屏幕

单击使用Jenkins开始访问主Jenkins仪表板:

欢迎来到Jenkins Screen

此时,您已成功完成Jenkins的安装。

结论

在本教程中,您使用项目提供的软件包安装了Jenkins,启动了服务器,打开了防火墙并创建了管理用户。此时,您可以开始探索Jenkins了。

完成探索后,如果您决定继续使用Jenkins,请按照指南如何在Ubuntu 18.04上使用Nginx反向代理配置Jenkins SSL来保护您的密码,以及任何敏感系统或产品信息。以纯文本形式在您的计算机和服务器之间发送。

《代码整洁之道-程序员的职业素养》读书笔记

豆瓣地址: https://book.douban.com/subject/26919457/

第1章 专业主义 7

1.1 清楚你要什么 8

专业主义不但象征着荣誉与骄傲,而且明确意味着责任与义务。

1.2 担当责任 8

不要忽视测试环节

1.3 首先,不行损害之事 10

1.3.1 不要破坏软件功能 10

  1. 让 QA 找不出任何问题
  2. 要确信代码正常运行
  3. 自动化 QA

1.3.2 不要破坏结构 12

如果你希望自己的软件灵活可变,那就应该时常修改它。

1.4 职业道德 13

每周拿出20小时,看书、练习、学习,或者其他能提升职业能力的事情。

1.4.1 了解你的领域 14

专业开发人员必须精通的事项:

  • 设计模式
  • 设计原则: 面向对象,组件设计原则
  • 方法: 必须理解 XP、Scrum、精益、看板、瀑布、结构化分析及结构化设计等。
  • 实践: 测试驱动开发、面向对象设计、结构化编程、持续集成和结对编程
  • 工件: 必须了解如何使用 UML图、DFD图、结构图、Petri 网络图、状态迁移图表

1.4.2 坚持学习 16

坚持广泛学习才能不至于落伍,java程序员就去学学ruby

1.4.3 练习 16

1.4.4 合作 17

1.4.5 辅导 17

1.4.6 了解业务领域 17

1.4.7 与雇主/客户保持一致 18

1.4.8 谦逊 18

第2章 说“不” 19

能就是能,不能就是不能,不要说,’试试看’。—— 尤达

2.1 对抗角色 21
2.2 高风险时刻 24
2.3 要有团队精神 25
2.3.1 试试看 26
2.3.2 消极对抗 28
2.4 说“是”的成本 30
2.5 如何写出好代码 35

面试官:为什么 MySQL 索引要使用 B+树而不是其它树形结构?比如 B 树?

作者:李平

https://www.cnblogs.com/leefreeman/p/8315844.html?from=singlemessage&isappinstalled=0

原文地址: https://mp.weixin.qq.com/s/NGjJzYGT64uiuwtsR3QKyQ

因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出)

指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

B+树在叶子节点存放数据,查找速度快除了树的层数不高之外,还有,叶子节点维持了一个链表,查询时相当于顺序查找这个链表。更重要的是,查询时的对磁盘的IO操作不仅仅查询了这个数据所在块的信息,也将这个块附近的块也加进来了,这样下次查询时,就不用再次IO,变相加快了查询速度。

ARTS-2

ARTS是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。

1
2
3
4
5
6
7
Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。

Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。

Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。

Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。

Algorithm(算法)

参考文章和视频:

https://www.youtube.com/watch?v=_Zt6gwWRnHM

https://leetcode-cn.com/problems/clone-graph/solution/dfs-he-bfs-by-powcai/

https://www.youtube.com/watch?v=MOCCC_B3kNg

Leetcode 133 克隆图

这道题就是遍历整个图,所以遍历时候要记录已经访问点, 我们用一个字典记录

所以,遍历方法就有两种

思路一:DFS(深度遍历)

思路二:BFS(广度遍历)

方法一:DFS(深度遍历)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Solution {

// 定义一个辅助hash表,用于存储原节点和拷贝节点的映射关系
private Map<Node, Node> lookup = new HashMap<>();

public Node cloneGraph(Node node) {
// 如果node节点本身为null,直接返回null。
if (node == null) return null;
// 如果相邻节点存在于Hash表中,把相应的相邻节点取出,作为当前节点的相邻节点
if (lookup.containsKey(node)) return lookup.get(node);
// 克隆节点
Node clone = new Node(node.val, new ArrayList<>());
// 原结点和映射关系存储到hash表
lookup.put(node, clone);
// 处理相邻节点,dfs(n,lookup)进行深度优先处理,克隆后的Node加到neighbors
for (Node n : node.neighbors) clone.neighbors.add(cloneGraph(n));
// 最后返回拷贝节点
return clone;
}
}

方法一:BFS(广度遍历)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Solution {

/*
map 存储原节点和复制节点的关系
queue 存储节点
*/
public Node cloneGraph(Node node) {
// 如果node节点本身为null,直接返回null。
if (node == null) return null;
// 定义HashMap用于查找复制的node
Map<Node, Node> lookup = new HashMap<>();
// 复制的node
Node clone = new Node(node.val, new ArrayList<>());
// 存储原节点和克隆节点的映射关系
lookup.put(node, clone);
Deque<Node> queue = new LinkedList<>();
queue.offer(node);
while (!queue.isEmpty()) {
Node tmp = queue.poll();
for (Node n : tmp.neighbors) {
// map里面有从map里取出, 没有就put到map中去
if (!lookup.containsKey(n)) {
lookup.put(n, new Node(n.val, new ArrayList<>()));
// node存入queue
queue.offer(n);
}
// 给tmp的neighbors添加克隆节点
lookup.get(tmp).neighbors.add(lookup.get(n));
}
}
// 返回克隆节点
return clone;
}
}

Review(点评)

5个软件开发人员的不良习惯

  1. 没有代码结构和代码风格
  2. 盲目复制粘贴代码
  3. 晚上熬夜
  4. 缺乏文档
  5. 编写代码而不进行测试

Tip(技巧)

Intellij Idea 导入多个maven项目展示在右侧栏Maven Projects

Share(分享)

算法教学视频推荐

熵:宇宙的终极规则

原文作者: 阮一峰

原文地址: http://www.ruanyifeng.com/survivor/future/entropy.html

如果不施加外力影响,事物永远向着更混乱的状态发展

没有办法消除熵和混乱,我们只是让某些局部变得更有秩序,把混乱转移到另一些领域。

个人理解

  1. 唯有通过不断学习,注入能量,才能保持发展
  2. 让局部有序,比如专精某一领域,让自己成为某个领域的专家;把混乱转移到另一些领域,比如专精编程,不去精通物理、化学等,就是将混乱转移。

1、

有人曾经问我:“成年后,有没有书籍改变过你的世界观?”

我想了想,还真有这样的书。那时,我已经工作好几年了,偶然在图书馆翻到一本旧书《熵:一种新的世界观》(上海译文出版社,1987)。

那本书是科普著作,介绍物理学概念“熵”。中学毕业后,我再没有碰过物理学,但是没想到读完以后,我看待世界的眼光都变了。

“熵”这个概念非常简单,很容易理解,但又异常强大,可以解释很多事情。这篇文章,我就来谈谈,为什么你应该懂得熵是什么,它可能也会改变你的世界观。

2、

为了理解熵,必须讲一点物理学。

19世纪,物理学家开始认识到,世界的动力是能量,并且提出“能量守恒定律”,即能量的总和是不变的。但是,有一个现象让他们很困惑。

(上图的单摆,在两侧的最高点,势能最大,动能为零;在中间的低点,动能最大,势能为零,能量始终守恒。)

物理学家发现,能量无法百分百地转换。比如,蒸汽机使用的是热能,将其转换为推动机器的机械能。这个过程中,总是有一些热能损耗掉,无法完全转变为机械能。

一开始,物理学家以为是技术水平不高导致的,但后来发现,技术再进步,也无法将能量损耗降到零。他们就将那些在能量转换过程中浪费掉的、无法再利用的能量称为熵。

后来,这个概念被总结成了“热力学第二定律”:能量转换总是会产生熵,如果是封闭系统,所有能量最终都会变成熵。

3、

熵既然是能量,为什么无法利用?它又是怎么产生的?为什么所有能量最后都会变成熵?这些问题我想了很久。

物理学家有很多种解释,有一种我觉得最容易懂:能量转换的时候,大部分能量会转换成预先设定的状态,比如热能变成机械能、电能变成光能。但是,就像细胞突变那样,还有一部分能量会生成新的状态。这部分能量就是熵,由于状态不同,所以很难利用,除非外部注入新的能量,专门处理熵。

(上图,能量转换过程中,创造出许多新状态。)

总之,能量转换会创造出新的状态,熵就是进入这些状态的能量。

4、

现在请大家思考:状态多意味着什么?

状态多,就是可能性多,表示比较混乱;状态少,就是可能性少,相对来说就比较有秩序。因此,上面结论的另一种表达是:能量转换会让系统的混乱度增加,熵就是系统的混乱度。

(上图中,熵低则混乱度低,熵高则混乱度高。)

转换的能量越大,创造出来的新状态就会越多。高能量系统不如低能量系统稳定,不仅因为前者更容易发生能量转换,还因为在转化过程中会创造出更多的状态(即更多的熵)。而且,凡是运动的系统都会有能量转换,热力学第二定律就是在说,所有封闭系统最终都会趋向混乱度最大的状态,除非外部注入能量。

(上图中,冰块是分子的有序排列,吸收能量后,变成液体水,分子排列变得无序。)

5、

熵让我理解了一件事,如果不施加外力影响,事物永远向着更混乱的状态发展。比如,房间如果没人打扫,只会越来越乱,不可能越来越干净。

阅读更多...

写代码注意了,打死都不要用 User 这个单词

原文:http://t.cn/Eau2d0h

译文:http://21cto.com/article/2093

当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上。

现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。

今天,我要告诉你的是一个经常犯的错误,一个会给你带来无穷无尽的问题的单词,那就是“users”。

这个单词有两个最基本的错误:

1、对你的需求来说 “User” 几乎从来都不是一个好的描述。

2、“User” 会导致一个基本的设计安全缺陷。

“user” 的概念是模糊不清的,使用更精准的术语几乎总是能起到更好的效果。

你没有使用者

最开始,没有任何一个软件系统真的有使用者存在。乍一看“user”是一个好的描述,但是你稍微一想就会意识到你的业务逻辑实际上比这要复杂的多。

我会使用三个例子,从一个极端的情况出发。

机票预订系统没有“users”

我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:

  • 旅客可以使用预定记录码通过网站查看预定信息。
  • 购买者可以通过信用卡号后四位数在网站上修改预订信息。
  • 旅行社可以查看和修改他们的预订。
  • 航空公司的值机人员可以根据角色和航空公司来查看和修改预订信息,这需要旅客提供身份信息。

不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。

“user”这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。

Unix 没有 “users”

我们看一个不太一样的例子。Unix (这些天被称为POSIX)有用户,他们可以登录并执行代码。这样看起来很不错吧?我们深入看一下。

如果我们把所有都当作“users”的话,我们将会有:使用终端或者图形界面登录的人

  • 像邮件或者web服务器这种系统服务也会以“users”的身份运行,例如nginx可以以httpd用户运行。
  • 在服务器上经常会有多人共享一个管理员账号用来SSH登录(例如,亚马逊的Ubuntu虚拟机默认SSH账号就是‘ubuntu’)
  • root 身份,和上面其他身份都不同。

上面四个是几乎不同的概念,但是在POSIX上他们都是 “users”. 一会儿我们就会看到,把这些概念都称为‘user’会导致很多安全问题。

在操作上,因为POSIX的用户模型边界存在,我们甚至不能找到一种方式说“只能让 Alice 和 Bob 通过这个账号登录”。

阅读更多...

在阿里做了五年技术主管,我有话想说

原文地址:

背景

互联网公司的技术团队管理通常分为2个方向:技术管理和团队管理,互联网公司的技术TL与传统软件公司的PM还是有很大的区别,传统软件公司的PM更多注重于对项目的管理包括项目任务拆解、项目进度以及风险等。对于多数互联网公司而言,技术TL更多的职责不再局限于项目角度,而是对业务与技术都要有深入的了解,就像黑夜里的灯塔,能够引导和修正团队成员前进的航向。综合技术和业务角度去深度思考问题,具备一定的前瞻性,并在技术领域投入持续的学习热情,向团队成员传道,补齐短板,提高整个团队的战斗力。

技术TL职责不仅需要制定日常规范,包括开发规范、流程规范等,推动规范的落地,以公有的强制约定来避免不必要的内耗,另外一多半的时间可能花在了开发任务分解分配、开发实践、技术架构评审、代码审核和风险识别上,剩余的时间则花在为了保障系统按时交付所需的各种计划、协作、沟通、管理上。

管理大师彼得·德鲁克说:“组织的目的,就是让平凡的人做出不平凡的事。”然而,不是任何一群平凡的人聚集到一起,都能做出不平凡的事。甚至一群优秀的人聚集到一起,也可能只是一个平庸的组织。大到一个国家,小到一个团队,任何一个卓越的组织,都必须有一个卓越的领导者。领导者是一个组织的灵魂,领导者在很大程度上决定了组织所能达到的高度。

阿里有句土话“平凡人、非凡事”,技术团队同样如此,管理者的战略眼光、管理方法、人格魅力等,都会给团队的工作结果带来决定性的影响。

其实每个公司、每个团队的背景不太一样,从管理学的角度探讨一些问题,没有统一标准的答案,本文中一些观点仅是个人观点,更多从我个人成长为技术TL一些观点理念,同时我也是吸取了前辈们一些优秀的管理理念,包括我最为尊敬的通用电气CEO杰克·韦尔奇、苹果CEO乔布斯、Intel CEO格鲁夫,国内我最推崇的技术管理者robbin(丁香园的技术副总裁)。

团队建设

从2014年开始带这块业务技术团队,至今有5个年头。回想起来,团队管理中所有能遇上的问题都遇到过了,其中的磕磕绊绊数不胜数,完全是在实践当中吸取教训,团队建设这块在这里和大家简单分享一下,当然这里面也有做得不够好的地方。

在阿里每个人都能感受到拥抱变化,基本上每年组织架构都会调整,甚至有些团队每半年都会调整一次。14年我也算是被分配到这个团队负责这块业务,这块业务是集团收购一家子公司的业务,整个团队文化和技术体系与阿里有很大的差异化。一般来说新官上任三把火,新的技术TL空降之后往往会大肆招人,快速推进改革,而且有些技术TL喜欢把原来的一些旧将搬进来。

当时我没有急于这么去做,没有招过一个新员工,而是立足于稳定现有的团队,主要基于以下原因:

  • 团队和业务了解不够深:对于目前的团队的人员以及业务,我不够了解,不清楚这里面有哪些坑和陷阱,一旦初战不利,领导的信任度被透支,在公司恐怕难有立足之地,更不用谈论改造团队,发挥自己的才能了。

  • 流程与制度:针对团队现状存在的一些问题,我初步判断并不是人的问题,很多问题是一些组织、流程、制度上的问题。我认为只有好的制度才能造就好的团队,在没有解决现有团队的痼疾之前招聘新人,不但不会带来新的生产力,反而会造成团队的混乱,应该先打下一个好的根基,再招人,才能事半功倍。

  • 团队安全感:不想让团队现有的成员感觉一朝天子一朝臣,担心自己在团队中会被边缘化,成为弃儿。另外一方面能够让现有团队心理比较安全,可以安心地好好工作,不至于发生更多的动荡。

经过了几个月的摸底了解,大概清楚当时团队存在的一些问题和原因:

  • 业务配合不规范:产品、运营、研发部门之间配合没有建立合理的工作流程,比如对于产品需求的PRD评审没有标准,对于运营需求没有量化指标,大家都是疲于奔命做需求,导致大家的积极性不够高。

  • 跨团队协作混乱:跨部门之间的工作配合毫无规范可言,部门之间相互推诿,随便什么业务人员都会随时给研发人员下命令,长此以往,伤害了研发团队的积极性。

针对以上问题,我主要把协作流程规范梳理了一番,制定了相对合理、规范的产品合作流程,同产品同学约法三章,明确了PRD输出的标准和规范,运营的业务需求也统一由产品输出,杜绝一句话需求。同产品、前端、UED、QA团队的协作统一标准流程,下游对上游依赖方输出的工作必须有明确的标准规范,口头说的统统无效,拒绝合作。

针对跨团队协作乱的情况,我特别想说明一下,由于研发部门不是直接创造收入的业务部门,而是承担业务部门的服务者角色。作为一个服务者,往往站在一个被动和弱势的位置上,很容易被业务人员举着收入的大棒指挥你无条件的服从。业务部门人员随便指派任务,随意变更需求,团队同学无所适从。这样一来,部门内部无论怎样合理的计划都会被外部的力量轻易打破,让团队同学无所适从,导致大家的工作积极性不高,喜欢互相推卸责任。久而久之,员工就产生了自我保护意识,凡工作尽量往后退,凡责任尽量往别处推,不求有功但求无过。

为打破员工养成的这种自我封闭的保护意识,鼓励员工更加积极主动做事情,我能够做的就是把这些责任都扛在自己身上,亲自去协调每项工作,让团队成员没有后顾之忧,让团队同学相信我可以搞定他们担心的事情,出了任何问题我可以来背锅,给自己的团队创造一个相对宽松和自由的工作空间,保护团队不被外部的各种杂事伤害到。

团队管理

人往往会高估自己而低估别人,很多管理者都会觉得手下交上来的工作做得不够完美,这里考虑不周那里做的啰嗦,但很多时候你只是看到了他人不擅长的地方,或者只是对方和你的出发点不同给出了不同的解决方案而已。很多时候,我们并不如自己想象的那么强。管理者在充分理解一些管理的理念之后,不断地在实际的管理工作中去实践并收集反馈和迭代,这样才能够形成自己的管理风格,并找到最适合当前团队的管理方法。

阅读更多...
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信