今年使用 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 作为远程仓库。
1services:2 woodpecker-server:3 image: woodpeckerci/woodpecker-server:v34 user: root5 ports:6 # 端口这里要按照自己的需要填写7 - 43388:80008 volumes:9 - /data/docker/woodpecker/server-data:/var/lib/woodpecker/10 environment:11 - WOODPECKER_OPEN=true12 - WOODPECKER_HOST=https://woodpecker.domain.com13 - WOODPECKER_GITHUB=true14 - 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:v320 user: root21 command: agent22 restart: always23 depends_on:24 - woodpecker-server25 volumes:26 - /data/docker/woodpecker/agent-config:/etc/woodpecker27 - /var/run/docker.sock:/var/run/docker.sock28 environment:29 - WOODPECKER_SERVER=woodpecker-server:900030 - WOODPECKER_AGENT_SECRET=<这里是Agent用来连接Server的Secret,自己生成即可>完全部署好之后使用Github进行认证即可打开后台。
创建 Woodpecker pipeline
在项目下添加 .woodpecker/test.yml 文件
1# 当分支上发生 push 事件时,将执行此工作流2when:3 event: push4 branch: main5
6steps:7 - name: deploy8 image: cglang-ssh-client # 这个镜像是自己构建的 原因是我没找到自己想要的最小SSH镜像9 commands:10 # 这里就是使用ssh将项目文件复制到服务器上11121314构建 cglang-ssh-client 镜像
这里我会构建一个包含ssh秘钥的镜像
1FROM alpine:latest2
3RUN apk add --no-cache openssh4
5RUN mkdir -p /root/.ssh && chmod 600 /root/.ssh6
7RUN echo -e "Host *\n\tStrictHostKeyChecking no\n" > /root/.ssh/config && chmod 600 /root/.ssh/config8
9ARG SSH_KEY10RUN echo "$SSH_KEY" > /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa11
12WORKDIR /root13
14CMD ["/bin/sh"]1# 构建镜像2docker build --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" -t ssh-client .Deno 项目
构建项目镜像
创建dockerfile
1# 使用官方deno镜像作为构建环境2FROM denoland/deno:alpine-1.43.6 AS builder3
4WORKDIR /app5
6COPY . .7
8# 缓存依赖,提前编译9RUN deno cache main.ts10
11# 构建运行需要的镜像12FROM denoland/deno:alpine-1.43.613
14WORKDIR /app15
7 collapsed lines
16# 只复制需要的文件,从builder阶段复制缓存好的代码17COPY --from=builder /app .18
19# 端口按需配置20EXPOSE 809921
22CMD ["run", "--allow-net", "main.ts"]创建一个 docker-compose 用来管理容器
1services:2 deno-app:3 build:4 context: .5 dockerfile: Dockerfile6 ports:7 - "8099:8099"8 restart: unless-stopped创建一个发布脚本 publish.sh
1#!/bin/bash2
3# 构建运行镜像4docker-compose up -d --build5
6# 删除未被使用的悬挂镜像7docker images --filter "dangling=true" -q | xargs -r docker rmi记得给脚本添加运行权限
1chmod +x publish.sh