Repository navigation
84 lines (72 loc) · 3.12 KB
/
Copy pathdeploy.yml
File metadata and controls
84 lines (72 loc) · 3.12 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
name: Deploy
on:
push:
branches: [main, master]
workflow_dispatch:
concurrency:
group: deploy
jobs:
deploy:
runs-on: ubuntu-latest
env:
SSH_OPTS: -i ~/.ssh/deploy_key -p ${{ secrets.SERVER_PORT }} -o IdentitiesOnly=yes
HOST: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
APP: ~/forgejo
REMOTE: ~/forgejo/forgejo/gitea
SITE_URL: https://git.lgbt
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
- name: Build
run: |
bun install
bun run bundle
- name: Prepare settings
env:
ALL_SECRETS: ${{ toJSON(secrets) }}
run: |
content=$(cat deploy/app.ini)
for name in $(grep -o '\${[A-Za-z0-9_]*}' deploy/app.ini | tr -d '${}' | sort -u); do
value=$(jq -r --arg k "$name" '.[$k] // empty' <<< "$ALL_SECRETS")
[ -n "$value" ] || exit 1
content=${content//"\${$name}"/"$value"}
done
printf '%s\n' "$content" | awk '
/^[ \t]*($|[#;])/ { next }
/^[ \t]*\[/ { sec = $0; gsub(/^[ \t]*\[|\][ \t]*$/, "", sec); gsub(/\./, "_0X2E_", sec); gsub(/-/, "_0X2D_", sec); next }
{ i = index($0, "="); k = substr($0, 1, i - 1); v = substr($0, i + 1); gsub(/^[ \t]+|[ \t]+$/, "", k); gsub(/^[ \t]+|[ \t]+$/, "", v); print "FORGEJO__" sec "__" k "=" v }
' > /tmp/forgejo.env
- name: Prepare files
run: |
mkdir -p /tmp/stage/public custom
cp -a dist/forgejo/templates /tmp/stage/templates
cp -a dist/forgejo/public/assets /tmp/stage/public/assets
cp -a custom/. /tmp/stage/
- name: Setup SSH
run: |
mkdir -p ~/.ssh
printf '%s\n' "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -p ${{ secrets.SERVER_PORT }} -H ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts
- name: Upload
run: |
# upload compose file and settings
ssh $SSH_OPTS $HOST "mkdir -p $APP && rm -f $APP/.env"
ssh $SSH_OPTS $HOST "cat > $APP/docker-compose.yml" < deploy/docker-compose.yml
ssh $SSH_OPTS $HOST "umask 077 && cat > $APP/forgejo.env" < /tmp/forgejo.env
# upload /templates, /public and /options folders (old files are deleted)
for dir in templates public options; do
[ -d /tmp/stage/$dir ] || continue
ssh $SSH_OPTS $HOST "rm -rf $REMOTE/$dir.new && mkdir -p $REMOTE/$dir.new"
tar -C /tmp/stage/$dir -cf - . | ssh $SSH_OPTS $HOST "tar -C $REMOTE/$dir.new -xf -"
ssh $SSH_OPTS $HOST "rm -rf $REMOTE/$dir && mv $REMOTE/$dir.new $REMOTE/$dir"
done
# restart
- name: Start Forgejo
run: ssh $SSH_OPTS $HOST "cd $APP && docker compose pull && docker compose up -d --force-recreate"
# check
- name: Test
run: |
for p in / /explore/repos /explore/users /user/login /user/sign_up /assets/css/theme-github-auto.css; do
curl -fsS -o /dev/null --retry 20 --retry-delay 3 --retry-connrefused "$SITE_URL$p" || exit 1
done