Github Actions #9 Running tasks inside the container

GitHub Actions tanımlarımızda container kullanmanın faydaları şunlardır:
- Taşınabilirlik: İşlemlerimizi herhangi bir ortamda çalıştırabilmek için kullanılabilir.
- Tekrar kullanılabilirlik: Tekrar kullanılabilirliği sağlayan standart bir yapıya sahip oluruz.
- İzolasyon: İşlemleri başka işlemlerden ve ana bilgisayar sisteminden izole ederek güvenli bir şekilde yürütmemizi sağlar.
- Hızlı başlatma: Docker gibi container teknolojileri, çalışma zamanı ortamlarını hızlı bir şekilde başlatmak için optimize edilmiştir
- Çevre bağımlılıklarını yönetme: Projenin çalışması için gereken her şeyi bir arada tutarak, herhangi bir ortamda işlemi yürütmemizi sağlar.
Bu nedenlerden dolayı, GitHub Actions tanımlarımızda container kullanımı, işlemlerimizi daha güvenli ve taşınabilir hale getirirken, yönetmeyi kolaylaştırır ve işlem performansını artırır.
name: Deployment (Container)
on:
push:
branches:
- master
- dev
env:
CACHE_KEY: node-deps
MONGODB_DB_NAME: gha-demo
jobs:
test:
environment: testing
runs-on: ubuntu-latest
container:
image: node:16
env:
MONGODB_CONNECTION_PROTOCOL: mongodb
MONGODB_CLUSTER_ADDRESS: mongodb
MONGODB_USERNAME: root
MONGODB_PASSWORD: Example
PORT: 8080
services:
mongodb:
image: mongo
env:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: Example
steps:
- name: Get Code
uses: actions/checkout@v3
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ env.CACHE_KEY }}-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci & hostname & printenv
- name: Run server
run: npm start & hostname & npx wait-on http://127.0.0.1:$PORT # requires MongoDB Atlas to accept requests from anywhere!
- name: Run tests
run: npm test & hostname
- name: Output information
run: |
echo "MONGODB_USERNAME: $MONGODB_USERNAME"
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Output information
env:
PORT: 3000
run: |
echo "MONGODB_DB_NAME: $MONGODB_DB_NAME"
echo "MONGODB_USERNAME: $MONGODB_USERNAME"
echo "${{ env.PORT }}"
Yukarıdaki yaml dosyasını açıklayacak olursak,
container
anahtar kelimesi kullanılarak belirtilen Docker container'ı, runs-on
anahtar kelimesi altında belirtilen işletim sistemi üzerinde çalıştırılır. Bu container, image
anahtar kelimesi ile belirtilen Docker imajını kullanarak oluşturulur.
Container’ın, GitHub Actions tanım dosyasında belirtilen ortam değişkenlerine erişebilmesi için, bu değişkenler env
anahtar kelimesi altında tanımlanır. Bu değişkenler, container'ın çalışması sırasında kullanılacak olan ortam değişkenleri olarak kabul edilir. Tanımlanan değişkenler, container içindeki işlemler tarafından kullanılabilir hale getirilir.
Örneğin, yukarıdaki örnekte node:16
Docker imajı kullanılarak oluşturulan bir container, MONGODB_CONNECTION_PROTOCOL
, MONGODB_CLUSTER_ADDRESS
, MONGODB_USERNAME
, MONGODB_PASSWORD
ve PORT
adlı ortam değişkenlerine erişebilir. Bu değişkenler, container içindeki Node.js uygulaması veya diğer işlemler tarafından kullanılabilir ve değerleri, GitHub Actions tanım dosyasında tanımlandığı gibi kullanılabilir.
Docker servisi, GitHub Actions tanım dosyasında services
anahtar kelimesi kullanılarak belirtilir. Bu anahtar kelimesi altında, Docker container'ı olarak çalıştırılacak bir servisin belirtilmesi gerekiyor.
Yukarıdaki örnekte, mongodb
adlı servis için mongo
Docker imajı kullanılarak bir container başlatılacak. Ayrıca, MONGO_INITDB_ROOT_USERNAME
ve MONGO_INITDB_ROOT_PASSWORD
ortam değişkenleri belirlenerek, container'ın çalışması için gerekli olan MongoDB yapılandırması yapılmıştır.
GitHub Actions, services
anahtar kelimesi altında belirtilen Docker container'larını, test veya deploy gibi işlemlerin gerçekleştirilmesi sırasında kullanabilir. Bu şekilde, gerekli olan tüm ortamların hazırlanması otomatikleştirilerek, işlemlerin daha hızlı ve güvenli bir şekilde gerçekleştirilmesi sağlanır.
Yukarıdaki örnekte, Node container; MongoDB veritabanına bağlanmak için MONGODB_CLUSTER_ADDRESS
ortam değişkenini kullanır. Bu ortam değişkeni, MongoDB container'ının adını (mongodb
) belirtir ve Node container, MongoDB container'ına bu adla erişebilir.
Örnekte, services
anahtar kelimesi altında MongoDB container'ı tanımlanmıştır. Bu, GitHub Actions tarafından başlatılan ikinci bir Docker container'ıdır. Bu container MongoDB veritabanını çalıştırır ve Node container ile iletişim kurmasını sağlar.
Sonuç olarak, Node container ve MongoDB container, birbirleriyle bağlantı kurabilir ve birlikte çalışabilir. node
container'ı, mongodb
servisinin hazır olduğunu bekleyecek ve sonra MongoDB veritabanına bağlanacak.
Önemli;
Container kullanılan bir Actions tanımında, tüm adımlar ve komutlar container içinde çalıştırılır. Container, bir sanal ortam olarak kullanılır ve GitHub Actions, belirli bir işletim sistemi ve diğer gereksinimlerle yapılandırılmış olan bir Docker image kullanarak bir container oluşturur. Bu Docker image, Actions çalıştırıldığında yürütülen tüm adımların ve komutların çalışacağı ortamı sağlar.
Yani, container
altında belirtilen Docker image, Actions'un çalıştırılması için kullanılan sanal bir ortamdır ve steps
altındaki tüm adımlar ve komutlar, bu Docker image da yer alan container içinde çalıştırılır. Container, ayrı bir işletim sistemi ortamı olarak çalıştığından, ana işletim sistemi üzerinde bir şeyler çalıştırmak için özel bir adım belirtmek gerekir. Bu nedenle, Docker container'ı içindeki komutlar ve adımlar, ana işletim sistemi üzerinde çalışan komutlar ve adımlardan farklıdır.
Tüm adımlar container içinde çalışırken bile actions/checkout
adımı gibi belirli adımlar, ana işletim sistemi üzerinde çalıştırılabilir.
actions/checkout
adımı, GitHub repomuzdan kodu almak için kullanılır. Bu adımın amacı, kodu depolama hizmetinden (GitHub
, Bitbucket
, GitLab
vb.) almak ve bunu Actions'un çalıştığı Docker containerına kopyalamaktır.