早在两年前,记录过一篇hudson的部署项目的笔记。
在实际的应用中,随着项目的增加才逐渐感觉到通过之前的界面方式,通过一步步的配置去完成项目的自动部署是多么麻烦的事情。
特别是对于采用maven的聚合工程来管理的项目,在配置时就显得更为复杂繁琐了。当修改某一配置变化时,(如所需要部署的服务器IP变化)需要配过配置一个一个的进行配置,繁琐这点显得尤为突出。
我想hudson(jenkins)的作者应该也想到了这一点,为了解决这一问题,在jenkins2.0中,他们就推出了pipeline的功能,可以让开发者通过groovy部署脚本来完成项目的整个部署。在使用了几次后,感觉确实挺方便的。
环境:
linux ubuntu
以下是我的体验时的主要步聚:
安装jenkins
设置国内阿里云源地址
vim /etc/apt/sources.list
#deb包
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# 源码
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# Canonical 合作伙伴和附加
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main
再:sudo apt-get update
安装jenkins
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
此操作会在系统上创建一个名为jenkins的用户
执行完成后,netstat -antp一下,看是否jenkins的默认8080端口是否启动起来了
简单配置
输入管理员密码:
root@ubuntu:~# cat /var/lib/jenkins/secrets/initialAdminPassword
7a5d5156d27c430985a55f6a71e47de7
root@ubuntu:~#
配好后,出现了如下问题:
提示:This Jenkins instance appears to be offline.
root@ubuntu:~# find / -name "hudson.model.UpdateCenter.xml"
find: 鈥run/user/1000/gvfs鈥 Permission denied
/var/lib/jenkins/hudson.model.UpdateCenter.xml
root@ubuntu:~# vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.0' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins.io/update-center.json</url>
</site>
</sites>
先找到配置,再将https的修改为http
再重启:
service jenkins restart
让输入密码,但我还没有设置密码
于是只能找重置的办法了
admin密码重置
先找到jenkins的配置文件
仍然是find一把
root@ubuntu:/# find / -name "jenkins"
/run/jenkins
find: ‘/run/user/1000/gvfs’: Permission denied
/etc/logrotate.d/jenkins
/etc/default/jenkins
/etc/init.d/jenkins
/var/lib/jenkins
/var/cache/jenkins
/var/log/jenkins
/usr/share/jenkins
从结果中,看到了/etc/default/jenkins
这个文件为jenkins的默认配置文件,于是打开看一下吧
# defaults for Jenkins automation server
# pulled in from the init script; makes things easier.
NAME=jenkins
# location of java
JAVA=/usr/bin/java
# arguments to pass to java
# Allow graphs etc. to work even when an X server is present
JAVA_ARGS="-Djava.awt.headless=true"
#JAVA_ARGS="-Xmx256m"
# make jenkins listen on IPv4 address
#JAVA_ARGS="-Djava.net.preferIPv4Stack=true"
PIDFILE=/var/run/$NAME/$NAME.pid
# user and group to be invoked as (default to jenkins)
JENKINS_USER=$NAME
JENKINS_GROUP=$NAME
# location of the jenkins war file
JENKINS_WAR=/usr/share/$NAME/$NAME.war
# jenkins home location
JENKINS_HOME=/var/lib/$NAME
# set this to false if you don't want Jenkins to run by itself
# in this set up, you are expected to provide a servlet container
# to host jenkins.
RUN_STANDALONE=true
# log location. this may be a syslog facility.priority
JENKINS_LOG=/var/log/$NAME/$NAME.log
#JENKINS_LOG=daemon.info
# OS LIMITS SETUP
# comment this out to observe /etc/security/limits.conf
# this is on by default because http://github.com/jenkinsci/jenkins/commit/2fb288474e980d0e7ff9c4a3b768874835a3e92e
# reported that Ubuntu's PAM configuration doesn't include pam_limits.so, and as a result the # of file
# descriptors are forced to 1024 regardless of /etc/security/limits.conf
MAXOPENFILES=8192
# set the umask to control permission bits of files that Jenkins creates.
# 027 makes files read-only for group and inaccessible for others, which some security sensitive users
# might consider benefitial, especially if Jenkins runs in a box that's used for multiple purposes.
# Beware that 027 permission would interfere with sudo scripts that run on the master (JENKINS-25065.)
#
# Note also that the particularly sensitive part of $JENKINS_HOME (such as credentials) are always
# written without 'others' access. So the umask values only affect job configuration, build records,
# that sort of things.
#
# If commented out, the value from the OS is inherited, which is normally 022 (as of Ubuntu 12.04,
# by default umask comes from pam_umask(8) and /etc/login.defs
# UMASK=027
# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8080
# servlet context, important if you want to use apache proxying
由此可得知道,jenkins的目录为/var/lib/jenkins
找到admin的目录:
/var/lib/jenkins/users/admin
找到把<passwordHash>节点的内容(图中黑色的那一串)换成#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS
换为111111
再次重启,后登录, admin 111111
之后找到【系统设置】,进入【插件安装】
安装一些必要的插件,pipline和maven
待插件安装完成
部署项目
创建pipline项目
选择pipline(流水线)
我这里创建了一个GITHUB上的项目,JAVA_ONLINE_IDE https://github.com/puhaiyang/onlineJavaIde
再选择Pipeline Syntax,因为我对pipline的语法不熟悉,就用它来生成
在piplineSyntax中选择克隆代码,先把代码down下来,输入git的地址,再点击生成按钮即可
生成后,代码拷贝到pipline 代码框中,为了查看下是否成功了,保存后,点击立即构建
如构建成功,则会将代码down到jenkins的workspace目录下
如我这里的此目录下:/var/lib/jenkins/workspace/JAVA_ONLINE_IDE
我测试时的脚本代码如下:
https://github.com/puhaiyang/onlineJavaIde/blob/master/deploy/DeployToAliyun.groovy
/**
* @author: haiyangp
* @date: 2017/12/17
* desc: 将项目部署到阿里云服务器脚本
*/
node {
def HOST_PWD = "your_host_password,eg:123456"
def HOST_USERNAME = "your_host_user,eg:root"
def HOST_NAME = "your_host_name,eg:192.168.1.103"
stage('get clone') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], gitTool: 'Default', submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/puhaiyang/onlineJavaIde.git']]])
}
stage('mvn test') {
withMaven(maven: 'M3') {
sh "mvn test"
}
}
stage('mvn install') {
withMaven(maven: 'M3') {
sh "mvn install"
}
}
stage('depoly') {
sh 'sshpass -p ' + HOST_PWD + ' ssh -o StrictHostKeyChecking=no ' + HOST_USERNAME + '@' + HOST_NAME + ' ls'
sh 'sshpass -p ' + HOST_PWD + ' scp -o StrictHostKeyChecking=no target/*.jar ' + HOST_USERNAME + '@' + HOST_NAME + ':.'
echo 'haha'
}
// -p:指定ssh的密码
// -o StrictHostKeyChecking=no 避免第一次登录出现公钥检查。也就是避免出现
stage('restart') {
timeout(time: 1, unit: 'DAYS') {
input message: 'Approve deployment?', submitter: 'it-ops'
}
}
}