You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.3 KiB

phCD

Continuous Deployment for PHC projects.

Development

# First install the dependencies
$ pnpm install

# Run the local server
$ pnpm dev

# Build all
$ pnpm build

Production Setup

Run the following command to bootstrap a phCD instance. As this service doesn't have auth for now, it's strongly recommended to publish only on a local ip like 127.0.0.1 and then access directly or via an ssh tunnel (something like ssh -L 8080:127.0.0.1:8080 server).

# Clone this repo
git clone https://git.phc.dm.unipi.it/phc/phcd

# Create config files and data folder
mkdir data.local
cp .env.sample .env
echo 'deploys: []' > config.yaml

# Built docker image
docker built . -t phcd

# Start container
docker run -d \
  --name phcd \
  --restart unless-stopped \
  -p 127.0.0.1:8080:4321 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v ./data.local:/app/data.local \
  -v ./.env:/app/.env \
  -v ./config.yaml:/app/config.yaml \
  phcd

Updating

Just pull changes and update the docker image, then use the command from before to restart the main container.

git pull
docker stop phcd
docker rm phcd
docker built . -t phcd

TODO: Self-Updating

It should be possible to deploy itself using a git+dockerfile deployment. For now this is more complicated as this requires to stop itself and spawn a new docker container of itself.

Idea 1. Create another self-update.Dockerfile that also gets mounted /var/run/docker.sock, this new container will then run the previous commands [...] if we want the volume to be a folder this cannot be easily done

Architecture

Everything is stored in the config.yaml file. This file contains a list of projects to deploy and the configuration for each one.

deploys:
  - name: project1
    url: https://github.com/username/project1
    ref: 
      type: branch
      value: main
    type: dockerfile
    options:
      ports: 
        - 80:8080
      volumes: 
        - /var/www/html:/var/www/html
  - name: project2
    url: ssh://example.org/username/project2.git
    ref:
      type: commit
      value: '1234567'
    type: docker-compose
    options:
      path: ./docker-compose.yml # already the default
  - name: project3
    url: https://github.com/username/project3
    type: shell
    options:
      path: ./deploy.sh # already the default