1. 首先确认Jenkins上安装了Git plugin, 以及Subversion plugin

Manage Jenkins -> Plugin Manager -> Available

2. 配置git命令路径

Manage Jenkins -> Global Tool Configuration, 顺便把JDK, ANT, Maven也配置了

3. 在Jenkins安装的服务器上, 创建一对rsa key, 并配置

ssh-keygen -t rsa -C "jenkins"
# 一路回车, 默认路径和文件名, 不要密码
cd ~/.ssh
mv id_rsa id_rsa_tho
mv id_rsa.pub id_rsa_tho.pub

4. 在gitlab的项目下, 点击右侧配置菜单 -> Deploy Keys, 用刚才创建的 id_rsa_tho.pub 的内容, 创建一个key, 名称为 Readonly Key for Jenkins, 如果有多个项目都需要这个私钥, 则在每个项目的deploy keys下enable这个key即可. 可以用下面的方式验证是否生效

# 以下步骤, 只是为了验证key是否有效, 实际项目中不需要这么设置
vi config
# 写入以下内容
Host 192.168.1.109
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa_tho
User milton
# 必须要修改读取权限否则ssh连接时会报错
chmod config
# 运行git命令检查一下是否有效, 如果有错, 根据提示处理
git ls-remote -h git@192.168.1.109:cc/tho.git HEAD

5. 检验: 在Jenkins中, 新建一个freestyle的项目, 点击项目 -> Source Code Management, 选择 Git, 填入gitlab中给的项目地址 git@192.168.1.109:cc/tho.git 在下面add new credential, Username:git, Private Key Enter Directly, 输入刚才创建的 id_rsa_tho 的内容, 注意这个是私钥.

6. 如果切换鼠标焦点后, 项目地址栏下方没有错误提示, 就说明Jenkins检查没错

以下是通过Pipeline Script进行部署的说明

同样需要Git Plugin插件, 还需要另外安装Pipeline, SSH Agent, 因为Publish Over SSH插件尚未支持Pipeline, 所以只能通过ssh agent自己写命令来处理, 我在项目中的script如下

node {
// Mark the code checkout 'stage'....
stage 'Checkout' sh "mkdir -p tho"
dir('thor') {
git branch: 'master', credentialsId: '29254e2e-256c-47e0-8a9a-756f16e6705a', url: 'git@192.168.10.239:cc/tho.git'
}
sh "mkdir -p tho-commons"
dir('tho-commons') {
git branch: 'master', credentialsId: '29254e2e-256c-47e0-8a9a-756f16e6705a', url: 'git@192.168.10.239:cc/tho-commons.git'
}
sh "mkdir -p thor-commons-lib"
dir('tho-commons-lib') {
git branch: 'master', credentialsId: '29254e2e-256c-47e0-8a9a-756f16e6705a', url: 'git@192.168.10.239:cc/tho-commons-lib.git'
}
sh "mkdir -p thor-commons-api"
dir('tho-commons-api') {
git branch: 'master', credentialsId: '29254e2e-256c-47e0-8a9a-756f16e6705a', url: 'git@192.168.10.239:cc/tho-commons-api.git'
}
sh "mkdir -p tho-commons-impl"
dir('tho-commons-impl') {
git branch: 'master', credentialsId: '29254e2e-256c-47e0-8a9a-756f16e6705a', url: 'git@192.168.10.239:yhc/tho-commons-impl.git'
} env.JAVA_HOME="${tool 'jdk1.8.0_45'}"
sh '$JAVA_HOME/bin/java -version'
def mvnHome = tool 'M3.3' stage 'Build'
dir('tho-commons') {
sh "${mvnHome}/bin/mvn -s /home/tomcat/files/settings.xml clean install -Dmaven.test.skip=true -Ptho_dev -e"
} sshagent(['d5058e06-4873-4f82-850b-1d5da1b80dc8']) {
sh 'ssh -p 22 tomcat@15.28.12.16 \'df -h\''
sh 'scp tho-commons-impl/target/tho-commons.war tomcat@15.28.12.16:/home/tomcat/ant_build/'
} }

非标准端口的git地址, 可以用

sh "mkdir -p tho-commons"
dir('tho-commons') {
git branch: 'master', credentialsId: '201e0d5b-27b5-46dc-9a1a-920859fd6952', url: 'ssh://git@1.2.3.4:6022/cc/tho-commons.git'
}

这个脚本完成了导出代码, 编译, 部署, 执行的工作. 里面需要的前提条件:
1. git里面的credentialID对应credential里添加过的私钥, 其公钥配置在gitlab的deploy keys里.
2. sshagent里面的credentialID对应在Credential里面添加过私钥, 其公钥配置在15.28.12.16的tomcat用户下
3. M3.3对应的Maven, jdk1.8.0_45对应的JDK1.8, ss
4. Maven用到的settings.xml文件

配置使用密钥文件登录
使用密钥文件代替普通的简单密码认证也会极大的提高安全性:

[dir@username ~]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //默认路径,回车
Enter passphrase (empty for no passphrase): //输入你的密钥短语,登录时使用
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
3e:fd:fc:e5:d3:22:86:8e:2c:4b:a7:3d:92:18:9f:64 root@ibpak.tp-link.net
The key's randomart image is:
+--[ RSA 2048]----+
| |

| o++o..oo..o|
+-----------------+

将公钥重命名为authorized_key:

$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

下载私钥文件 id_rsa 到本地(为了更加容易识别,可重命名为id_rsa_hostname_username),保存到安全的地方。以后 username 用户登录这台主机就必须使用这个私钥,配合密码短语来登录(不再使用 username 用户自身的密码)
另外还要修改/etc/ssh/sshd_config文件
打开注释

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

我们要求 username 用户(可以切换到其他用户,特别是root)必须使用ssh密钥文件登录,而其他普通用户可以直接密码登录。因此还需在sshd_config文件最后加入:

Match User itsection
PasswordAuthentication no

重启sshd服务后生效

常出现的问题:

1. 源主机和目标主机上, 对应用户下的.ssh目录和私钥/公钥文件权限不正确, 都应当为600 or 700, 不是这个权限的系统会忽略. 具体的错误, 可以通过客户端的 ssh -v 方式, 以及服务端的 /var/log/secure 日志查看原因.

2. 虽然可以直接把ssh的private key 配到jenkins, 但是还是需要手工在ssh命令行下, 将private key配到 .ssh目录下, 然后手工 ssh 登录一次, 因为第一次登录会弹出接受RSA key的提示, 回答yes后, 用jenkins登就没问题了

Update 2019-06-27: 在Jenkins 2.176.1上测试, 以上说法有误. 不需要将key配置到.ssh, 只需要在命令行下ssh用密码登录一次即可. 目的也是为了接收RSA key

RSA key fingerprint is xx:b7:d5:c0:1d:d4:d4:f3:ee:8a:5d:xx:ee:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.11]:39922' (RSA) to the list of known hosts.

否则在jenkins中会出现这个错误提示

debug1: checking without port identifier
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.

配置Jenkins使用Gitlab的代码库进行构建的更多相关文章

  1. jenkins实现以gitlab为代码仓库的构建

    简介 前一篇随笔是安装jenkins的过程,比较简单,这一次说一下用jenkins配置以gitlab为代码管理仓库的maven项目的完整个构建过程,以及我碰到的一些问题.由于是maven项目,所以我们 ...

  2. 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚

    1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...

  3. Windows Server配置Jenkins,实现监测SVN提交自动构建.net4.5的项目

    1,持续集成 概念:http://baike.baidu.com/view/5253255.htm,对于大多数人而言,自动构建/自动测试/自动部署,已经很发挥它的价值了.选择上: 推荐jenkins, ...

  4. 通过jenkins给gitlab某代码路径打tag的方式

    1.构建后设置里的git publisher插件 https://blog.csdn.net/workdsz/article/details/77931812 2.通过gitlab api接口来 ht ...

  5. Jenkins+maven+gitlab自动化部署之前端构建发布(六)

    前端项目构建,需要在jenkins主机部署node服务,网上有说介绍说安装对应的nodejs插件进行前端项目构建,我这里是直接调用系统npm命令,进行前端打包.具体node部署参考:Centos7部署 ...

  6. Gitlab源码库里代码提交后,如何触发jenkins自动构建?

    版本库里代码提交后,如何触发jenkins自动构建?这是一个面试题,感觉自己回答的并不好,因为并没有用过这个功能,之前公司实际项目用的是svn版本管理,一般都用立刻构建,和定时任务构建(不管代码是否有 ...

  7. jenkins +gitlab 自动化代码秒级上线

    一,配置脚本 #!/bin/bash #目标服务器IP地址 host=$ #job名称 job_name=$ #包名 name=web-$(date +)) #打包 cd /var/lib/jenki ...

  8. Jenkins + Gitlab + Ansible--playbook 代码上线流程(文末有免费视频)

      jenkins 构建是支持 git 选择分支 安装 Git Parameter 插件在系统管理中的插件管理 然后点击选插件,在右上角输入 Git Parameter,找到 Git Paramete ...

  9. jenkins集成gitlab

     一.配置jenkins 1.安装Gitlab Hook Plugin )生成随机token 在系统中生成 openssl rand -hex 0f2a47c861133916d2e299e3 )创建 ...

随机推荐

  1. 使用block进行界面之间的反向传值

    目标:在两个独立的控制器的界面之间进行反向传值 关键技术:block 代码编写及运行环境:Xcode6.4 / 模拟器8.4 语言:Objective-C 注:使用纯代码实现,不使用xib/story ...

  2. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  3. 转载 CSS3 经典教程系列:CSS3 盒阴影(box-shadow)详解

    目标大纲 文章转载 CSS3 经典教程系列:CSS3 盒阴影(box-shadow)详解 IE中CSS-filter滤镜小知识大全 CSS实现跨浏览器兼容性的盒阴影效果

  4. CSS属性简写

    盒模型简写: 如果top.right.bottom.left的值相同,如下面代码:margin:10px 10px 10px 10px; 缩写为:margin:10px; 如果top和bottom值相 ...

  5. SharePoint暂时禁用事件触发

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...

  6. SDWebImage添加header

    title: SDWebImage添加headerdate: 2016-03-07 17:32:57tags: SDWebImagecategories: IOS keywords: SDWebIma ...

  7. iOS 用 SDWebImage 清理图片缓存

    效果图如下: 1.找到 SDWebImage找到SDImageCache类 2.添加如下方法 - (float)checkTmpSize { ; NSDirectoryEnumerator *file ...

  8. SSDT旧版本对于xml数据的处理BUG

    在早期版本中,CLR中声明sqlxml时,SSDT会将CLR函数中使用的类型解析为NVARCHAR(4000),最终导致传向CLR函数的数据不完整              

  9. js自动完成

    源代码来自于: http://down.51cto.com/data/921955  我做了一下修改. 要做一个自动完成的功能,又不想依赖一大堆的js脚本库,我要的是定制的,代码尽可能简洁,方便修改和 ...

  10. Cannot execute as the database principal because the principal "guest" does not exist, this type of principal cannot be impersonated, or you do not have permission.

    今天遇到这样一个问题:一个系统的作业需要给系统Support人员开放SQL Agent下作业的查看.执行权限.数据库版本为SQL Server 2014 SP2,给这个系统Support人员的NT账号 ...