Linux’ta Snap Paketi Nasıl Oluşturulur?
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 core
Console 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
app
dizininde, currentdate
adı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.cs
dosyası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 lxd
grubuna 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 currentdate
komutu, 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…