Skip to content
GitLabGitHub

środowisko deweloperskie z Vagrant

W tym wpisie pokaże wam, jak przygotować własny obraz Ubuntu 24.04 dla Vagranta, a następnie pokaże jak przygotować środowisko developerskie.

Pobranie repozytorium z vagrantem

git clone https://gitlab.com/pl.rachuna-net/tools/vagrant.git

  1. Przygotowanie maszyny wirutlanej na Virtualbox

    Section titled “Przygotowanie maszyny wirutlanej na Virtualbox”
  2. echo "vagrant ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/vagrant
    
    sudo apt-get update
    sudo apt-get dist-upgrade -y
    sudo apt install -y openssh-server curl wget sudo
    sudo apt install -y build-essential dkms linux-headers-$(uname -r)
    
    mkdir -p /home/vagrant/.ssh
    curl -fsSL https://raw.githubusercontent.com/hashicorp/vagrant/master/keys/vagrant.pub -o /home/vagrant/.ssh/authorized_keys
    chown -R vagrant:vagrant /home/vagrant/.ssh
    chmod 700 /home/vagrant/.ssh
    chmod 600 /home/vagrant/.ssh/authorized_keys
    
    sudo apt-get autoremove -y
    sudo apt-get clean
    sudo rm -rf /var/lib/apt/lists/*
    
    sudo timedatectl set-timezone UTC
    sudo locale-gen en_US.UTF-8
    sudo swapoff -a
    
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
  3. Przygotowanie do stworzenia .box - czyli usuwanie zbędnych plików

    Section titled “Przygotowanie do stworzenia .box - czyli usuwanie zbędnych plików”
    sudo systemctl enable --now ssh
    
    sudo apt autoremove -y
    sudo apt clean
    history -c
    
    sudo truncate -s 0 /etc/machine-id
    sudo rm -f /var/lib/dbus/machine-id
    
    sudo shutdown -h now
  4. vagrant package \
      --base "ubuntu-24.04" \
      --output ".box/ubuntu-24.04-1.0.0.box"
  5. vagrant box add ubuntu-24.04-1.0.0 .box/ubuntu-24.04-1.0.0.box

    Lista pobranych lokalnie boxes

    vagrant box list
  6. hostname = ENV['VAGRANT_HOSTNAME'] || 'dev-station'
    vm_memory = ENV['VAGRANT_VM_MEMORY'] || 4096
    num_cpus = ENV['VAGRANT_NUM_CPUS'] || 2
    vm_base_image = ENV['VAGRANT_VM_BASE_IMAGE'] || 'ubuntu-24.04-1.0.0'
    
    Vagrant.configure("2") do |config|
    
      config.vm.box = vm_base_image
      config.vm.hostname = hostname
    
    
      config.vm.provider "virtualbox" do |vb|
        vb.name = hostname
        vb.cpus = num_cpus
        vb.memory = vm_memory
        vb.gui = false
      end
    
      config.ssh.forward_agent = true
      config.ssh.forward_x11 = true
      config.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh"
    
      config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
      # pliki do synchronizacji z home
      config.vm.synced_folder "/userfiles", "/vagrant/userfiles", type: "virtualbox"
    
      if File.file?("./bootstrap.sh")
        config.vm.provision "shell", path: "./bootstrap.sh", privileged: true, run: "always"
      end
    end
  7. #!/bin/env bash
    set -euo pipefail
    
    VAGRANT_DIRETORY="/vagrant"
    MARKER="/var/lib/vagrant-bootstrap.done"
    SCRIPTS_LIST="$VAGRANT_DIRETORY/scripts_to_run"
    
    if [[ -f "${MARKER}" ]]; then
      echo "[bootstrap] already done (${MARKER} exists) - skipping"
      exit 0
    fi
    
    echo -e "\033[1;33m===>\033[0m 🚀 Run bootstrap script"
    
    
    echo -e "\033[1;33m===>\033[0m 📁 Copy userfiles to $HOME"
    cp -fr $VAGRANT_DIRETORY/userfiles/. ~/
    
    if [ ! -f "$SCRIPTS_LIST" ]; then
      echo "❌ Scripts list file '$SCRIPTS_LIST' not found!"
      exit 1
    fi
    
    while IFS= read -r script; do
      if [ -f "$VAGRANT_DIRETORY/$script" ]; then
        echo -e "\033[1;33m===>\033[0m 🚀 Running script: $VAGRANT_DIRETORY/$script"
        chmod +x "$VAGRANT_DIRETORY/$script"
        bash "$VAGRANT_DIRETORY/$script"
      else
        echo "❌ Script '$script' not found in '$VAGRANT_DIRET/$script'!"
      fi
    done < "$SCRIPTS_LIST"
  8.  vagrant up

    albo

    chmod +x start_vm.bash
    ./start_vm.bash
  9. Publikacja .box jako w gitlab jako Gitlab Package registry

    Section titled “Publikacja .box jako w gitlab jako Gitlab Package registry”
    export GITLAB_URL="https://gitlab.com"
    export GITLAB_TOKEN=""
    export PROJECT_ID="77501746"
    export PACKAGE_NAME="ubuntu-24.04"
    export PACKAGE_VERSION="1.0.0"
    export FILE_NAME="${PACKAGE_NAME}$-${PACKAGE_VERSION}.box"
    
    curl --fail --location -H "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
      --upload-file ".box/${FILE_NAME}" \
      "${GITLAB_URL}/api/v4/projects/${PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${PACKAGE_VERSION}/${FILE_NAME}"
export GITLAB_URL="https://gitlab.com"
export GITLAB_TOKEN=""
export PROJECT_ID="77501746"
export PACKAGE_NAME="ubuntu-24.04"
export PACKAGE_VERSION="1.0.0"
export FILE_NAME="${PACKAGE_NAME}$-${PACKAGE_VERSION}.box"

curl -L -H "PRIVATE-TOKEN: ${TOKEN}" \
"${GITLAB_URL}/api/v4/projects/${PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${PACKAGE_VERSION}/${FILE_NAME}"
-o .box/$FILE_NAME

vagrant box add ubuntu-24.04-1.0.0 .box/ubuntu-24.04-1.0.0.box

vagrant up
  • SSH jest dostępne na porcie 2222 na hoście, przekierowanym do portu 22 w VM.
  • Włączone jest przekazywanie agenta SSH oraz X11.
  • Połączenie można nawiązać poleceniem:
    ssh -p 2222 vagrant@localhost

Edytuj plik ~/.ssh/config, dodając wpis:

Host dev-station
   HostName 127.0.0.1
   Port 2222
   User vagrant
   IdentityFile /repo/pl.rachuna-net/devtools/vagrant/.vagrant/machines/default/virtualbox/private_key
   ForwardX11 yes

Dzięki temu możesz łatwo łączyć się z maszyną wirtualną za pomocą polecenia:

ssh dev-station
vagrant@dev-station:/vagrant$ cd /vagrant/
vagrant@dev-station:/vagrant$ ./bootstrap.bash 
===> 🚀 Run bootstrap script
===> 📁 Copy userfiles to /home/vagrant
===> 🚀 Running script: /vagrant/provisioning/upgrade-ubuntu.bash
===> Upgrade system packages and distribution
===> 🚀 Running script: /vagrant/provisioning/install-packages.bash
===> Install packages