Docker+GitLab+Jenkins

Last updated on 9 months ago

前言

大概意图:Docker+GitLab+Jenkins 自动部署 Dot Net Core Web Application

大概意图

思路

主要容器

GitLab

Gitlab

镜像下载

1
docker pull gitlab/gitlab-ce

或者 导入本地镜像

1
docker load < /root/dockerimage/xxxx.tar

运行

1
2
3
4
docker run -d  -p 443:443 -p 8888:80 -p 222:22 --name gitlab --restart always \
-v /root/gitlab/config:/etc/gitlab \
-v /root/gitlab/logs:/var/log/gitlab \
-v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

添加秘钥

1
ssh-keygen -t rsa -C 'xxx@xxx.com'

Jenkins

Jenkins

Windows 安装

JDK

安装 JDK 1.8 jdk-8u321-windows-x64.exe

安装完成之后设置环境变量

系统变量

image-20220125134818266

image-20220125134838645

1
2
3
4
5
JAVA_HOME
C:\Program Files\Java\jdk1.8.0_321

CLASSPATH
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

用户变量

image-20220125135007369

image-20220125135030637

1
2
3
Path
%JAVA_HOME%\bin\
%JAVA_HOME%\jre\bin\

下载 war

jenkins.war:下载 https://mirrors.huaweicloud.com/jenkins/war/2.269/

运行

image-20220125135345995

1
2
cd D:\jenkins
java -jar jenkins.war

image-20220125135452362

image-20220125135709149

image-20220125135728614

Linux 安装

镜像下载

1
docker pull jenkins/jenkins

运行镜像

1
docker run -u root -d -p 8080:8080 -p 50000:50000 -v /root/jenkins_data/DockerData:/var/jenkins_home -v /root/jenkins_data/docker.sock:/var/run/docker.sock jenkins/jenkins --restart always

问题1

Please wait while Jenkins is getting ready to work …

1
2
3
4
5
6
# 打开
hudson.model.UpdateCenter.xml #这个就是挂载的root/jenkins_data/Dockerdata里
#
http://updates.jenkins-io/update-center.json
# 改成 清华大学镜像地址
http://mirror.xmission.com/jenkins/updates/update-center.json

问题2

容器内执行apt-get update 总超时,需要添加源

1
2
3
4
# 将容器内的配置文件导出来
docker cp elegant_neumann:"/etc/apt/sources.list" /root/jenkins_config/
# 将修改好的配置文件覆盖到容器中
docker cp "/root/jenkins_config/sources.list" elegant_neumann:"/etc/apt/sources.list"

问题3

更新源后会报错:NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32

1
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5 3B4FE6ACC0B21F32

然后添加ping apt install iputils-ping

问题4

因为要在Jenkins中运行 DotNet 5.0 Web,所以需要在Jenkins容器内有 dotnet 5.0 SDK,这个问题会体现在构建的时候。

这涉及到通过Dockerfile 创建镜像,这里需要创建一个携带dotnet5.0 SDKjenkins镜像

参考地址:.NET 5 + Docker Jenkins,做自动化部署,全Docker环境

1
2
3
4
5
6
7
8
9
10
11
12
13
# 封装Jenkins镜像(带有dotnet环境的) sdk=5.1
FROM jenkins/jenkins:lts
USER root
WORKDIR /dotnet
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz
RUN tar zxf dotnet.tar.gz -C ./
RUN rm -rf dotnet.tar.gz
ENV PATH="${PATH}:/dotnet:/var/jenkins_home/.dotnet/tools"
ENV DOTNET_ROOT="/dotnet"
RUN apt update -y
RUN apt install icu-devtools vim zip unzip -y
RUN usermod -a -G root jenkins
USER jenkins
1
2
3
4
5
6
7
8
9
10
11
12
13
命令解释
1.这个Docker镜像基于jenkins
2.设置当前用户为root,因为后面安装需要使用root
3.设置当前工作目录为dotnet
4.下载dotnet SDK包,保存为dotnet.tar.gz。这里要注意下载正确版本的SDK,可前往微软官方网站获取下载链接:https://dotnet.microsoft.com/download
5.解压dotnet SDK到当前目录,即/dotnet目录
6.删除dotnet SDK
7.把dotnet目录和dotnet tools目录添加到环境变量PATH,这样就可以使用dotnet命令了
8.设置DOTNET_ROOT变量
9.更新源
10.安装一些必需的,常用的工具包,其中icu-devtools是运行dotnet需要的
11.修改jenkins用户到root附加组
12.设置当前用户为jenkins
1
2
3
构建镜像 name=jenkins:dotnet
docker build -t jenkins:dotnet .
很简单的将包含dotnet环境的jenkins安装好了

问题5

容器内想安装别的就会用到 wget

1
2
3
apt-get update  
apt-get install wget
wget --version

问题6

构建携带dotnet 5环境的Jenkins镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 封装Jenkins镜像(带有dotnet环境的) sdk=5.1
FROM jenkins/jenkins:latest
USER root
WORKDIR /dotnet
RUN echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" > /etc/apt/sources.list
RUN apt-get update --fix-missing && apt-get install -y wget --fix-missing
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz
RUN tar zxf dotnet.tar.gz -C ./
RUN rm -rf dotnet.tar.gz
ENV PATH="${PATH}:/dotnet:/var/jenkins_home/.dotnet/tools"
ENV DOTNET_ROOT="/dotnet"
RUN apt update -y
RUN apt install icu-devtools vim zip unzip -y
RUN usermod -a -G root jenkins
USER jenkins
1
docker run --name dotnetjenkins  --restart always -u root -d -p 8080:8080 -p 50000:50000 -v /root/jenkins_data/DockerData:/var/jenkins_home -v /root/jenkins_data/docker.sock:/var/run/docker.sock jenkins:dotnet

Registry

image-20220127143255440

私有仓库服务

1
docker pull registry:2.7.1
1
2
3
4
5
6
docker run -d \
-p 5001:5000 \
--restart=always \
--name registry \
-v /root/data/docker-registry:/var/lib/registry \
registry:2.7.1

访问: http://192.168.137.5:5001/v2/

image-20220126205651174

Push

1
2
3
4
# 将hello-world 重新复制命名为 192.168.137.5:5001/hello-world
docker tag hello-world 192.168.137.5:5001/hello-world

# 执行 docker push 192.168.137.5:5001/hello-world 就会提交到私有仓库

问题1

Get "https://192.168.137.5:5001/v2/": http: server gave HTTP response to HTTPS client

此问题的原因是由于 Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。

想要解决此问题,执行了两个方案,执行到第二种方才好使

第一种:

1
2
3
4
5
6
7
8
9
10
11
vim /etc/docker/daemon.json
# 添加 "insecure-registries": ["192.168.137.5:5001"]
{
"insecure-registries": ["192.168.137.5:5001"],"registry-mirrors": ["https://i6*****.mirror.aliyuncs.com"]
}
# 重启 daemom
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
# 重启容器
docker start $(docker ps -aq)

第二种:

1
vim /usr/lib/systemd/system/docker.service

image-20220126214929695

1
2
3
4
5
6
7
# 在ExecStart 这行后面添加 --insecure-registry 192.168.137.5:5001  也就是在Docker启动的时候添加参数
# 重启 daemom
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
# 重启容器
docker start $(docker ps -aq)

问题解决

1
2
3
4
5
6
7
8
9
10
11
root@microservicevm:~# curl -XGET http://192.168.137.5:5001/v2/_catalog
{"repositories":[]}

root@microservicevm:/# docker push 192.168.137.5:5001/hello-world
Using default tag: latest
The push refers to repository [192.168.137.5:5001/hello-world]
e07ee1baac5f: Pushed
latest: digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 size: 525

root@microservicevm:/# curl -XGET http://192.168.137.5:5001/v2/_catalog
{"repositories":["hello-world"]}

Harbor

Net 5 + GitLab + Jenkins

Net 5

根据此处的Dockerfile,创建携带.net 5.0 环境的Jenkins容器

创建

配置

net5.0

测试代码

Jenkins

系统管理-系统配置

配置GitLab账号信息

源码管理

构建触发器

点击高级获取Secret token

构建

设置凭证

GitLab

将测试代码上传到Gitlab

webhooks 设置网址和令牌

测试

GitPush-构建

控制台信息


Docker+GitLab+Jenkins
http://example.com/2022/01/20/jenkins/
Author
Harris
Posted on
January 20, 2022
Licensed under