jenkinsdockermysqlnginxlinux
Jenkins 使用配置
Jenkins使用教學
2026年4月7日 1 次瀏覽 haodai

*先安裝Docker和docker-compose→
1. 建構Docker Jenkins
1-1. 前置
bash
1
2
3
4
5
6
7
# 查看docker 群組,填入下方user: jenkins:999
cat /etc/group | grep docker
#創建Jenkins數據資料夾
sudo mkdir jenkins_home
sudo chown -R $USER:$GROUP jenkins_home
1-2. 創建 docker-compose.yml,紅字地方需要改
docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3.9"
services:
jenkins:
container_name: 'jenkins'
image: jenkins/jenkins:lts
restart: always
# 這裡必須跟docker在同一個組
user: jenkins:999
ports:
- "8080:8080"
# 據情況,可以不填以下兩個
- "50000:50000"
- "10051:10051"
volumes:
# 數據持久化
- /home/ubuntu/docker/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/hosts:/etc/hosts
1-3. Run docker compose
bash
1
2
docker-compose up -d
2. 設定Jenkins 瀏覽器打開 ip:8080
2-1. 查看jenkins密碼
bash
1
2
3
//查看密碼
docker exec jenkins bash -c "cat /var/jenkins_home/secrets/initialAdminPassword"
2-2. 選擇安裝推薦外掛
2-3. 建立使用者
2-4. 管理Jenkins > 管理外掛程式 > Availble plugins
plain
1
2
安裝: Nodejs 、 GitLab 、 GitLab Authentication 、



3 配置Jenkins
3-.1 新增Jenkins作業

3-2. 參數化建構 (文字參數)
container_name(容器名)、image_name(鏡像名)、port(要映射的端口)




3-3. 建置環境

3-4. 建置步驟

3-4.1. 一般vue打包的dist

bash
1
2
3
pnpm install
pnpm run build-only
3-4.2. node nestjs
專案下創建Dockerfile
docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
FROM node:lts-alpine
# 設定工作目錄
WORKDIR /app
# 複製 package.json 和 package-lock.json 至工作目錄
COPY package*.json .
COPY pnpm-lock.yaml .
# 複製所有
COPY . .
# 依照指定版本安裝依賴
RUN npm install -g pnpm
RUN npm cache clean --force
RUN pnpm install
RUN npx prisma generate
# 建立生產版本
RUN pnpm run build
ENV TZ="Asia/Taipei"
# 暴露的連接埠
EXPOSE 3005
# 啟動應用程式
# CMD ["node", "./dist/main.js"]
CMD ["pnpm", "run", "start:prod"]
.dockerignore
docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Dependency directory
# <https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git>
node_modules
.DS_Store
# node-waf configuration
.lock-wscript
# Compiled binary addons (<http://nodejs.org/api/addons.html>)
build/Release
.dockerignore
Dockerfile
*docker-compose*
# Logs
logs
*.log
# Runtime data
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
pids
*.pid
*.seed
.git
.hg
.svn
jenkins 執行shell
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/bash
# 定義變量
CONTAINER=${container_name}
# build docker image 每次構建不產生緩存
docker build --no-cache -t ${image_name} .
# 檢查是否有重名和端口佔用情況
checkDocker() {
RUNNING=$(docker inspect --format="{{ .State.Running }}" $CONTAINER 2>/dev/null)
if [ -z $RUNNING ]; then
echo "$CONTAINER does not exist."
return 1
fi
if [ "$RUNNING" == "false" ]; then
matching=$(docker ps -a --filter="name=$CONTAINER" -q | xargs)
if [ -n $matching ]; then
docker rm $matching
fi
return 2
else
echo "$CONTAINER is running."
matchingStarted=$(docker ps --filter="name=$CONTAINER" -q | xargs)
if [ -n $matchingStarted ]; then
docker stop $matchingStarted
docker rm ${container_name}
fi
fi
}
checkDocker
# 運行容器
# 依需求配置volumes -v
docker run -itd --name $CONTAINER --network haodai -v /home/haodai/upload/:/app/dist/upload/ --restart=always ${image_name}
#刪除舊的none image
docker image prune -f
#重啟nginx
docker restart nginx
3-4.3. Nuxtjs
專案下創建 ecosystem.config.js
jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module.exports = {
apps: [
{
name: 'haodai',
script: './.output/server/index.mjs',
instances: 'max', // 負載平衡模式下的 cpu 數量
exec_mode: 'cluster', // cpu 負載平衡模式
max_memory_restart: '10G', // 緩存了多少記憶體重新整理
env_prod: {
name: 'haodai_prod',
PORT: 3000, //指定伺服器上的 port
NODE_ENV: 'prod',
},
},
],
}
專案下創建 Dockerfile
docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# FROM node:lts-alpine
FROM keymetrics/pm2:18-alpine
# 設定工作目錄
WORKDIR /app
# 作者
# 複製 package.json 和 package-lock.json 至工作目錄
COPY package*.json .
COPY pnpm-lock.yaml .
# 複製所有
COPY . .
# 依照指定版本安裝依賴
RUN npm install -g pnpm
RUN npm cache clean --force
RUN pnpm install
# 建立生產版本
RUN pnpm run build
ENV TZ="Asia/Taipei"
# 暴露的連接埠
EXPOSE 3000
## 利用 PM2-runtime 來啟動 Nuxtjs service,並直接使用 env_prod 中的設定
CMD [ "pm2-runtime", "start", "ecosystem.config.js", "--env", "prod" ]
.dockerignore
docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Dependency directory
# <https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git>
node_modules
.DS_Store
dist
# node-waf configuration
.lock-wscript
# Compiled binary addons (<http://nodejs.org/api/addons.html>)
build/Release
.dockerignore
Dockerfile
*docker-compose*
# Logs
logs
*.log
# Runtime data
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
pids
*.pid
*.seed
.git
.hg
.svn
jenkins 執行shell
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
# 定義變量
CONTAINER=${container_name}
# build docker image 每次構建不產生緩存
docker build --no-cache -t ${image_name} .
# 檢查是否有重名和端口佔用情況
checkDocker() {
RUNNING=$(docker inspect --format="{{ .State.Running }}" $CONTAINER 2>/dev/null)
if [ -z $RUNNING ]; then
echo "$CONTAINER does not exist."
return 1
fi
if [ "$RUNNING" == "false" ]; then
matching=$(docker ps -a --filter="name=$CONTAINER" -q | xargs)
if [ -n $matching ]; then
docker rm $matching
fi
return 2
else
echo "$CONTAINER is running."
matchingStarted=$(docker ps --filter="name=$CONTAINER" -q | xargs)
if [ -n $matchingStarted ]; then
docker stop $matchingStarted
docker rm ${container_name}
fi
fi
}
checkDocker
# 運行容器
docker run -itd --name $CONTAINER --network haodai --restart=always ${image_name}
#刪除舊的none image
docker image prune -f
#重啟nginx
docker restart nginx
4. GitLab
4-1. 產生Token
bash
1
2
ssh-keygen -t rsa -C "<email>"
在用戶主目錄里找到.ssh目錄,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人


4-2. 新增gitlab倉庫


4-3. 設定 webhook (會產生url和token)


4-4. 設定GitLab的webhook
到專案下的setting-webhooks

設定完按Test測試

5. Github
5-1. 新增github倉庫,同4-2

5-2. 設置觸發程序

5-3. 設置github webhook

6. 構建完後發送email通知
下載模版Email Template 儲存到Jenkins目錄中,路徑為jenkins_home\\email-templates\\ 檔名 email-template.jelly 如果沒有email-templates,要自己新增資料夾
6-1. Jenkins 設定系統
6-1.1 到應用程式密碼產生email密碼
6-1.2 Credentials使用帳號加4-1.1的密碼認證

6-1.3 預設內容填入 ${JELLY_SCRIPT,template="email-template.jelly"}

6-1.4 觸發時機自行選擇

6-2. Jenkins 項目設定-建置後動作


使用ssh驗證github
進入docker jenkins
bash
1
2
3
4
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keyscan github.com >> ~/.ssh/known_hosts
進入github SSHKeys配置


進入 Jenkins Manage Credentials 新增




