一步步入门Jenkins+Net Core3.1+Gitlab,实现 CICD
架构说明:
由浅入深,我们暂时不考虑分布式,安装Jenkins到用户服务器进行CICD
需要两台服务器
Gitlab:192.168.232.128:12080
源代码仓库,可以参考《安装gitlab》
用户服务器:192.168.232.130,
通过Jenkins自动构建服务:1、git clone源码
2、Dockerfile编译发布生成镜像
3、shell控制更新服务
1、前期准备
1.1用户服务器:CentOS系统
安装Docker、Git环境
yum install -y docker-ce-18.06.0.ce-3.el7 #docker安装高版本,不然AS base这些命令无法使用,详细安装步骤参考《安装docker &配置dotnet core 项目》
yum install -y git
1.2创建测试项目,长传给gitlab
我的项目如下:

需要做几步操作
1)定义站点端口,比如2202
Program
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:2202");
webBuilder.UseStartup<Startup>();
});
2)添加Dockerfile

记住一点,用VS生成的Dockerfile支持文件,一定要和.sln同目录
(我就是VS生成在了MyApi/MyApi/Dockerfile,导致Docker build的时候找不到目录,然后进入无止境的修改Dockerfile内部命令的目录,最后发现只要保持和.sln同一级,就不会出错)
2、使用Jenkins之前,先进行一个简单的尝试
将源文件打包成images,并生成容器服务,只有手动执行能成功,才能为后面Jenkins执行提供保障
cd /mysoft #自己建个目录存一下
git clone http://192.168.232.128:12080/gitlab-instance-9d489b45/myapi.git
cd myapi
docker build -t myapi:V1.0 .
docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0
build的时候可能会发生不成功的情况,自己根据情况进行修正
(其实无非就是docker版本和目录的问题,严格按照上面说的做,基本没问题)
[root@localhost mysoft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a443b859a696 myapi:V1.0 "dotnet MyApi.dll" 18 minutes ago Up 18 minutes 80/tcp, 443/tcp, 0.0.0.0:2202->2202/tcp myapi-server
正常运行,尝试访问一下:

成功!!!
3、安装Jenkins
yum安装,官网步骤
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install fontconfig java-11-openjdk
yum install jenkins
默认的是8080端口,打开页面会进行初始化,
初始化完成后,先不着急安装插件,做一些配置修改吧
1)修改网络协议
Jenkins的默认插件下载源地址为:https://updates.jenkins.io/update-center.json,有可能因为https的限制,导致一些插件下载失败,
将https改成http即可
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
或者替换为国内的插件下载源地址,如
https://mirror.xmission.com/jenkins/updates/update-center.json
2)修改网络判定地址
Jenkins在下载插件之前会先检查网络,通过访问https://www.google.com来判断,防止外网访问延时,可用将其改为http://www.baidu.com
vim /var/lib/jenkins/updates/default.json
好了,回到界面,使用默认密码:登录->安装默认插件->创建用户...(最后截个图,前面的步骤忘记截图了)

4、构建我们的第一个任务吧
选择【新建Item】->

【描述】随便写
【编码管理】选择git,输入地址,添加登录账号,指定分支要保持和gitlab上的名称一致

【构建触发器】,先不填,手动触发就行
【构建环境】,勾选build之前删除工作目录

【Build Steps】
选择Execute shell
shell如下,这个很简单,主要是先简单跑起来,后面再改
echo "====开始构建===="
cd /var/lib/jenkins/workspace/myapi #clone会存在workspace下面
docker build -t myapi:V1.0 .
docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0
echo "====构建结束===="
(先把2创建容器和镜像删除掉,不然构建会冲突)
构建产生的问题:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post
原因:jenkins调用docker需要授权
[root@localhost myapi]# sudo usermod -a -G docker jenkins
[root@localhost myapi]# systemctl restart jenkins
成功!!!
5、完善shell
#!/bin/bash
echo "====开始构建===="
cd /var/lib/jenkins/workspace/myapi #clone会存在workspace下面
#删除容器
docker ps -a | grep "myapi-server"
if [ $? -eq 0 ];then
docker container stop myapi-server
docker container rm myapi-server
fi
docker build -t myapi:V1.0 .
docker run --name myapi-server -p 2202:2202 -d --restart=always myapi:V1.0
echo "====构建结束===="
echo "====删除虚悬镜像===="
docker rmi $(docker images -q -f dangling=true)
指令说明
1、#!/bin/bash:指定shell命令,需要以这个开头
2、$? :指上一条指令的执行结果,成功为0,失败为1,可用来判断是否有返回结果
3、虚悬镜像,镜像名为<none>,build的时候旧版镜像会被新版镜像替代,变成虚悬镜像
-q:精确匹配ID或者Name
-f:强制删除
dangling:虚悬的意思
6、使用jenkins进行远程服务器服务构建
6.1步骤(需要4台服务器)
使用Jenkins(232.130)从gitlab(232.128)clone源码
生成镜像并pull到Harbor(232.129),
控制目标服务器(这里懒得新建一个,就用232.128代替,记得安装好docker)pull镜像,并运行
6.2环境搭建:
1)新增Harbor服务器:192.168.232.129,参考连接
2)Jenkins服务器安装Maven:
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
sudo yum insatll -y apache-maven
3)Jenkins安装插件:Maven Integration、SSH
Maven:构建maven任务
SSH:访问远程主机
4)配置Maven环境
Global Tool Configuration最底部,输入MAVEN_HOME,切记取消自动安装
mvn -v:可用查看MAVEN_HOME
5)SSH连接服务器配置
Configure System,中间位置,找到SSH remote hosts,新增SSH到目标服务器的链接

6.3 开始构建Maven工程
新增一个Item

前面步骤同上单机部署,直到Build这一步
需要给源码新增文件pom.xml,并push到gitlab仓库

身为一名neter,真的不会Maven写pom.xml,主要是Jenkins执行的时候找不到这个文件就不会继续下去
pom.xml,留个壳就行,会报解析错误,但是不影响程序跑下去,后面再研究
<?xml version="1.0" encoding="utf-8"?>
<project></project>
好,,我们继续
Post Steps 选择 Run only if build succeeds
Add post-build - Execute shell
这一步主要是构建镜像pull到Harbor
#!/bin/bash
#环境变量
harbor='192.168.232.129:80'
myapi_path='/var/lib/jenkins/workspace/maven-myapi' #clone源码存储地址
images=${harbor}'/v5/myapi'
tag='V1.0' echo "====开始构建===="
cd ${myapi_path}
docker build -t ${images}:${tag} .
docker rmi $(docker images -q -f dangling=true)
echo "====上传镜像===="
docker login -u kxy -p Aa123456 ${harbor}
docker push ${images}:${tag}
Add post-build - Execute shell script on remote host using ssh
SSH site 选择 6.2-5),新建的128目标服务器链接
Command(粗糙写一下,能跑起来先)
#环境变量
harbor='192.168.232.129:80'
images=${harbor}'/v5/myapi'
tag='V1.0' docker login -u kxy -p Aa123456 ${harbor} docker ps -a | grep "myapi-server"
if [ $? -eq 0 ];then
docker container stop myapi-server
docker container rm myapi-server
fi docker images | grep ${images}
if [ $? -eq 0 ];then
docker rmi ${images}:${tag}
fi docker pull ${images}:${tag} docker run --name myapi-server -p 2202:2202 -d --restart=always ${images}:${tag}
完成
执行结果是成功的,但是pom.xml会返回解析错误,这个需要学习完maven再来补充
[ERROR] 'modelVersion' is missing. @ line 2, column 16
[FATAL] 'groupId' is missing. @ line 2, column 16
[FATAL] 'artifactId' is missing. @ line 2, column 16
[FATAL] 'version' is missing. @ line 2, column 16
end、碰到的一些错误记录
1)启动jenkins不成功,提示:
[root@localhost ~]# systemctl start jenkins
Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.
[root@localhost ~]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since 六 2023-02-18 20:46:51 CST; 15s ago
Process: 3566 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)
Main PID: 3566 (code=exited, status=1/FAILURE) 2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service: main process exited, code=exited, status=1/FAILURE
2月 18 20:46:51 localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server.
2月 18 20:46:51 localhost.localdomain systemd[1]: Unit jenkins.service entered failed state.
2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service failed.
2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service holdoff time over, scheduling restart.
2月 18 20:46:51 localhost.localdomain systemd[1]: Stopped Jenkins Continuous Integration Server.
2月 18 20:46:51 localhost.localdomain systemd[1]: start request repeated too quickly for jenkins.service
2月 18 20:46:51 localhost.localdomain systemd[1]: Failed to start Jenkins Continuous Integration Server.
2月 18 20:46:51 localhost.localdomain systemd[1]: Unit jenkins.service entered failed state.
2月 18 20:46:51 localhost.localdomain systemd[1]: jenkins.service failed.
通过一下命令来查看详细错误
[root@localhost init.d]# cd /etc/init.d
[root@localhost init.d]# ./jenkins start
Starting Jenkins Running with Java 8 from /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre, which is older than the minimum required version (Java 11).
Supported Java versions are: [11, 17]
See https://jenkins.io/redirect/java-support/ for more information.
[失败]
我们明明安装的java11,这地方怎么是java8?
vim /etc/init.d/jenkins #查看一下jenkins环境文件
#存在以下jdk路径配置
candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
"
jdk安装了两个版本,我们删掉一个
[root@localhost ~]# rpm -qa | grep java
java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
java-1.8.0-openjdk-devel-1.8.0.362.b08-1.el7_9.x86_64
javassist-3.16.1-10.el7.noarch
tzdata-java-2022g-1.el7.noarch
java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
javamail-1.4.6-8.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64
python-javapackages-3.4.1-11.el7.noarch
[root@localhost ~]# yum remove java-1.8.0-openjdk-devel-1.8.0.362.b08-1.el7_9.x86_64 java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64 java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64
重启成功,可用把java8的环境配置删掉了(不成功的留言沟通)
一步步入门Jenkins+Net Core3.1+Gitlab,实现 CICD的更多相关文章
- 【Devops】【docker】【CI/CD】Jenkins源代码管理 添加gitlab项目地址,报错Failed to connect to repository : Error performing command: ls-remote -h git@192.168.92.130:8090/root/swapping.git HEAD
Jenkins源代码管理 添加gitlab项目地址 报错如下: Failed to connect to repository : Error performing command: ls-remot ...
- linux中安装gitlab和cicd(断网版)
1:先介绍一下怎么查找所需要的依赖包 #yum install rpmname--downloadonly --downloaddir=/rpmpath 例如:yum install gitlab-r ...
- jenkins(1): jenkins安装以及从gitlab拉取代码
1. gitlab前面已经写过了,自己去参考 https://www.cnblogs.com/yitianyouyitian/p/9214940.html 2. jenkins安装 2.1 jdk 安 ...
- Jenkins自动化打包(Gitlab)并上传蒲公英
整个过程详见:https://www.jianshu.com/p/91e8f571fc2b 以下是遇到的问题及解决过程 一.安装homebrew(网速很慢很慢……被墙了) /usr/bin/ruby ...
- SpringBoot项目 使用Jenkins进行自动化部署 (gitLab管理项目)_
1.部署服务器创建好对应文件夹和启动脚本 创建文件夹 mkdir /wdcloud/app/rps/rps-module-category 创建启动脚本 cd /wdcloud/app/rps/rps ...
- SpringBoot项目 使用Jenkins进行自动化部署 gitlab打tag 生产测试环境使用 含配置中心
脚本 node('master') { def mvnHome = tool 'maven11-free' def gitUrl = "http://gitlab.wdcloud.cc:10 ...
- Docker DevOps实战:GitLab+Jenkins(1)- GitLab容器搭建、使用SourceTree pull/push项目
GitLab容器搭建 # 创建GitLab容器# --restart always #重启,容器自动重启# --privileged=true #容器内使用root权限 [root@localhost ...
- 一步步入门log4cpp
前言 项目实现过程中,需要检查.查找或者调试程序bug等,此时程序日志则较为清晰地展现代码的运行过程.目前接触到的方法有打印消息到控制台,将重要信息输出到某个文件比如txt文件,或者直接使用日志库. ...
- 一步步入门编写PHP扩展
1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...
- gitlab 之 cicd
1.使用 docker 安装 gitlab docker run -d --hostname gitlab \ --env GITLAB_OMNIBUS_CONFIG="ex ...
随机推荐
- 【Java面试指北】反射(1) 初识反射
如果你被问到:什么是反射?为什么需要反射.以及反射的应用?你会如何回答呢? 本篇会带大家初识反射,了解反射概念和基本应用.反射的原理以及深入源码的探究将会在后面几篇介绍. 一.什么是反射? 要理解什么 ...
- Kubernetes监控手册-01体系概述
Kubernetes 监控体系驳杂,涉及到的内容非常多,总是感觉摸不到头绪,网上虽然有很多资料,都略显凌乱,没有一个体系化的讲解,今天开始,我们准备撰写一系列文章,把 Kubernetes 监控说透, ...
- Jmeter在结果树中查看响应数据为空
今天遇到了一个比较尴尬的问题,吭哧吭哧了大半天,后来咨询了开发SO的一下解决了. 问题: 在调用接口时取样器结果中显示response code:200, response message:OK,但是 ...
- 微服务项目Git仓库自动化脚本
说明 基于微服务项目,产生的的多项目仓库管理脚本. 目录结构 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_al ...
- 痞子衡嵌入式:对比恩智浦全系列MCU(包含Kinetis/LPC/i.MXRT/MCX)的GPIO电平中断设计差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦全系列MCU(包含Kinetis, LPC, i.MXRT, MCX)的GPIO电平中断设计差异. 在痞子衡旧文 <以i.M ...
- 关于Token和Cookie做权限校验的区别及Token自动续期方案
title: 关于Token和Cookie做权限校验的区别及Token自动续期方案 categories: 后端 tags: - .NET Token和Cookie的区别 首先,要知道一些基本概念:h ...
- html内容超宽后,缩小可视区域后,会引起部分背景色宽度出现显示异常情况,解决如下:
- 详解 Gulp4 和 Gulp3 的区别
最近在开发几个网站,为了优化一下前端代码,就复习一下gulpjs,之前工作gulp用的版本比较老,但是今天看了新的版本,新的语法出了一下,但是为了时间,我决定使用之前gulp3的旧版本,后面发现自己环 ...
- ua5.4源码剖析:三. C++与Lua相互调用
概述 从本质上来看,其实说是不存在所谓的C++与lua的相互调用.lua是运行在C上的,简单来说lua的代码会被编译成字节码在被C语言的语法运行.在C++调用lua时,其实是解释运行lua文件编译出来 ...
- 使用ProPerties集合存储数据-Properties集合中的方法store
使用ProPerties集合存储数据 java.util.Properties`继承于Hashtable,来表示一个持久的属性集.它使用键值结构存储数据每个键及其对应值都是一个字符串.该类也被许多Ja ...