Close

Functievlaggen van Launch Darkly gebruiken met Bitbucket-pipelines

Profielfoto van Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

Het implementeren van nieuwe code in een productieomgeving is riskant. Het kan gebeuren dat er bugs in de productie sluipen, zelfs nadat de code een unittest, integratietest en systeemtest heeft doorlopen in test- en stagingomgevingen. Van oudsher hebben ontwikkelaars twee keuzes als er eenmaal een bug in de productie zit, en dit heeft gevolgen voor gebruikers. Ze kunnen de buggy code terugdraaien of een oplossing inbrengen; beide oplossingen kosten tijd. Nu kunnen ontwikkelaars een functie in een omgeving met één klik op de knop in- of uitschakelen door de gerelateerde codewijzigingen te verpakken in een functievlag. De impact van buggy code op gebruikers kan onmiddellijk worden beperkt, en er kan een oplossing worden ontwikkeld en op een veilige manier worden toegepast. Dit artikel laat dit zien aan de hand van Bitbucket-pipelines en de feature flags van Launch Darkly in de ImageLabeller-demotoepassing.

Een demo van een ImageLabeller-functievlag

ImageLabeller is een kleine toepassing die gebruikmaakt van machine learning om afbeeldingen te labelen. ImageLabeller wordt geïmplementeerd in vijf omgevingen: Testen, Staging, Production-US-West-2, Production-US-East-1 en Production-CA-Central-1. Dit artikel laat zien hoe je functievlaggen kunt gebruiken om wijzigingen in de SubmitImage-component van ImageLabeller te beheren. SubmitImage is een AWS Lambda, geschreven in Go. Je gebruikt Launch Darkly om functievlaggen te beheren, Bitbucket voor bronbeheer en Bitbucket-pipelines voor CI/CD-functionaliteit.

Functievlaggen van Launch Darkly gebruiken met Bitbucket-pipelines

Laat je lokale Launch Darkly-beheerder een project en omgeving aanmaken. In de screenshot hieronder staat een project, PMMImageLabellerDemo, met vijf omgevingen. Test en staging zijn preproductieomgevingen. Noteer de SDK-sleutel voor elke omgeving. Later zullen de SDK-sleutels als repository-variabelen toegevoegd worden in Bitbucket.

In dit voorbeeld worden Bitbucket-pipelines geïmplementeerd in deze omgevingen wanneer er code wordt toegewezen aan een functie-branch. Production-us-west-2, Production-us-east-1 en Production-ca-central-1 zijn productieomgevingen die overeenkomen met AWS-omgevingen. Bitbucket-pipelines worden in deze omgevingen geïmplementeerd wanneer er code vanuit een functie-branch via een pull request wordt samengevoegd in de mainline.

Screenshot van Bitbucket Pipelines

Maak in Launch Darkly een functievlag voor het project. Selecteer de testomgeving en pas de instellingen voor de functievlag aan. In de screenshot hieronder is de functievlag ingesteld om in het testgebied standaard als true terug te keren. Als een specifieke gebruiker, AtlassianTestUser@atlassian.com, een verzoek indient, keert de functievlag als false terug. Op deze manier kan de specifiek genoemde gebruiker, zoals testgebruikers in een systeemtestsuite, de code op één manier laten uitvoeren, terwijl normale gebruikers in dezelfde omgeving de code anders laten uitvoeren.

Dit gedrag kan per omgeving worden aangepast. Met functievlaggen kan een ontwikkelaar nieuwe code implementeren in alle regio's, terwijl de code alleen in bepaalde omgevingen kan worden uitgevoerd. In het geval van deze demo is de vlag ingesteld om false terug te geven in Staging en in alle drie productieomgevingen. De nieuwe code wordt alleen uitgevoerd in de testomgeving.

Screenshot gebruikerstargeting

Pak de SDK-sleutels voor elke omgeving van Launch Darkly. Ga dan naar Bitbucket en voeg repository-variabelen toe aan elke repository die deze vlag gebruikt. De onderstaande screenshot laat zien dat er vijf variabelen in de repository zijn toegevoegd. ld_test_env bevat de Launch Darkly SDK-code voor de testomgeving. ld_staging_env bevat de Launch Darkly SDK-sleutel voor de staging-omgeving. Deze variabelen in de repository worden later verwijzingen in het bestand bitbucket-pipelines.yml voor de repository.

SDK-sleutels

De SDK-sleutelwaarden kunnen verwijzingen zijn in het bitbucket-pipeline.yml-bestand van de repository nadat de SDK-sleutels zijn toegevoegd als variabelen in de repository. STACK_PARAMETERS is toegevoegd aan de implementatiestap voor production-ca-central-1 in het fragment hieronder. STACK_PARAMETERS stuurt de waarde van de bijbehorende SDK-sleutel naar het bestand AWS CloudFormation Template.yml als parameter.

- pipe: atlassian/aws-sam-deploy:1.2.0
  variables:
    AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
    AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    AWS_DEFAULT_REGION: 'ca-central-1'
    STACK_NAME: 'OpenDevOpsSubmitImage'
    CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
    TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
    WAIT: 'true'
    DEBUG: 'true'
    S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
    SAM_TEMPLATE: 'build/template.yaml'
    STACK_PARAMETERS: '[{
      "ParameterKey": "LaunchDarklySDKKey",
      "ParameterValue": "${ld_prod_cac1_env}"
    }]'

Voeg een sectie Parameters toe met LaunchDarklySdkKey van het type String aan de sectie Parameters van het template.yml-bestand van de repository. Deze parameter ontvangt de waarde van de LaunchDarklySdkKey STACK_PARAMETER set in het bestand bitbucket-pipelines.yml.

Parameters:
  LaunchDarklySDKKey:
    Type: String

Werk ook de AWS Lambda-bron bij voor de functie SubmitImage in het sjabloon.yml-bestand. Voeg LaunchDarklySDKKey toe als omgevingsvariabele.

Resources:
  SubmitImageFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: submitImage/
      Handler: submit-image
      Runtime: go1.x
      Tracing: Active # https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html
      Policies:
        - AmazonDynamoDBFullAccess
        - AmazonS3FullAccess
      Events:
        CatchAll:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /submit-image
            Method: GET
      Environment:
        Variables:
          LaunchDarklySDKKey:
            Ref: LaunchDarklySDKKey

De omgevingsvariabele LaunchDarklySDKkey wordt zichtbaar in de AWS Lambda-console nadat Bitbucket-pipelines in de omgeving geïmplementeerd zijn. Deze waarde van deze sleutel is uniek voor de omgeving. De omgevingsvariabele LaunchDarklySDKKey in Test zal bijvoorbeeld anders zijn dan in Production-us-west-2.

Screenshot omgevingsconfiguraties

SubmitImage is een AWS Lambda, geschreven in Go. Importeer de volgende afhankelijkheden om Launch Darkly with Go te gebruiken.

"gopkg.in/launchdarkly/go-sdk-common.v2/lduser"
ld "gopkg.in/launchdarkly/go-server-sdk.v5"

Voeg een functie toe om tijdens runtime de waarde van de functievlag op te halen uit Launch Darkly.

func getLaunchDarklyFlags(username string) (bool, error) {
  client, _ := ld.MakeClient(os.Getenv("LaunchDarklySDKKey"), 5 * time.Second)
  flagKey := "SubmitImageDemoFeature"

  userUuid, uuidErr := uuid.NewRandom()
  if uuidErr != nil {
    return false, uuidErr
  }

  var user lduser.User
  if(username == "") {
    user = lduser.NewAnonymousUser(userUuid.String())
  } else {
    user = lduser.NewUser(username)
  }

  showFeature, _ := client.BoolVariation(flagKey, user, false)

  if showFeature {
    return true, nil
  } else {
    return false, nil
  }
}

Roep de functie aan met een lege tekenreeks om de standaard vlagwaarde te achterhalen, of met een e-mailadres van de gebruiker om de doelwaarde te achterhalen. De hierboven getoonde configuratie moet true geven voor de anonieme gebruiker en false voor de gebruiker AtlasianTestUser@atlassian.com.

flagVal, flagErr  := getLaunchDarklyFlags("")
  if flagErr != nil {
    return "", flagErr
  }
  fmt.Println("DEMO flagVal for anonymous user: ", flagVal)

  flagVal, flagErr  = getLaunchDarklyFlags("AtlassianTestUser@atlassian.com")
  if flagErr != nil {
    return "", flagErr
  }
  fmt.Println("DEMO flagVal for AtlassianTestUser@atlassian.com: ", flagVal)

Ga nadat je de code hebt uitgevoerd naar de AWS CloudWatch-logboeken om te controleren of de juiste vlagwaarden worden opgehaald.

Screenshot logboekgebeurtenissen
Doelregels kopiëren

Ga naar de beheerdersinstellingen en vervolgens naar de API-sleutels voor een lijst van de API-sleutels voor elke omgeving. Deze api-sleutels worden teruggestuurd naar split tijdens API-aanroepen in code om de juiste versie van een split te krijgen. In deze handleiding worden de sleutels aan de kant van de Server gebruikt voor elke omgeving.

Beheerdersinstellingen

Ga naar je Bitbucket-repository, vervolgens naar Repository-instellingen, dan Repository-variabelen, en voeg variabelen toe voor elke API-sleutel.

Repository-variabelen in de repository-instellingen

Bewerk het bestand bitbucket-pipelines.yml en voeg STACK_PARAMETERS toe aan de implementatiestap van AWS SAM. Dit gebeurt per omgeving. Het YAML-fragment hieronder toont de implementatiestap voor de TEST-regio, in AWS US-WEST-1. Daarom verwijst de stap naar de bovenstaande repositoryvariabele split_test_env. Gebruik de juiste repositoryvariabele voor elke omgeving.

- pipe: atlassian/aws-sam-deploy:1.2.0
  variables:
    AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
    AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    AWS_DEFAULT_REGION: 'us-west-1'
    STACK_NAME: 'OpenDevOpsSubmitImage'
    CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
    TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
    WAIT: 'true'
    DEBUG: 'true'
    S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
    SAM_TEMPLATE: 'build/template.yaml'
    STACK_PARAMETERS: '[{
      "ParameterKey": "SplitIOSDKKey",
      "ParameterValue": "${split_test_env}"
    }]'

Bewerk het template.yml-bestand van AWS CloudFormation en voeg een sectie Parameters toe die verwijst naar de Split SDK-sleutel.

Parameters:
  SplitIOSDKKey:
    Type: String

Voeg in het sjabloon.yml-bestand een sectie Omgeving toe aan elke AWS Lambda-bron die toegang nodig heeft tot Split. Deze handleiding demonstreert

Environment:
  Variables:
    SplitIOSDKKey:
      Ref: SplitIOSDKKey

Importeer de volgende afhankelijkheden in het Go-bestand dat de Split SDK gaat gebruiken.

"github.com/splitio/go-client/v6/splitio/client"
"github.com/splitio/go-client/v6/splitio/conf"

Deze functie maakt een client aan en haalt de functievlagwaarde op voor de 'SubmitImageDemoSplit' die gemaakt is in de Split UI. Er is maar één parameter voor nodig, namelijk de gebruikersnaam.

func getSplitIOFlag(username string) (string, error) {
  splitIOSDKKey := os.Getenv("SplitIOSDKKey")

  cfg := conf.Default()
  factory, err := client.NewSplitFactory(splitIOSDKKey, cfg)
  if err != nil {
    fmt.Printf("SDK init error: %s\n", err)
    return "", err
  }

  splitClient := factory.Client()
  err = splitClient.BlockUntilReady(10)
  if err != nil {
    fmt.Printf("SDK timeout: %s\n", err)
    return "", err
  }

  treatment := splitClient.Treatment(username, "SubmitImageDemoSplit", nil)
  fmt.Printf("SPLIT_DEMO treatment is %s, username is %s\n", treatment, username)

  return treatment, nil
}

Roep de functie op met een e-mailadres. In dat geval pakt someRandomUser@atlassian.com de standaardwaarde van de functievlag op, aangezien deze geen onderdeel is van een lijst met toelatingen die gekoppeld is aan de functievlag. AtlassianTestUser@atlassian.com pakt de waarde op van de functievlag die gekoppeld is aan de lijst met toegestane personen waarvan deze onderdeel is.

Kijk naar de uitvoer in de AWS CloudWatch-logboeken nadat de code is uitgevoerd. Houd er rekening mee dat de functievlag als 'uit' terugkeert wanneer deze wordt geopend door someRandomUser@atlassian.com, en als 'aan' wanneer AtlassianTestUser@atlassian.com deze opent.

Logbestandgebeurtenissen

De conclusie ...

De functievlaggen van Launch Darkly kunnen eenvoudig worden geïntegreerd in een toepassing die via Bitbucket-pipelines geïmplementeerd wordt. Met functievlaggen kunnen ontwikkelaars de uitvoering van de geïmplementeerde code controleren. Dit kan ervoor zorgen dat er sneller gereageerd kan worden op implementaties met fouten, waardoor de gevolgen voor gebruikers worden beperkt. Neem de tijd om een installatie van Bitbucket en Launch Darkly te starten, en test de mogelijkheden voor je team.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Deel dit artikel

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Toelichting DevOps

DevOps-community

Toelichting DevOps

DevOps-leertraject

Afbeelding van kaart

Gratis aan de slag

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up