Skip to content

Commit e8d279e

Browse files
committed
doc: add jenkins document.
1 parent d79b379 commit e8d279e

File tree

15 files changed

+306
-17
lines changed

15 files changed

+306
-17
lines changed

README.md

+16-7
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
- [Docker私有仓库搭建](#docker私有仓库搭建)
3737
- [`registry`](#registry)
3838
- [`Harbor`](#harbor)
39-
- [使用 Docker 实战](#使用docker实战)
39+
- [使用 Docker 实战](#使用-docker-实战)
4040
- [Docker REST API](#docker-rest-api)
4141
- [`Nginx`](#nginx)
4242
- [`MySQL`](#mysql)
@@ -239,10 +239,15 @@ docker run -t -i nginx:latest /bin/bash
239239
由于国区已经无法访问,可以将镜像打包,直接安装镜像压缩文件
240240

241241
```sh
242-
$ docker pull gitlab/gitlab-ce:17.0.1-ce.0 # 下载镜像
242+
$ docker pull gitlab/gitlab-ce:17.2.0-ce.0 # 下载镜像
243+
$ docker pull --platform linux/amd64 gitlab/gitlab-ce:17.2.0-ce.0
244+
$ docker pull --platform linux/amd64 portainer/portainer-ce:2.20.3-alpine
245+
$ docker pull --platform linux/amd64 portainer/agent:2.20.3-alpine
243246
# 保存 Docker 镜像到本地文件
244247
$ docker save -o [output-file.tar] [image-name]
245-
$ docker save -o gitlab-ce-17.0.1.tar gitlab/gitlab-ce
248+
$ docker save -o gitlab-ce.0-17.2.0.tar gitlab/gitlab-ce:17.2.0-ce.0
249+
$ docker save -o portainer-agent-2.20.3-alpine.tar portainer/agent:2.20.3-alpine
250+
$ docker save -o portainer-ce-2.20.3-alpine.tar portainer/portainer-ce:2.20.3-alpine
246251
```
247252

248253
将镜像文件发送到服务器
@@ -622,7 +627,7 @@ curl -s --unix-socket /var/run/docker.sock http://dummy/containers/json
622627
docker info
623628
```
624629

625-
## 使用Docker实战
630+
## 使用 Docker 实战
626631

627632
> ⚠文件挂载注意:docker 禁止用主机上不存在的文件挂载到 container 中已经存在的文件
628633
@@ -728,6 +733,10 @@ docker info
728733

729734
[在 docker 中部署 Navidrome](docs/navidrome.md)
730735

736+
### `Jenkins`
737+
738+
[在 docker 中部署 Jenkins](docs/jenkins/README.md)
739+
731740
### `Humpback`
732741

733742
首先创建放持久化数据文件夹,`mkdir -p /opt/app/humpback-web`,里面存放持久化数据文件,会存储站点管理和分组信息,启动后请妥善保存。
@@ -759,9 +768,9 @@ docker run -d --name seafile \
759768

760769
```shell
761770
docker run -d --name seafile \
762-
-e SEAFILE_SERVER_HOSTNAME=pan.showgold.com \
763-
-e SEAFILE_ADMIN_EMAIL=wcj@nihaosi.com \
764-
-e SEAFILE_ADMIN_PASSWORD=wcj@nihaosi.com \
771+
-e SEAFILE_SERVER_HOSTNAME=pan.example.com \
772+
-e SEAFILE_ADMIN_EMAIL=wcj@example.com \
773+
-e SEAFILE_ADMIN_PASSWORD=wcj@example.com \
765774
-v $HOME/_docker/seafile-data:/shared \
766775
-p 80:80 \
767776
seafileltd/seafile:latest

docs/gitlab/README.md

+11
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,17 @@ gitlab_rails['backup_keep_time'] = 604800
133133
docker exec 容器名或容器ID gitlab-ctl reconfigure
134134
```
135135

136+
## 备份恢复
137+
138+
```sh
139+
# 从xxxxx编号备份中恢复
140+
# 然后恢复数据,1406691018为备份文件的时间戳
141+
gitlab-rake gitlab:backup:restore BACKUP=1406691018
142+
143+
# 新版本 1721392543_2024_07_19_17.0.1_gitlab_backup.tar
144+
gitlab-rake gitlab:backup:restore BACKUP=1721392543_2024_07_19_17.0.1
145+
```
146+
136147
## 容器管理
137148

138149
```bash

docs/jenkins/Dockerfile

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
FROM --platform=linux/amd64 jenkins/jenkins:2.468-jdk21
2+
3+
# 切换到 root 用户以安装 Docker CLI
4+
USER root
5+
6+
# 安装必要的软件包
7+
RUN apt-get update && apt-get install -y \
8+
curl \
9+
gnupg2 \
10+
lsb-release \
11+
software-properties-common
12+
13+
# 安装特定版本的 Docker CLI
14+
RUN curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz | tar xzvf - --strip-components=1 -C /usr/local/bin
15+
16+
# 创建 docker 组并将 jenkins 用户添加到该组
17+
RUN groupadd docker && usermod -aG docker jenkins
18+
19+
# 切换回 jenkins 用户
20+
USER jenkins

docs/jenkins/README.md

+253
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
Jenkins
2+
===
3+
4+
下面图文示例,是通过 Docker 部署 Jenkins 并将 `Pipeline` 脚本运行在 `Docker` 中的教程,这样可以方便的使用任何版本的 `nodejs` 或者 `java` 的沙盒环境
5+
6+
## 部署 Jenkins
7+
8+
获取 Jenkins 和 Jenkins agent 镜像,上传到服务器
9+
10+
```sh
11+
# 获取 Jenkins 镜像
12+
docker pull --platform linux/amd64 jenkins/jenkins:2.468-jdk21
13+
# 保存 Docker 镜像到本地文件
14+
docker save -o jenkins-2.468-jdk21.tar jenkins/jenkins:2.468-jdk21
15+
# 上传到服务器
16+
scp -P 2222 jenkins-2.468-jdk21.tar [email protected]:/home/docker-images
17+
18+
# 获取 Jenkins agent 镜像
19+
docker pull --platform linux/amd64 jenkins/ssh-agent:jdk21
20+
docker save -o jenkins-ssh-agent-jdk21.tar jenkins/ssh-agent:jdk21
21+
scp -P 2222 jenkins-ssh-agent-jdk21.tar [email protected]:/home/docker-images
22+
```
23+
24+
创建一个 `Dockerfile`,基于 `jenkins/jenkins:2.468-jdk21` 镜像添加 Docker 支持:
25+
26+
```Dockerfile
27+
FROM --platform=linux/amd64 jenkins/jenkins:2.468-jdk21
28+
29+
# 切换到 root 用户以安装 Docker CLI
30+
USER root
31+
32+
# 安装必要的软件包
33+
RUN apt-get update && apt-get install -y \
34+
curl \
35+
gnupg2 \
36+
lsb-release \
37+
software-properties-common
38+
39+
# 安装 Docker CLI
40+
# RUN curl -fsSL https://get.docker.com | sh
41+
# 安装特定版本的 Docker CLI
42+
RUN curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz | tar xzvf - --strip-components=1 -C /usr/local/bin
43+
44+
# 创建 docker 组并将 jenkins 用户添加到该组
45+
RUN groupadd docker && usermod -aG docker jenkins
46+
47+
# 切换回 jenkins 用户
48+
USER jenkins
49+
```
50+
51+
构建 jenkins 新的镜像
52+
53+
```sh
54+
docker build --platform=linux/amd64 -t my-jenkins-docker-2468-jdk21 .
55+
# 保存 Docker 镜像为一个 tar 文件
56+
docker save -o my-jenkins-docker-2468-jdk21.tar my-jenkins-docker-2468-jdk21
57+
# 通过 SCP 传输 tar 文件到远程服务器
58+
scp -P 2222 my-jenkins-docker-2468-jdk21.tar [email protected]:/home/docker-images
59+
```
60+
61+
```yml
62+
# https://github.com/jenkinsci/docker/blob/master/README.md#docker-compose-with-jenkins
63+
services:
64+
jenkins:
65+
image: my-jenkins-docker-2468-jdk21 # 自定义镜像
66+
#image: jenkins/jenkins:2.468-jdk21
67+
ports:
68+
- "8086:8080"
69+
volumes:
70+
- jenkins_home:/var/jenkins_home
71+
# 支持 docker
72+
- /var/run/docker.sock:/var/run/docker.sock
73+
ssh-agent:
74+
image: jenkins/ssh-agent:jdk21
75+
volumes:
76+
jenkins_home:
77+
```
78+
79+
确保您与 `docker-compose.yml` 在同一个目录中。并启动 `Jenkins`:
80+
81+
```sh
82+
docker compose up -d # 启动 Jenkins
83+
docker compose down # 停止并删除与 Docker Compose 配置文件相关的所有容器、网络、卷和镜像
84+
```
85+
86+
访问 jenkins: http://152.22.3.186:8086/
87+
88+
## 1. 安装插件
89+
90+
- [Git Parameter Plug-In](https://plugins.jenkins.io/git-parameter) 支持在 CI 上自动加载仓库分支
91+
92+
## 2. 添加凭证
93+
94+
<img src="./imgs/1.png" width="620" />
95+
96+
<img src="./imgs/2.png" width="620" />
97+
98+
<img src="./imgs/3.png" width="620" />
99+
100+
<img src="./imgs/4.png" width="620" />
101+
102+
## 3. 新建工作流
103+
104+
<img src="./imgs/5.png" width="620" />
105+
106+
修改配置
107+
108+
<img src="./imgs/6.png" width="620" />
109+
110+
111+
设置 [`Git Parameter`](https://plugins.jenkins.io/git-parameter) 可以在构建的时候读取分支,选择分支
112+
113+
<img src="./imgs/7.png" width="620" />
114+
115+
<img src="./imgs/8.png" width="620" />
116+
117+
## 3. 添加构建选项,可以在构建前选择 `生产` 还是 `开发` 模式,在脚本中判断
118+
119+
<img src="./imgs/9.png" width="620" />
120+
121+
## 4. 选择 `Pipeline script from SCM` 指定脚本位置
122+
123+
<img src="./imgs/10.png" width="620" />
124+
125+
这方法是将 仓库 `config` 分支添加一个 `Jenkinsfile` 配置
126+
127+
## Nodejs
128+
129+
安装 [Docker Pipeline](https://plugins.jenkins.io/git-parameter) 插件,支持从管道中构建和使用 `Docker` 容器。
130+
131+
```sh
132+
docker pull --platform linux/amd64 node:14.16.0
133+
docker pull --platform linux/amd64 node:18
134+
docker pull --platform linux/amd64 node:20
135+
docker pull --platform linux/amd64 node:22
136+
137+
# 保存 Docker 镜像到本地文件
138+
docker save -o node14.16.tar node:14.16.0
139+
# 上传到服务器
140+
scp -P 2222 node14.16.tar [email protected]:/home/docker-images
141+
142+
docker save -o node18.tar node:18
143+
scp -P 2222 node18.tar [email protected]:/home/docker-images
144+
145+
docker save -o node20.tar node:20
146+
scp -P 2222 node20.tar [email protected]:/home/docker-images
147+
148+
docker save -o node22.tar node:22
149+
scp -P 2222 node22.tar [email protected]:/home/docker-images
150+
```
151+
152+
Pipeline 脚本中使用 Docker nodejs 20 运行
153+
154+
```groovy
155+
pipeline {
156+
//agent any
157+
// pipeline 放到 docker 中执行
158+
agent {
159+
docker {
160+
// 使用 Node.js 18 的 Docker 镜像
161+
image 'node:20'
162+
// 可选:挂载 NPM 缓存目录,加速构建
163+
args '-v /root/.npm:/root/.npm'
164+
}
165+
}
166+
environment {
167+
def git_url="http://152.22.3.186:8081/mall/h5.git"
168+
def git_auth = "12312312-f199-4b15-b087-123123"
169+
def git_branch = "${branch}"
170+
def project_env = "${project_env}"
171+
def data_dir = "/mnt/mall/h5/h5_vip"
172+
173+
// 本地需要上传的目录 以及远程服务器的目录
174+
def localDir = "${WORKSPACE}/h5_vip/test_dir/"
175+
def vip_host = '106.53.119.240'
176+
def vip_remote_dir = "/mnt/mall/h5"
177+
}
178+
stages {
179+
stage('Git Checkout'){
180+
steps {
181+
echo "🏆 WORKSPACE: 【${WORKSPACE}】"
182+
echo "🎯 branch: 【${git_branch}】"
183+
echo "🏅 project_env: 【${project_env}】"
184+
echo 'check git'
185+
checkout([
186+
$class: 'GitSCM',
187+
branches: [[name: "${git_branch}" ]],
188+
doGenerateSubmoduleConfigurations: false,
189+
extensions: [],
190+
submoduleCfg: [],
191+
userRemoteConfigs: [[
192+
credentialsId: "${git_auth}",
193+
url: "${git_url}"
194+
]]
195+
])
196+
sh 'pwd'
197+
sh 'ls -la'
198+
}
199+
}
200+
}
201+
stage('Send Files') {
202+
when {
203+
expression {
204+
currentBuild.result == null || currentBuild.result == 'SUCCESS'
205+
}
206+
}
207+
steps {
208+
sh 'pwd'
209+
script{
210+
switch (project_env) {
211+
case "vip":
212+
sh '''
213+
ls -la
214+
cd h5_vip
215+
npm install --registry=https://registry.npmmirror.com/
216+
ls -la
217+
npm run build
218+
ls -la
219+
rm -rf test_dir
220+
mv dist test_dir
221+
'''
222+
withCredentials([sshUserPrivateKey(credentialsId: 'bd6f00e6-9dfd-4fd5-b94b-7559ca212e9a', keyFileVariable: 'SSH_KEY')]) {
223+
// 连接到远程服务器并删除 test_dir 目录 重新上传
224+
sh '''
225+
ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no [email protected] "rm -rf /mnt/mall/h5/test_dir"
226+
scp -i ${SSH_KEY} -o StrictHostKeyChecking=no -P 22 -r "${localDir}" [email protected]:${vip_remote_dir}
227+
'''
228+
}
229+
break
230+
case "dev":
231+
// for (i in ['152.22.3.186']) {
232+
// data_dir = "/mnt/mall/h5/"
233+
// //sh "ssh $i 'cp -rf ${data_dir}/* ${data_dir}/h5_vip_{uuid_no}'"
234+
// sh "scp -r -o StrictHostKeyChecking=no -i /var/lib/jenkins/.ssh/id_rsa -P 22 '${WORKSPACE}/h5_vip/' '$i:${data_dir}'"
235+
// }
236+
break
237+
238+
}
239+
}
240+
}
241+
}
242+
}
243+
post {
244+
success {
245+
sh "echo 'Success success'"
246+
}
247+
248+
failure {
249+
sh "echo 'Faild faild'"
250+
}
251+
}
252+
}
253+
```

docs/jenkins/imgs/1.png

367 KB
Loading

docs/jenkins/imgs/10.png

335 KB
Loading

docs/jenkins/imgs/2.png

147 KB
Loading

docs/jenkins/imgs/3.png

170 KB
Loading

docs/jenkins/imgs/4.png

127 KB
Loading

docs/jenkins/imgs/5.png

217 KB
Loading

docs/jenkins/imgs/6.png

249 KB
Loading

docs/jenkins/imgs/7.png

200 KB
Loading

docs/jenkins/imgs/8.png

186 KB
Loading

docs/jenkins/imgs/9.png

142 KB
Loading

docs/portainer.md

+6-10
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,19 @@ curl -L https://downloads.portainer.io/ee2-18/portainer-agent-stack.yml -o porta
3030
docker stack deploy -c portainer-agent-stack.yml portainer
3131
```
3232

33-
## v1.22x
33+
## v2.20
3434

3535
新建 `portainer-agent-stack.yml` 文件, 将下面内容复制到配置文件中,你可以从官方仓库拷贝 [`portainer/portainer-compose`](https://github.com/portainer/portainer-compose) 配置。
3636

3737
```yml
3838
version: '3.2'
3939
services:
4040
agent:
41-
image: portainer/agent
42-
environment:
43-
# REQUIRED: Should be equal to the service name prefixed by "tasks." when
44-
# deployed inside an overlay network
45-
AGENT_CLUSTER_ADDR: tasks.agent
46-
# AGENT_PORT: 9001
47-
# LOG_LEVEL: debug
41+
image: portainer/agent:2.20.3-alpine
4842
volumes:
4943
- /var/run/docker.sock:/var/run/docker.sock
44+
#- ${HOME}/.orbstack/run/docker.sock:/var/run/docker.sock
5045
- /var/lib/docker/volumes:/var/lib/docker/volumes
51-
- /etc/localtime:/etc/localtime:ro
5246
networks:
5347
- agent_network
5448
deploy:
@@ -57,10 +51,12 @@ services:
5751
constraints: [node.platform.os == linux]
5852

5953
portainer:
60-
image: portainer/portainer
54+
image: portainer/portainer-ce:2.20.3-alpine
6155
command: -H tcp://tasks.agent:9001 --tlsskipverify
6256
ports:
57+
- "9443:9443"
6358
- "9000:9000"
59+
- "8000:8000"
6460
volumes:
6561
- portainer_data:/data
6662
- /etc/localtime:/etc/localtime:ro

0 commit comments

Comments
 (0)