技术归档文章随笔一句话导航搜索关于

使用 Woodpecker CI 自动化部署 Deno 项目

日期: 2025-05-15 分组: Docker 标签: DockerCI 4分钟 652字

今年使用 JS 挺多的,尤其是 CloudFlare Worker,使用起来开发太迅速了,因为是解释语言不需要编译,总感觉快了许多。

在我自己的服务器上,我是有使用 .NET 做了一个本地工具项目的,现在我打算使用 Deno 重写一份,这样改起来也方便许多。

基础

创建 GitHub OAuth Client

从 Setting -> Developer Settings -> OAuth Apps -> New OAuth App

添加好应用程序名称、应用程序URL等信息

Callback需要填:https://woodpecker.domain.com/authorize

保存完之后创建 GITHUB_SECRET 后面要用。

安装 Woodpecker CI

创建 docker-compose.yml 文件,这里我使用的是 Github 作为远程仓库。

1
services:
2
woodpecker-server:
3
image: woodpeckerci/woodpecker-server:v3
4
user: root
5
ports:
6
# 端口这里要按照自己的需要填写
7
- 43388:8000
8
volumes:
9
- /data/docker/woodpecker/server-data:/var/lib/woodpecker/
10
environment:
11
- WOODPECKER_OPEN=true
12
- WOODPECKER_HOST=https://woodpecker.domain.com
13
- WOODPECKER_GITHUB=true
14
- WOODPECKER_GITHUB_CLIENT=<Github OAuth Client ID>
15
- WOODPECKER_GITHUB_SECRET=<Github OAuth Client Secret>
15 collapsed lines
16
- WOODPECKER_AGENT_SECRET=<这里是Agent用来连接Server的Secret,自己生成即可>
17
18
woodpecker-agent:
19
image: woodpeckerci/woodpecker-agent:v3
20
user: root
21
command: agent
22
restart: always
23
depends_on:
24
- woodpecker-server
25
volumes:
26
- /data/docker/woodpecker/agent-config:/etc/woodpecker
27
- /var/run/docker.sock:/var/run/docker.sock
28
environment:
29
- WOODPECKER_SERVER=woodpecker-server:9000
30
- WOODPECKER_AGENT_SECRET=<这里是Agent用来连接Server的Secret,自己生成即可>

完全部署好之后使用Github进行认证即可打开后台。

创建 Woodpecker pipeline

在项目下添加 .woodpecker/test.yml 文件

1
# 当分支上发生 push 事件时,将执行此工作流
2
when:
3
event: push
4
branch: main
5
6
steps:
7
- name: deploy
8
image: cglang-ssh-client # 这个镜像是自己构建的 原因是我没找到自己想要的最小SSH镜像
9
commands:
10
# 这里就是使用ssh将项目文件复制到服务器上
11
- ssh [email protected] 'rm -rf /upload/deno/*'
12
- ssh [email protected] 'mkdir -p /upload/deno'
13
- scp -r ./* [email protected]:/upload/deno
14
- ssh [email protected] 'cd /upload/deno/ && ./publish.sh'

构建 cglang-ssh-client 镜像

这里我会构建一个包含ssh秘钥的镜像

1
FROM alpine:latest
2
3
RUN apk add --no-cache openssh
4
5
RUN mkdir -p /root/.ssh && chmod 600 /root/.ssh
6
7
RUN echo -e "Host *\n\tStrictHostKeyChecking no\n" > /root/.ssh/config && chmod 600 /root/.ssh/config
8
9
ARG SSH_KEY
10
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa
11
12
WORKDIR /root
13
14
CMD ["/bin/sh"]
Terminal window
1
# 构建镜像
2
docker build --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" -t ssh-client .

Deno 项目

构建项目镜像

创建dockerfile

1
# 使用官方deno镜像作为构建环境
2
FROM denoland/deno:alpine-1.43.6 AS builder
3
4
WORKDIR /app
5
6
COPY . .
7
8
# 缓存依赖,提前编译
9
RUN deno cache main.ts
10
11
# 构建运行需要的镜像
12
FROM denoland/deno:alpine-1.43.6
13
14
WORKDIR /app
15
7 collapsed lines
16
# 只复制需要的文件,从builder阶段复制缓存好的代码
17
COPY --from=builder /app .
18
19
# 端口按需配置
20
EXPOSE 8099
21
22
CMD ["run", "--allow-net", "main.ts"]

创建一个 docker-compose 用来管理容器

1
services:
2
deno-app:
3
build:
4
context: .
5
dockerfile: Dockerfile
6
ports:
7
- "8099:8099"
8
restart: unless-stopped

创建一个发布脚本 publish.sh

1
#!/bin/bash
2
3
# 构建运行镜像
4
docker-compose up -d --build
5
6
# 删除未被使用的悬挂镜像
7
docker images --filter "dangling=true" -q | xargs -r docker rmi

记得给脚本添加运行权限

Terminal window
1
chmod +x publish.sh
人应当是有理想的.
文章目录