自动化部署之Gitlab+Jenkins+Docker
总结自动发布流程: Gitlab+Jenkins+Docker
一般部署方式:
1.外挂方式: 就是将实际的代码挂载到宿主机上,docker中提供程序运行的环境, 这样的话只需要更新对应的代码就够了,不用频繁的构建镜像
2.宿主机或者gitlab服务器上编译打包: 一般会在目标机器上进行镜像的打包与服务器的启动
3.私服: 使用中心服务,例如使用harbor搭建私服提供镜像仓库, 这样只需要在一台服务器上打包镜像并push到仓库中,在目标机器上就可以远程拉取镜像并重启服务了
一般情况下: 对于小型项目一般使用1,2 对于较多服务的情况下 一般都会使用私服的方式进行服务部署
这里就是使用私服的方式
前端项目:
# 初始化vue项目
vue init webpack
# 启动本地服务
npm run dev
# 访问localhost:8080验证
Dockerfile文件:
FROM nginx MAINTAINER LX COPY default.conf /etc/nginx/conf.d/ COPY dist/ /usr/share/nginx/html/
nginx配置文件:
server { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
打包镜像并上传:
# 登录私服 docker login harbor.com -u lanlang # 打包镜像 docker build -t harbor.com/web/demo:latest . # 镜像推送 docker push harbor.com/web/demo:latest
目标机器执行拉取并服务重启:
# 登录私服 docker login harbor.com -u lanlang # 拉取镜像 docker pull harbor.com/web/demo.latest # 重启服务 docker-compose -f /opt/demo/docker-compose.yml up -d web
docker-compose.yml文件:
version: '3' services: web: image: harbor.com/web/demo:latest container_name: demo ports: - 8080:80
Gitlab:
触发器webhooks:
设置好之后, 可以进行测试,具体可以查看webhook日志
Jenkins:
发布流程:
1)代码提交到代码仓库,
2)仓库触发构建hook,即Jenkins的发布任务,
3)jenkins会进行打包编译,镜像上传
4)远程服务器执行服务更新操作(拉取镜像, 重启服务)
Nodejs编译前端代码:
1)安装nodejs插件
2. 添加插件build name 并重启,用于Build Name and Description Setter(构建名称和描述设置器)
3)全局变量中配置Nodejs环境变量
来到主页,以自定义的方式创建新任务
自定义git分支的变量名
自定义所发布环境的变量名
构建环境
选择执行ssh执行远程命令:
npm cache clean --force rm -rf node_modules rm -rf package-lock.json npm install --force --registry=https://registry.npm.taobao.org --unsafe-perm npm run build # 删除历史镜像 cur_img=$(docker images | grep harbor.com/web/demo:latest | awk '{print $3}') if [ -z "$cur_img" ] then echo "\$cur_img is empty" else echo "\$cur_img is NOT empty" docker rmi --force $cur_img fi # 构建镜像 docker build . -t harbor.com/web/demo:latest # 登录镜像仓库 echo "密码" | docker login harbor.com -u "xxx" --password-stdin # 推送镜像 docker push harbor.com/web/demo:latest
执行远程脚本:
需要安装Publish over SSH插件
1)安装该插件
2)系统配置 > SSH Servers中配置
3)任务中添加构建步骤:
jenkins远程执行脚本时,所有的路径必须是绝对路径,相对路径是不行的,且需要同步远程服务器的环境变量。所以,将启动命令改成如下即可:
source /etc/profile
bash -xe /data/sh/auction.sh
[基于gitlab触发实现自动发布]
1.安装gitlab插件
2.项目中配置触发器
Allowed branches : Allow all branches to trigger this job #允许所有分支触发此作业 Filter branches by name #按名称过滤分支 Include :dev #允许触发构建的分支,dev 分支提交会自动构建 Exclude:master #排除触发构建的分支,此时 master 分支提交不会自动构建 Filter branches by regex #通过正则表达式过滤分支 Source Branch Regex: #源分支正则表达式 Target Branch Regex:.*dev #目标分支正则表达式,允许触发构建的 dev 分支 Filter merge request by label #按标签过滤合并请求 Include: #允许触发构建的标签 Exclude: #排除触发自动构建的标签
可以根据需要设置触发的分支
常见问题:
1.
docker启动jenkins 报错Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
这是由于权限不足导致, 本身是jenkins用户, 操作docker一般是root有权限, 我们可以将他加入docker用户组中即可
# 查看原有docker的用足和所属组 ll /var/run/docker.sock 记录组ID # 追加组 gpasswd -a jenkins docker # 重启jenkins systemctl restart jenkins
注意点: 修改完成之后, 一定要重新启动服务, 否则错误还在!!!
2.jenkins SSH: Failed to get hostname
需要带上远程服务器的环境变量
source /etc/profile
3.
Jenkins构建ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]
执行发生了错误, 这个时候可以打开终端输出的部分, 这样方便定位问题
更多参考:
- https://blog.51cto.com/u_12574283/5014776