CI:Continuous integration,持续集成。
CD:Continuous deployment,持续部署。
其实就可以理解为了DevOps开发兼运维的效果。
GitLab官方:https://about.gitlab.com/
1. 前提:准备一个6G服务器。
2. 配置镜像:
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash
3. 开始安装:
sudo EXTERNAL_URL="http://192.168.43.241" yum install -y gitlab-jh
按照上面就可以搭建出一个GitLab服务器来。
GitLab Docker镜像:https://docs.gitlab.cn/jh/install/docker.html
前提:
uname -r
命令可查看系统内核版本1. 更新yum源。
yum update
2. 安装依赖 和 添加镜像。
# 安装第三方包,不执行这一步,下一步的阿里镜像无法配置的!
yum install -y yum-utils device-mapper-persistent-data lvm2
# 国外镜像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里镜像
https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 查看源中可使用版本
# docker-ce是社区版本。
yum list docker-ce --showduplicates | sort -r
# docker-io 是以前早期的版本,版本号是 1.*,最新版是 1.13,而 docker-ce 是新的版本,分为社区版 docker-ce 和企业版 docker-ee,版本号是 17.* ,最新版是 17.12。
4. 安装指定版本
yum install docker
5. 配置开机启动项
systemctl start docker
systemctl enable docker
docker version
这样docker环境搭建完成。
1. 添加容器
docker run --detach \
--hostname 192.168.44.103 \
--publish 443:443 --publish 80:80 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
2. 启动容器
docker start gitlab
3. 查看已存在的容器
docker ps -a
4. 进入容器
docker exec -it gitlab /bin/bash
5. 访问
http://192.168.44.101
6. 当首次运行出现502错误的时候排查两个原因
1. 虚拟机内存至少需要4g
2. 稍微再等等刷新一下可能就好了
7. 获取管理员账号登录
cat /etc/gitlab/initial_root_password
1.创建一个maven任务。
3. Maven配置
4. Root POM配置。
javahome配置(可选):
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
jdk
/etc/alternatives/jre_openjdk
source /etc/profile 立即生效
问题: 报错找不到jdk?
默认yum安装java的时候会显示安装的是openjdk1.8 实则实际上只安装了jre
yum install -y java-devel
完成以上内容:就实现了git远程仓库拉取代码,maven构建构建出项目jar包
。
第一步:安装一个插件:Publish Over SSH。
通过Publish Over SSH 可以根据ssh进行一个文件传送实现。
首先,准备一台测试服务器(建议使用docker)。
在系统配置中,进行配置服务器。
解释一下执行命令的操作:
nohup java -jar /root/dev/demo*.jar >mylog.log 2>&1 &
# >mylog.log的作用:将日志导入mylog.log中。
# 2>&1的作用,如下:
# 数据流重定向:
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>
\> 覆盖写
\>> 追加写
可以配置一个脚本,从而杀死之前运行的进程:
#!/bin/bash
#删除历史数据
rm -rf xxoo
appname=$1
#获取传入的参数
echo "arg:$1"
#获取正在运行的jar包pid
# awk '{printf $2}'的作用:获取第2个数据,也就是进程id
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
echo $pid
#如果pid为空,提示一下,否则,执行kill命令
#使用-z 做空值判断
if [ -z $pid ];
then
echo "$appname not started"
else
kill -9 $pid
echo "$appname stoping...."
check=`ps -ef | grep -w $pid | grep java`
if [ -z $check ];
then
echo "$appname pid:$pid is stop"
else
echo "$appname stop failed"
fi
fi
Jenkins cron表达式的 定时构建:
标准cron官方地址:https://crontab.guru
Jenkins cron不是标准的cron表达式
第一个 * 表示每个小时的第几分钟,取值0~59
H * * * *
H:每小时执行一次
第二颗 * 表示小时,取值0~23
* 15 * * * 表示每天下午3点
* 1 * * * 表示每天凌晨1点
第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * * 表示每月5日凌晨1点
第四颗 * 表示第几月,取值1~12
* 15 5 1 * 表示每年几月执行
第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日
“/”
表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟
“H”
hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间
意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * *
,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *
,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。
H的值也可以设置范围
H * * * *
表示一小时内的任意时间
*/10 * * * *
每10分钟
H/10 * * * *
每10分钟,可能是7,17,27,起始时间hash,步长不变
45 3 * * 1-6
每个周一至周六,凌晨3点45 执行1次
45 3-5 * * 1-6
每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次
H(40-48) 3-5 * * 1-6
在40~48之间取值 其他同上
45 3-5/2 * * 1-6
每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次
45 0-6/2 * * 1-6 * * 1-6
0点开始,每间隔2小时执行一次 0:45、2:45、4:45
使用Poll SCM 方式与Build periodically一样,也是用的cron表达式操作。
会主动定期检查代码托管服务器上是否有变化,一旦发生变化执行job构建
使用163免费邮箱发送邮件时注意密码填认证码,也就是发送手机短信后给的那个,不要用登录邮箱的密码。
类似下面。。
KDWJUWEQBWYOYGDC
进入163网易邮箱开启一个POP3/SMTP服务:获取到密钥。
**需要去系统配置里面配置Location 、邮件通知、Extended E-mail Notification。*
第一种方式:通过docker外挂目录
docker run -d -p 8080:8080 --name demo-out -v /root/jarfile/demo-1-0.0.1-SNAPSHOT.jar:/app.jar openjdk:11 java -jar app.jar
第二种方式:docker容器打包。
第三种方式:docker镜像创建,之后再容器打包。
集群化构建可以有效提升构建效率,尤其是团队项目比较多或是子项目比较多的时候,可以并发在多台机器上执行构建。
流水线既能作为任务的本身,也能作为Jenkinsfile
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。
完整语法:
pipeline:整条流水线
agent:指定执行器
stages:所有阶段
stage:某一阶段,可有多个
steps:阶段内的每一步,可执行命令
项目任务的pipeline中执行自动化构建如下:
pipeline {
agent any
tools {
maven 'maven3.8.7'
}
stages {
stage('git操作') {
steps {
echo 'git操作'
git 'https://gitee.com/itholmes/demo-server.git'
}
}
stage('maven build') {
steps {
echo 'mvn操作'
sh 'mvn clean package'
}
}
stage('delete file'){
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf *
docker stop demo-project-pipeline
docker rm demo-project-pipeline
docker rmi demo-project-pipeline ''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '/root')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
stage('send file'){
steps {
echo '发送jar和Dockerfile'
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'demo-project-pipeline/jarfile', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: '**/demo-server*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd demo-project-pipeline/
docker build -t demo-project-pipeline .
docker run -d -p 12346:12345 --name demo-project-pipeline demo-project-pipeline''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'demo-project-pipeline/', remoteDirectorySDF: false, removePrefix: 'Docker/', sourceFiles: '**/Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
两种方式:第一种可以直接配置在Jenkins ,第二种也可以远程走Jenkins。
blue ocean可视化界面:
流水线完成后可执行的任务
声明式流水线:
好处
坏处
脚本式流水线:
好处
坏处