jenkins + gitee实现CICD
1. 前提准备
- linux服务器
- 服务器安装好docker
2. 安装jenkins
2.1 拉取镜像
jenkins/jenkins Tags | Docker Hub
版本越高越好,不然有的jenkins插件用不了
docker pull jenkins/jenkins:2.505
下载不下来怎么办?
镜像加速,以阿里云为例:配置镜像加速器_容器镜像服务(ACR)-阿里云帮助中心
还不行,本地开代理下载,上传到服务器
# 本地下载 docker pull jenkins/jenkins:2.505 docker save jenkins/jenkins:2.505 > jenkins-2.505.tar # 服务器 docker load < jenkins-2.505.tar docker images | grep jenkins/jenkins
2.2 运行容器
# 挂载目录
mkdir -p /usr/local/jenkins
chmod 777 /usr/local/jenkins
# 运行容器 映射到8099端口了 记得修改防火墙和服务器安全组 容器名字是 myjenkins
docker run -d -p 8099:8080 -p 50099:50000 \
-v /usr/local/jenkins:/var/jenkins_home \
--name myjenkins \
jenkins/jenkins:2.505
# 查看是否运行成功
docker ps
# 查看日志
docker logs -f myjenkins
出现上面这条是运行起来了,现在打开ip:8099就会显示要输入管理员初始密码。
这个时候可以不着急下一步操作,先配置镜像加速,不然下载插件太慢
vim /usr/local/jenkins/hudson.model.UpdateCenter.xml
修改为:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.huaweicloud.com/jenkins/updates/update-center.json</url>
</site>
</sites>
然后重启服务
docker stop myjenkins
docker start myjenkins
2.3 其他配置
上面的页面让查看/var/jenkins_home/secrets/initialAdminPassword,实际上容器的/var/jenkins_home对应服务器的/usr/local/jenkins,所以需要查看/usr/local/jenkins/secrets/initialAdminPassword
cat /usr/local/jenkins/secrets/initialAdminPassword
登录进去要等待一会...下载插件还需要一段时间...
创建一个root账户:
注意:页面显示重启jenkins后,如果直接无法访问了,需要检查容器是不是停了,如果停了,在服务器启动容器。
docker start myjenkins
如果页面出现403:换个网络试试/参考jenkins报错403的解决方案-腾讯云开发者社区-腾讯云
其他的配置参考链接完成以下:Jenkins + Gitee 实现代码自动化构建 (超级详细)-腾讯云开发者社区-腾讯云
- 配置gitee的令牌
- 配置好仓库webhook
- 编写shell/其他命令(视情况而定)
如果push代码到gitee仓库,也设置好了webhook,还是无法自动触发构建?
使用通用触发插件,参考:jenkins使用gitee插件自动部署webhook404问题记录_jenkins gitee 插件-CSDN博客
一个项目一个token
2.4 需要注意
- 我打算把所有的项目都放到/service文件夹下,为了使容器内部的改动可以同步到服务器环境中,还需要另外挂载目录。不像我这样配置也可以,jenkins有默认的
/var/jenkins_home/workspace目录,你可以使用那个目录对应的容器外目录。
# 挂载目录
mkdir -p /service
chmod 777 /service
sudo chown -R 1000:1000 /service
docker run -d -p 8099:8080 -p 50099:50000 \
-v /usr/local/jenkins:/var/jenkins_home \
-v /service:/service \
--name myjenkins \
jenkins/jenkins:2.505
2. 因为是容器部署的jenkins,那么在执行shell时,会默认在容器内的环境执行。但是预期是在宿主机运行服务,所以需要下载插件Publish Over SSH,单独进行ssh配置:
- 如果没有使用jenkins默认的目录,而是像我一样单独用了一个目录。一开始写好shell直接构建会报错,因为原本的文件夹是空的,没有初始化git,在shell中直接编写
git pull会出错。先git clone/git pull一下。
这不是唯一的方案,你可以写好dockerfile使用容器运行服务,也可以不通过容器部署jenkins,直接在宿主机部署jenkins(见下方:另一种实现方案)。
3. 几个例子
下面是几个例子,其他项目也可以参考实现
3.1 GO项目
以GO项目为例,通过jenkins自动构建和部署go的后端
可能出错的地方:配置文件的位置
步骤:
-
下载相关插件GO,
系统管理->全局工具配置设置好go的环境。可以设置国内镜像,从官网下可能连接不上,下载好了,但是构建过程中显示找不到,就是环境变量没设置,需要到系统管理->系统配置设置环境变量;也可以直接在shell中export,如下面的图片 -
设置好gitee令牌、webhook等,参考上面的链接
-
配置好go environment(在项目的配置中)
-
编写shell 高级配置,需要配置ssh:例如我这里已经做了挂载目录了,所以容器内的文件变化会自动映射到容器外,在容器内设置好GO的环境,进行
go build,build好的exe文件已经在宿主机上了。再在ssh那里运行文件,开启服务。用nohup保护进程,如果服务没有正常启动,可以查看日志。
3.2 前端项目
- 目前的情况:在本地打包前端项目,打包好上传到服务器,用
nginx进行转发。其他的静态资源也是直接上传服务器,配置好nginx文件,重启nginx - 预期:niginx配置文件也写到gitee仓库,每次新增静态资源/修改前端代码,修改配置文件,push代码,根据这个配置文件,开启前端服务。
步骤:
-
和上面类似的,装好nodejs和npm的环境
-
设置好gitee令牌、webhook等
-
编写shell
打包前端项目,现在打包好的dist文件在根目录下
目前的nginx conf文件如下,我将其余的静态资源放到other,
/指向打包完成的dist目录编写ssh执行命令,重启nginx
另一种实现方案
war包直接运行
参考:Centos7下安装配置最新版本Jenkins(2.452.3) - 人艰不拆_zmc - 博客园
启动命令:
-Dhudson.util.ProcessTree.disable=true 一定一定要开启! 不然jenkins shell执行完,会杀死关联进程,服务进程也会被杀死
nohup java -Dhudson.util.ProcessTree.disable=true -jar /usr/local/jenkins.war --httpPort=8082 > /log/jenkins.log 2>&1 &
war包路径:/usr/local/jenkins.war
日志路径:/log/jenkins.log
查看相关进程:
ps -ef | grep jenkins
多分支流水线的使用
预期:push不同的分支,实施不同的部署流程。
多分支流水线的实现流程:
-
编写Jenkinsfile(需要使用
def branchName = env.GIT_BRANCH,根据不同的分支执行不同的部署流程) -
配置环境变量
-
调试jenkisfile直到顺利构建
-
使用
multibranch webhook trigger触发器,和generic webhook一样,需要在gitee做好配置:Multibranch Scan Webhook Trigger | Jenkins plugin