👻

GithubActionsからArgoCDの同期をPush型で実行するサンプル

2022/10/15に公開

構成

  • AWSEKS
  • プライベートサブネットに配置
  • ArgoCDのエンドポイントは外部公開されておらず、PortFowardingで接続する必要がある

やりたいこと

  • 特定のディレクトリのマニフェストファイルが変更されたら、手動で同期をかけたい
    • 通常、ArgoCDはいわゆるPull型でGithubリポジトリをチェックする動作をするため、タイムラグが発生する
    • たしかデフォルト3分のはずなのでそこまで待たないはずなのだけど、どうも自動的に同期されないタイミングがちょこちょこある
    • この同期タイミングを待たずして、即座に同期させたい
  • メインとなるアクションはcompositeで共通化する

サンプル

compositeのActionを呼び出す側のWorkflow

name: sync-argocd-prd

on:
  push:
    branches: [ master ]
    paths:
      - "kubernetes/chart/manifests"
  workflow_dispatch:

jobs:
  sync-argocd-prd:
    runs-on: ubuntu-latest

    env:
      ENV: prd 

    steps:
      - uses: actions/checkout@v2
 
      - name: sync argocd
        uses: ./.github/actions/sync_argocd
        with:
          AWS_ENVIRONMENT: ${{ env.ENV }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PRD_KEY }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PRD_SECRET }}

呼び出される側のWorkflow

  • AWSCLIを実行したいときのサンプルでよく見かけるaws-actions/configure-aws-credentials@v2を利用する場合、タイミングにより若干実行バイナリのバージョンが古いことがある模様
    • なので、直接CLIをインストールしている(正解はわからない)
  • kubectl port-forward時に注意が必要
    • アンパサンドをつけてバックグラウンド実行させる
    • この場合の、エンドポイントは、localhost:8080となる
      • 127.0.0.1:8080だと繋がりません
name: "argocd sync"
description: "argocd sync"
inputs:
  AWS_ENVIRONMENT:
    description: "AWS_ENVIRONMENT"
    required: true
  AWS_ACCESS_KEY_ID:
    description: "AWS_ACCESS_KEY_ID"
    required: true
  AWS_SECRET_ACCESS_KEY:
    description: "AWS_SECRET_ACCESS_KEY"
    required: true

runs:
  using: composite
  steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Install AWS CLI
      shell: bash
      run: |
        curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
        unzip awscliv2.zip
        sudo ./aws/install --update
        which aws
        aws --version

    - name: Add aws profile credentials to ~/.aws/credentials
      shell: bash
      run: |
        aws configure set aws_access_key_id ${{ inputs.AWS_ACCESS_KEY_ID }} --profile githubactions --region ap-northeast-1
        aws configure set aws_secret_access_key ${{ inputs.AWS_SECRET_ACCESS_KEY }} --profile sample --region ap-northeast-1

    - name: Configure EKS
      shell: bash
      run: |
        echo ${{ inputs.AWS_ENVIRONMENT }}
        aws eks update-kubeconfig --name ${{ inputs.AWS_ENVIRONMENT }}-eks-cluster --profile sample--region ap-northeast-1

    - name: install argocd
      shell: bash
      run: |
        curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
        chmod +x /usr/local/bin/argocd

    - name: install kubectl
      shell: bash
      run: |
        curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
        chmod +x ./kubectl
        sudo mv ./kubectl /usr/local/bin/kubectl
        kubectl version --client

    - name: portforwarding argocd service
      shell: bash
      run: |
        nohup kubectl port-forward svc/argocd-server -n argocd 8080:443 &

    - name: login argocd
      shell: bash
      run: |
        PASSWORD=$(kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" -n argocd | base64 -d; echo)
        argocd login localhost:8080 --username admin --password ${PASSWORD} --insecure

    - name: execute sync command
      shell: bash
      run: |
        argocd app sync sampleapp

Discussion