Github Actions #6 Environment Variables & Secrets

Onur BOLATOĞLU
4 min readDec 28, 2022

Serinin bu bölümünde, değişkenleri kullanarak kodumuz içerisinde değerli erişim bilgilerini tutmamıza gerek kalmayacak. Misal bir DB bilgisi, Sunucu bilgisi vb. gibi değerli bilgileri. Böylelike uygulamamız build edilirken, tüm bu değerli değişken bilgilerini runner sunucudan alabilecek ve kod dosyamızda bunu tutmamıza gerek kalmayacak.

Kodumuzda kullanacağımız değişkenler.

Workflow dosyamıza kullanmak istediğimiz, ihtiyacımız olan değişkenleri yazarak, bu değişkenleri runner sunucuya bildirebiliriz.

name: Deployment
on:
push:
branches:
- master
- dev
env:
MONGODB_DB_NAME: gha-demo
jobs:
test:
env:
MONGODB_CLUSTER_ADDRESS: cluster0.u9pq2zl.mongodb.net
MONGODB_USERNAME: onur
MONGODB_PASSWORD: rEiThTCX25WM2tv6
PORT: 8080
runs-on: ubuntu-latest
steps:
- name: Get Code
uses: actions/checkout@v3
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-deps-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
- name: Run server
run: npm start & npx wait-on http://127.0.0.1:$PORT
- name: Run tests
run: npm test
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
echo "MONGODB_DB_NAME: $MONGODB_DB_NAME"

Yukarıdaki örnekte, 5 adet değişken kullanıyoruz. Değişkenleri istersek jobların içerisinde, dilersek ana context içerisinde belirtebiliriz. Ana context içerisinde kullandığımız değişkenleri tüm runner sistemlerde görebiliriz.

Misal, tests jobu tüm değişkenleri biliyorken, deploy jobu MONGODB_USERNAME değişkeninin değerini bilmiyor. Çünkü, deploy jobu içerisinde bu değişkeni tanımlamadık. Yukarıdaki workflow’u çalıştırdığımızda aşağıdaki gibi bir sonuç elde ederiz.

Test jobu username bilgisine sahip.
Deploy jobu username bilgisine sahip değil. Çünkü deploy jobu içerisinde böyle bir değişken tanımlamadık.

Workflow dosyanızda da bu değerli bilgileri kullanmak, yazmak istemeyebilirsiniz. Bu değerli bilgileri dilerseniz “secret” objesinden alabilirsiniz.

Repository altında kullanacağınız secret objelerini oluşturur ve workflow dosyasında da bu değişkene ait bilgiyi secret’dan okumasını isteyebiliriz.

name: Deployment
on:
push:
branches:
- master
- dev
env:
MONGODB_DB_NAME: gha-demo
jobs:
test:
env:
MONGODB_CLUSTER_ADDRESS: cluster0.u9pq2zl.mongodb.net
MONGODB_USERNAME: ${{ secrets.MONGODB_USERNAME }} # Secret
MONGODB_PASSWORD: ${{ secrets.MONGODB_PASSWORD }} # Secret
PORT: 8080
runs-on: ubuntu-latest
steps:
- name: Get Code
uses: actions/checkout@v3
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-deps-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
- name: Run server
run: npm start & npx wait-on http://127.0.0.1:$PORT
- name: Run tests
run: npm test
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
echo "MONGODB_DB_NAME: $MONGODB_DB_NAME"
Secret kullandığımız için, echo komutu ile değerleri yazdıramayız.

Diğer bir yöntem ise, Repository altında bir değişken grubu oluşturuz ve secretları bu grup altına ekleriz. Örnek aşağıdaki gibidir.

abuzer adında bir değişken grubu oluşturuyoruz.
Kullanacağımız secretları “add secret” butonu yardımıyla değişken grubumuza ekliyoruz.

Dilersek, değişken grubunu branch bazında özelleştirebiliriz.

Peki bu değişken grubunu workflow’da nasıl kullanacağız?

Bu değişken grubunu kullanabilmemiz için, yukarıda oluşturduğumuz secretları siliyoruz ki, isimler aynı olduğu için çakışmasınlar.

name: Deployment
on:
push:
branches:
- master
- dev
env:
MONGODB_DB_NAME: gha-demo
jobs:
test:
environment: abuzer # Env gr
env:
MONGODB_CLUSTER_ADDRESS: cluster0.qoyo9xe.mongodb.net
MONGODB_USERNAME: ${{ secrets.MONGODB_USERNAME }} # go to env gr
MONGODB_PASSWORD: ${{ secrets.MONGODB_PASSWORD }} # go to env gr
PORT: 8080
runs-on: ubuntu-latest
steps:
- name: Get Code
uses: actions/checkout@v3
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-deps-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
- name: Run server
run: npm start & npx wait-on http://127.0.0.1:$PORT
- name: Run tests
run: npm test
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
echo "MONGODB_HOST: ${{ env.MONGODB_CLUSTER_ADDRESS }}"
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Output information
run: |
echo "MONGODB_USERNAME: ${{ env.MONGODB_USERNAME }}"
echo "MONGODB_DB_NAME: $MONGODB_DB_NAME"

Böylelikle workflow değişkenlerin değerlerini okumak için “abuzer” değişken grubuna gidecek ve o grup altında bulunan secret’lardan MONGODB_USERNAME ve MONGODB_PASSWORD secretlarının değerlerini okuyacak.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response