Jenkins+Docker+Git实现自动化部署
安装Git
yum update
yum install -y git
git生成SSH Key
[root@iZwz925p95hhdeZ Document]# git config --global user.name "zzt"
[root@iZwz925p95hhdeZ Document]# git config --global user.email "xxxxxx@qq.com"
[root@iZwz925p95hhdeZ Document]# ssh-keygen -t rsa -C "xxxxxx@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BzQkCx5nZTBY4JrjXQ9hPtEDbTYLR/XXTCK8ZoKOAnE xxxxxx@qq.com
The key's randomart image is:
+---[RSA 3072]----+
| o+OOB.... . .|
| ..E==*O. ... = |
| =.+.B.= ... o|
| = = o.. +. |
| . + . *S .+ |
| . o . o. |
| . |
| |
| |
+----[SHA256]-----+
[root@iZwz925p95hhdeZ secrets]# cd /root/.ssh
[root@iZwz925p95hhdeZ .ssh]# ll
total 8
-rw------- 1 root root 0 Jun 28 13:44 authorized_keys
-rw------- 1 root root 2602 Aug 3 14:45 id_rsa
-rw-r--r-- 1 root root 570 Aug 3 14:45 id_rsa.pub
#id_rsa里存的是私钥,id_rsa.pub里存的是公钥
将公钥添加到github项目里。私钥添加到Jenkins配置中,后面会讲到。
路径:setting->SSH and GPG keys->New SSH key
安装Jenkins
这里使用Docker来安装Jenkins,也可以直接安装到Linux中。
注意拉取jenkins/jenkins镜像而不是jenkins,Jenkins官方最新镜像现在已改为jenkins/jenkins的了
docker pull jenkins/jenkins:lts
创建Jenkins工作目录和配置访问权限
mkdir /usr/local/jenkins
chown 777 /usr/local/Jenkins
chown 777 /var/run/docker.sock
运行Jenkins
docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
#参数说明
参数解释:
#-p 8080:8080 -p 50000:50000 --映射jenkins端口
#--name jenkins --容器名称自己命名
#privileged=true --授予容器管理员权限
#-v /usr/local/jenkins:/var/jenkins_home --映射jenkins目录
#-v /usr/bin/docker:/bin/docker --映射docke目录 到时候需要在容器里执行docker命令
#-v /var/run/docker.sock:/var/run/docker.sock --映射docker执行命令 到时候需要容器里执行docker命令
#运行后用docker ps查看是否正常运行
运行起来后在浏览器直接输入IP:8080即可访问Jenkins
配置Jenkins
首次登录需要密码。
密码存放路径图中有提示,但由于我们是用Docker安装的,所以我们的密码存放在映射的目录下。
插件安装
登录进去以后这里默认选择推荐的插件。安装完全后有可能会有一些安装失败的,直接选择跳过,然后根据提示创建用户,不创建下次登录还是用之前的密码。进入主界面->系统管理->插件管理->高级->升级站点,将https改为http,完成后重启Jenkins再在可选插件里面搜索想要的插件安装。Git plugin需要安装,其他的看情况。
修改时区
将Jenkins时区设置为北京时间
打开Jenkins主页 ->【系统管理】->【脚本命令行】运行下面的命令
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
新建任务
源码管理选择Git
将Git的私钥填入凭据中。
脚步如下:
#!/bin/bash
# 获取版本号
Githash=`git rev-parse --short HEAD`
docker stop demo
docker rm demo
echo --------------Building Docker Image-------------
echo $Githash
docker build -t demo:$Githash .
docker tag demo:$Githash demo:latest
echo --------------Launching Container---------------
docker run --name demo -d -p 80:80 demo:latest
设置完成后点击保存就完成了新建任务。
构建项目
点击立即构建,蓝色代表成功,失败可以查看控制台输出查看原因。
构建成功后可以在docker容器中查看是否已经运行。
踩坑系列
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
解决方案:
查看docker.sock是否具有访问权限,没有则添加访问权限。
ERROR: Timeout after 10 minutes
解决方案:
1.提高网络带宽。
2.设置浅克隆。
3.Dockerfire配置有需要依赖镜像的可以先提前在docker中拉取下来。
ERROR: Error cloning remote repo ‘origin’
解决方案:
1.检查git是否有拉取项目的权限。
2.检查项目地址是否正确。
dockerfile 中执行过慢导致超时
解决方案:
Dockerfire配置有需要依赖镜像的可以先提前在docker中拉取下来,例如“FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base”执行太慢,则在docker中直接拉取,有可能docker拉取也会很慢,这时需要使用国内镜像去拉取,详情参考:https://github.com/newbe36524/Newbe.McrMirror
dockerfile内容
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WebAPI/WebAPI.csproj", "WebAPI/"]
COPY ["Common/Common.csproj", "Common/"]
RUN dotnet restore "WebAPI/WebAPI.csproj"
COPY . .
WORKDIR "/src/WebAPI"
RUN dotnet build "WebAPI.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebAPI.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebAPI.dll"]