返回文章列表
jenkinsdockermysqlnginxlinux

Jenkins 使用配置

Jenkins使用教學

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

*先安裝Docker和docker-compose→

Dockerdocker-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 新增