Linux’ta Snap Paketi Nasıl Oluşturulur?

Bayram Üçüncü
Akbank Teknoloji
Published in
5 min readDec 15, 2023

Snap, Linux işletim sistemleri için geliştirilmiş bir yazılım paketleme ve dağıtım sistemidir. Canonical tarafından geliştirilen Snap sistemi, Ubuntu, Debian, Arch Linux, Fedora, CentOS ve Manjaro dahil olmak üzere çoğu büyük Linux dağıtımında çalışmaktadır. Snap sayesinde kullanıcılar, uygulama kurma, güncelleme, kaldırma işlemlerini GUI veya komut satırı aracılığı yapabilmektedirler.

Snap paketlerini kullanmanın bazı avantajları şunlardır:

  • Platform uyumluluğu sayesinde herhangi bir Linux dağıtımında çalışabilirler.
  • Dependency yönetimini sağlamak amacıyla Snap paketi ihtiyaç duyduğu tüm bağımlılıkları içerir.
  • Güvenli olmasını sağlayan özelliği, sisteme doğrudan erişememesidir. Sanal bir aracı ortam ile sistem iletişimini sağlar.
  • Paketler otomatik olarak güncellenir ve kullanıcıların en son sürümü kullanması sağlanır.

Snap Kurulumu

Bazı Linux dağıtımlarında, örneğin Ubuntu Deskop üzerinde, kurulu olarak gelmektedir.

Eğer sistemde Snap kurulu değilse terminalde aşağıdaki komut yardımı ile kurulum sağlanır:

$ sudo apt install snapd

Sistemdeki Snap listesi terminalden şu şekilde görüntülenir:

$ snap list
Name Version Rev Tracking Publisher Notes
bare 1.0 5 latest/stable canonical✓ base
code f1b07bd2 143 latest/stable vscode✓ classic
core18 20230703 2790 latest/stable canonical✓ base
core20 20230801 2015 latest/stable canonical✓ base
core22 20230801 864 latest/stable canonical✓ base

Geliştiriciler de kendi özel Snap paketlerini hazırlayıp yayınlayabilirler. Paket oluşturma ve yayınlama işlemine, aşağıdaki adımlarla devam edilebilir:

Proje Oluşturma

Snap paketinde önceden oluşturulup zip’lenmiş projeler kullanılabildiği gibi, sıfırdan bir proje de oluşturulup kullanılabilir. Python, Go, .Net Node.js, Ruby, Rust, C/C++, Java gibi dillerle hazırlanan projeler Snap haline getirilebilir.

Aşağıda bir dotnet coreConsole projesinin oluşturulması gösterilmektedir. Proje dosyaları, snap paketlerinin de bulunacağı ~/snaps/currentdate dizinine oluşturulacaktır:

Öncelikle ~/snaps/currentdateçalışma ortam dizini, ardından bu dizine bir dotnet core projesi oluşturulmalıdır.

$ mkdir -p ~/snaps/currentdate
$ cd ~/snaps/currentdate
~/snaps/currentdate$ dotnet new console -n currentdate -o app

appdizininde, currentdateadında yeni bir dotnet core projesi oluşturulmuştur. Basit bir örnek olması açısından projenin temel işlevi, ekrana mevcut tarihin yazılmasından ibarettir. Bunun için Program.csdosyasının içeriği aşağıdaki gibi düzenlenebilir:

Console.WriteLine($"Current Date: {System.DateTime.Now.ToString()}");

Proje, konsol ortamda aşağıdaki gibi test edilebilir:

~/snaps/currentdate$ dotnet run --project=app/currentdate.csproj
Current Date: 10/17/2023 5:14:17 PM

Artık paketlenmeye hazır bir proje oluşturulmuştur ve paketleme adımlarına geçilebilir.

Snapcraft Kurlumu

Snapcraft, geliştiricilerin programlarını Snap formatında paketlemelerini sağlayan bir araçtır. MacOS, Microsoft Windows veya herhangi bir Linux dağıtımında çalışabilir.

Terminal ortamında Snapcraft kurulumu aşağıdaki gibi yapılır:

$ sudo snap install snapcraft --classic

--classic flag kullanılmasının sebebi, kurulumda klasik sınırlandırma (classic confinement) kullanılmasıdır. Uygulamanın kaynaklara erişimleri, sınırlandırma politikaları ile belirlenmektedir. Diğer sınırlandırma politikalarına buradan ulaşılabilir.

Snapcraft Build Ortamının Hazırlanması

Snapcraft ile Snap oluşturulurken varsayılan olarak LXD container ortamı kullanılır. Bu nedenle LXD kurulumu yapılmalıdır:

$ sudo snap install lxd

Mevcut kullanıcının da lxdgrubuna eklenmesi gerekir ki kaynak erişim iznine sahip olsun:

$ sudo usermod -a -G lxd $USER

Oturmun yeni gruba dahil olabilmesi için sistemden logout olunup tekrar girilmelidir. Eğer bu adım yapılmaz ise, snap build adımları sırasında, network, I/O gibi kaynaklarda erişimin reddedildiğine dair hatalar alınır.

LXD başlatılır:

lxd init --minimal

Snap Paketi Oluşturma Aşamaları

snapcraft.yml Template

Snap paketleri hakkında bilgi vermek, nasıl çalışacağını tanımlamak amacıyla oluşturulan bir metadata dosyasıdır. Paketin kök dizininde bulunur:

~/snaps/currentdate$ snapcraft init

Oluşturulan dosyanın içeriği, aşağıdaki gibi, projeye uygun bir şekilde doldurulur:

name: currentdate
base: core22
version: '0.1'
summary: Gives you the current date.
description: |
This is currentdate's description.
grade: devel
confinement: devmode


parts:
currentdate:
plugin: dotnet
dotnet-build-configuration: Release
dotnet-self-contained-runtime-identifier: linux-x64
source: app
build-packages:
- dotnet-sdk-7.0
stage-packages:
- libicu70

apps:
currentdate:
command: currentdate

YAML Dosya İçeriği Temel Sekmeleri

  • name: Snap ismi.
  • base: Çoğu uygulamanın ihtiyacı olan minimum sayıdaki kütüphaneyi içerir. Varsayılan olarak Ubuntu18.04 LTS için core18 tanımlanır.
  • version: Snap versiyonu.
  • summary: Tek satırlık kısa açıklama.
  • description: Uzun açıklama. Yeni satırlar oluşturmak için ‘|’ karakteri kullanılır.
  • grade: Kalite güvenini belirtmek için yayıncı tarafından kullanılabilir. Snap Store’da ‘devel’ dereceli paketler ‘stable’ kanalda yayınlanmaz.
  • confinement: Her Snap’in sınırlama seviyesi vardır. Sistemden izole olma derecesini gösterir ve üç seviye vardır: strict, classic ve devmode. Strict paketler tamamen sistemden izoledir. Classic paketler sistem kaynaklarına erişebilir. devmode paketler strict olarak çalışır fakat sisteme erişebilirler.
  • part: Paketlenen uygulamayı tanımlar. Uygulamanın bileşen yerlerini, runtime ve build ihtiyaçlarını, bağımlılıklarını belirtir. Snap bir veya birden fazla part içerebilir.

Snap Paketin Oluşturulması

Paketin build edilme, yani oluşturulma adımı Snapcraft Snap dizininde yapılır:

~/snaps/currentdate$ snapcraft
Launching instance...
Executed: pull currentdate
Executed: build currentdate
Executed: stage currentdate
Executed: prime currentdate
Executed parts lifecycle
Generated snap metadata
Created snap package currentdate_0.1_amd64.snap

Snap Paketinin Yüklenmesi

Oluşturulan Snap paketinin sisteme yüklenmesi:

$ sudo snap install currentdate_0.1_amd64.snap --devmode --dangerous
currentdate 0.1 installed

Ortaya çıkan Snap local olarak kurulabilir. Paket Snap Store tarafından imzalanmadığından --dangerous flag gerektirir. Kullanılan --devmode flag, sınırlandırılmamış bir uygulama yüklendiğini belirtir.

Snap Test

$ currentdate
Current Date: 10/17/2023 4:30:56 PM

Terminalde currentdatekomutu, snapcraft.yml’da tanımlandığı gibi çalışmaktadır.

Snap Paketinin Kaldırılması

$ sudo snap remove currentdate

Snap Yayınlama

Hazırlanan Snap paketleri Snap Store üzerinde yayınlanarak tüm dünyaya açılabilmektedir.

Bu işlem için öncelikle Ubuntu One üzerinde bir hesap oluşturulmalıdır. Daha sonra snapcraft.io hesap sayfasında, yukarıda hazırlanan Snap isminde “Register a snap name” seçeneğinden bir Snap adı oluşturulmalıdır. Oluşturulan Snap paketi burada yayınlanacağı için isim uyumsuzluğu olmamalıdır.

Bu işlemlerin tanımlanmasından sonra Linux terminal ortamında login olunmalıdır:

$ snapcraft login
Enter your Ubuntu One e-mail address and password.
If you do not have an Ubuntu One account, you can create one at https://snapcraft.io/account
Email: ucuncubayram@gmail.com
Password:
Login successful

Login kontrolü ile aşağıdaki gibi developer-id ve email bilgisine ulaşılabilir:

$ snapcraft whoami
email: <your email address>
developer-id: <yout developer id>

Snap paketinin upload edilmesi:

$ snapcraft upload --release=stable  currentdate_0.1_amd64.snap
Revision 1 created for 'currentdate' and released to 'stable'

Artık paket Snap Store ortamına gönderilmiştir. snapcraft.io hesap sayfasındaki My Snaps bölümünden release bilgilerine ulaşılabilir.

Sonuç

Snapcraft ile Linux üzerinde çalışabilen Snap paketlerinin oluşturulması sağlanmıştır. Bir dotnet core projesinin geliştirilmesi, derlenmesi ve paketlenmesi, oluşturulan paketlerin sisteme yüklenmesi, çalıştırılması ve paketin sistemden kaldırılması anlatılmıştır. Son olarak Snap paketinin Snap Store üzerine yayınlanması sağlanmıştır.

Bir sonraki yazımızda görüşmek üzere…

--

--