Подготовка инфраструктуры

Важно: раздел описывает подготовку инфраструктуры для self-hosted GitHub Runner

Требования

  • GitHub Actions;

  • Хост для установки GitHub Runner, имеющий:

Установка и регистрация GitHub Runner

Установите и зарегистрируйте GitHub Runner на выделенный для него хост, следуя официальным инструкциям.

Настройка окружения для сборки с Buildah

(Для Ubuntu 23.10 и выше) на хосте GitHub Runner запустите:

{ echo "kernel.apparmor_restrict_unprivileged_userns = 0" && echo "kernel.apparmor_restrict_unprivileged_unconfined = 0";} | sudo tee -a /etc/sysctl.d/20-apparmor-donotrestrict.conf && sudo sysctl -p /etc/sysctl.d/20-apparmor-donotrestrict.conf

Настройка проекта

Требования

  • GitHub Actions;

  • GitHub-hosted Runner или self-hosted GitHub runner.

Настройка проекта GitHub

  • Создайте и сохраните access token для очистки ненужных образов из container registry со следующей конфигурацией:

    • Token name: werf-images-cleanup;

    • Scopes: read:packages и delete:packages.

  • В секреты проекта добавьте следующую переменную:

    • Access token для очистки ненужных образов:

      • Name: REGISTRY_CLEANUP_TOKEN;

      • Secret: <сохранённый "werf-images-cleanup" access token>.

  • Сохраните kubeconfig-файл для доступа к Kubernetes-кластеру в зашифрованный секрет KUBECONFIG_BASE64, предварительно закодировав его в Base64.

Конфигурация CI/CD проекта

Так может выглядеть репозиторий, использующий werf для сборки и развертывания:

.github
app
werf.yaml
name: cleanup
on:
  schedule:
    - cron: "0 3 * * *"

jobs:
  cleanup:
    name: cleanup
    runs-on: self-hosted
    container:
      image: ghcr.io/werf/werf:2-stable-ubuntu
      options: --security-opt "seccomp:unconfined" --security-opt "apparmor:unconfined"
    steps:
      - uses: actions/checkout@v3
      - run: git fetch --prune --unshallow
      
      - run: |
          . "$(werf ci-env github --as-file)"
          werf cleanup
        env:
          WERF_KUBECONFIG_BASE64: ${{ secrets.KUBECONFIG_BASE64 }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          WERF_REPO_GITHUB_TOKEN: ${{ secrets.REGISTRY_CLEANUP_TOKEN }}
name: prod
on:
  push:
    branches:
      - main

jobs:
  prod:
    name: prod
    runs-on: self-hosted
    container:
      image: ghcr.io/werf/werf:2-stable-ubuntu
      # if you use fuse, then add the option --device /dev/fuse
      options: --security-opt "seccomp:unconfined" --security-opt "apparmor:unconfined"
      volumes:
        - /home/build/.werf
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      # Uncomment this block for cross-platform build
      # - name: Set up QEMU
      #   uses: docker/setup-qemu-action@v3
      #   with:
      #     platforms: linux/amd64, linux/arm64

      - run: |
          . "$(werf ci-env github --as-file)"
          werf converge
        env:
          WERF_ENV: prod
          WERF_BUILDAH_MODE: auto
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          WERF_KUBECONFIG_BASE64: ${{ secrets.KUBECONFIG_BASE64 }}
FROM node

WORKDIR /app
COPY . .
RUN npm ci

CMD ["node", "server.js"]

{
  "name": "app",
  "version": "1.0.0",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "name": "app",
      "version": "1.0.0"
    }
  }
}

{
  "name": "app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  }
}

const http = require('http');

const hostname = '127.0.0.1';
const port = 80;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

configVersion: 1
project: test

---
image: app
dockerfile: Dockerfile
context: ./app

Дополнительно:

  • Для использования GitHub-hosted Runner укажите ubuntu-latest в runs-on;

  • Если вы не используете ghcr в качестве container registry, то проставьте WERF_REPO, выполните werf cr login, а также учтите особенности вашего container registry при очистке.